Il processo viene eseguito più lentamente come attività pianificata rispetto all'interazione


41

Ho un'attività pianificata che richiede molta CPU e IO, e impiega circa quattro ore per l'esecuzione (creazione del codice sorgente, se sei curioso). L'attività è uno script Powershell che genera vari sottoprocessi per svolgere il proprio lavoro. Quando eseguo lo stesso processo in modo interattivo da un prompt di Powershell, come lo stesso account utente, viene eseguito in circa due ore e mezza. L'attività è in esecuzione su Windows Server 2008 R2.

Quello che voglio sapere è perché ci vuole molto più tempo per essere eseguito come attività pianificata, più di un'ora in più. Una cosa che ho notato è che l'utilità di pianificazione viene eseguita con priorità inferiore alla normale, quindi quando viene avviata l'attività eredita la stessa priorità ridotta. Tuttavia, ho aggiornato lo script per riportare la priorità del processo Powershell su Normale e impiega ancora altrettanto tempo.

Qualcuno ha un'idea di cosa potrebbe essere diverso tra i due scenari? Ho escluso le differenze nel carico di processore e I / O: questa attività è l'unica cosa per cui il sistema viene utilizzato, quindi non c'è nient'altro in esecuzione che possa competere per le risorse.


Nessun aggiornamento? Sono molto curioso di vedere cosa riesci a trovare.
mfinni,

Ho trovato quello che penso fosse la causa; vedi la mia risposta qui sotto.
Charlie,

A partire da Windows 10 Fall Creators, questo problema persiste e la soluzione alternativa di @Jason Mathison (modifica del file .xml dell'utilità di pianificazione) è ancora la soluzione migliore.
BSalita,

Risposte:


36

Sembra che ci sia qualcosa di più della semplice "normale" procedura al lavoro qui. Come ho notato nella domanda, l'utilità di pianificazione per impostazione predefinita esegue l'attività con priorità inferiore alla normale. Questa domanda su StackOverflow descrive come correggere qualsiasi attività da eseguire con priorità normale, ma la correzione lascia ancora una cosa leggermente diversa: priorità di memoria. La priorità di memoria era una nuova funzionalità per Windows Vista ed è descritta in questo articolo Technet . Puoi vedere la priorità della memoria usando Process Explorer , che è uno strumento indispensabile per qualsiasi amministratore o programmatore.

Ad ogni modo, anche con la correzione della priorità dell'attività pianificata, la priorità di memoria dell'attività è impostata su 4, ovvero un livello inferiore all'impostazione normale di 5. Quando ho aumentato manualmente la priorità di memoria dell'attività fino a 5, le prestazioni erano attive alla pari con l'esecuzione del processo in modo interattivo.

Per informazioni sull'aumento della priorità, vedere la mia risposta a una domanda StackOverflow correlata sulla priorità IO; l'impostazione della priorità di memoria viene eseguita in modo simile, tramite NtSetInformationProcess, con PROCESS_INFORMATION_CLASSset su ProcessMemoryPriority(il valore è 39 o 0x27). Potrei creare un'utilità gratuita che può essere utilizzata per impostare questo, se altri ne hanno bisogno e non hanno accesso agli strumenti del programmatore.

EDIT: sono andato avanti e ho scritto un'utilità gratuita per l'interrogazione e l'impostazione della priorità di memoria di un'attività, disponibile qui . Il download contiene sia il codice sorgente che un file binario compilato.


È possibile visualizzare la priorità della memoria in Process Explorer facendo doppio clic sul nome dell'eseguibile, aprendo la scheda "Prestazioni" e sotto "Memoria fisica" è presente una voce per "Priorità memoria"
Moshe,

17

Il problema è che il processo inizia con una bassa priorità di I / O e una bassa memoria. Il modo più semplice per verificarlo è con Process Explorer di sysinternals. Se si esaminano le proprietà di uno qualsiasi dei processi generati da questa attività pianificata, si noterà che ha una priorità I / O di bassa e priorità di memoria di 2.

Ecco la soluzione a questo problema:

  1. Crea l'attività
  2. Fare clic con il tasto destro sull'attività ed "esportarla"
  3. Modifica il file task.xml che hai appena esportato
  4. Troverai una linea simile a <Priority>7</Priority>
  5. Modificare il valore su una priorità normale (tra 4-6). Una tabella dei valori potenziali: proprietà TaskSettings.Priority
    • Un valore di 4 avrà la stessa I / O e priorità di memoria di un processo interattivo. I valori di 5 e 6 avranno una priorità di memoria inferiore
  6. Nell'utilità di pianificazione, eliminare l'attività inizialmente creata
  7. Nell'utilità di pianificazione, nell'area azioni, importare l'attività dal file XML

Purtroppo non è possibile modificare la priorità iniziale delle attività pianificate dalla GUI.


Grazie per il suggerimento La priorità di processo regolare e la priorità di I / O ne fanno sicuramente parte e l'altra parte è la priorità di memoria. Vedi la risposta accettata per maggiori informazioni.
Charlie,

Dopo aver esportato l'attività in un file XML, potrebbe essere necessario modificare la codifica dei caratteri da Unicode a ANSI. In Windows Server 2008 R2, l'esportazione è un file Unicode e quando si tenta di reimportarlo, viene visualizzato il messaggio di errore The format of the task is not valid. The following error was reported: (1,2)::. Salvare il file su ANSI risolverlo per me.
Erik Anderson, il

Grazie mille, questa è davvero la soluzione migliore. Come menzionato nei documenti, puoi anche impostare la Priorità ancora più in alto (almeno fino a 1), per ottenere una priorità della CPU più alta.
Rune Aamodt,

Per chiunque pensi che potresti essere in grado di modificarlo nel registro, non preoccuparti, non sembra essere lì in un modo ben modificabile.
Nik,

1

Se lo imposti per essere eseguito come attività pianificata come Utente X e quindi accedi come Utente X prima che si supponga che venga eseguito, dovrebbe aprirsi una finestra nella sessione quando viene eseguito, verrà eseguito nella sessione.

Se lo fai, ci vuole un periodo di tempo più lungo o più breve? Non so cosa significhi, ma potrebbe essere un utile fattore di differenziazione. Potrebbe esserci un po 'di accesso alla rete dell'account utente al momento dell'accesso, ma non durante l'esecuzione come attività pianificata, che deve scadere e fallire? Il comportamento è diverso se si crea un nuovo account utente e lo si esegue come attività pianificata con tale account?

Un'altra idea: quando lo si esegue come attività pianificata, ora che è stata fissata la priorità sullo script, tutti i processi secondari vengono eseguiti come Normali o Sotto-Normali?


1
I sottoprocessi sicuramente funzionano come Normali, come verificato da procexp / taskman. Penso che la cosa di rete non lo sia, perché non fa alcun accesso sostanziale alla rete, ma lo ricontrollerò. L'idea di eseguire l'attività come interattiva è anche interessante, ci proverò.
Charlie,

Il processo stesso non deve fare alcun accesso di rete di cui tu sia a conoscenza perché ciò costituisca un problema. Leggi questo post di Sysinternals e scopri come qualcosa di apparentemente non correlato può causare blocchi / lentezza. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni

1

Forse le attività pianificate vengono eseguite con una priorità inferiore per impostazione predefinita.

Utilizzare prioper forzare una priorità più alta.


Hai ragione che corrono con priorità più bassa, ma come ho già detto, l'ho già spiegato. A meno che non ci sia una priorità diversa dalla priorità del processo che non conosco.
Charlie,

0

all'inizio - puoi usare più della normale priorità (ad esempio alta)

in secondo luogo, devi capire che la sessione in primo piano richiede alcune risorse, principalmente l'IO del disco rigido e la memoria, quindi l'attività pianificata viene ridotta. per un benchmark chiaro devi disconnetterti mentre lo script PowerShell è in esecuzione

e inoltre puoi provare ad aggiungere più memoria / utilizzare ramdrive / split work su diversi hard disk per velocizzare i processi


Grazie per le idee La macchina ha molta memoria e capacità di I / O, il problema è solo che le cose vanno più lentamente come attività pianificate di quanto non facciano interattivamente. Quando l'attività pianificata è in esecuzione, di solito non esiste una sessione di accesso interattiva, quindi penso che non sia nemmeno questo il problema.
Charlie,

0

Questa domanda è di qualche tempo fa e per Windows Server 2008R2. Ho avuto la stessa domanda, ma per Windows 10. Su Windows 10 (verificato su 1703 e 1809), basta impostare la "Priorità" su 4 tramite xml importato per darti la stessa Priorità di base, Priorità dinamica, Priorità I / O e Memory Priority come processo avviato in modo interattivo.


0

Ecco uno snippet di PowerShell per impostare la priorità (funziona in una sessione di PowerShell remoto!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.