Oricine execută sarcini în Planificatorul de activități Windows va întâlni, mai devreme sau mai târziu, diferențe inexplicabile de execuție. Un script PHP care rulează în 5 minute pe linia de comandă durează brusc 20 de minute atunci când este executat prin Planificatorul de activități Windows. Același utilizator, aceleași permisiuni, același cod - de patru ori mai mult timp de execuție. Ce se întâmpla?
După ore întregi de depanare, sesiuni de Monitorizare procese și nenumărate comparații de configurații, soluția a fost înfricoșător de simplă: Programatorul de activități Windows setează în mod implicit o prioritate mai mică a procesului. Valoarea implicită pentru activitățile din Programatorul de activități este 7 (Sub normal), nu 4-6 (Normal), așa cum era de așteptat. Această diferență aparent mică poate duce la o degradare masivă a performanței în operațiunile care necesită multe I/O.
Nivelurile de prioritate Windows în detaliu sunt:
| Valoare | Prioritate | Descriere |
|---|---|---|
| 0 | În timp real | Prioritate maximă (atenție!) |
| 1 | Ridicat | Prioritate ridicată |
| 2-3 | Peste normal | Despre Normal |
| 4-6 | Normal | Standard pentru procese interactive |
| 7 | Sub normal | IMPLICIT în Programatorul de activități |
| 8-9 | Sub normal | Chiar mai jos |
| 10 | Inactiv | Cea mai mică prioritate |
Problema priorității în planificarea sarcinilor este multistratificată: când exportați o sarcină și vă uitați la XML, veți vedea adesea nu Setare de prioritate. Windows va utiliza apoi în mod silențios valoarea implicită 7. Interfața grafică afișează această valoare în timpul exportului, dar nu este stocată explicit în sarcină. Prioritatea mai mică nu numai că duce la un timp CPU mai mic, dar și:
- Operațiuni I/O pe disc limitate
- Prioritate mai mică a rețelei
- Cache slabă a sistemului de fișiere
- Întârzieri în accesul la baza de date
Chiar dacă utilizați același utilizator și activați opțiunea „Executare cu cele mai mari privilegii”, sarcina se execută într-un alt mediu Windows, stație/desktop, cu priorități diferite. Pentru a identifica problema, puteți utiliza PowerShell pentru a lista toate sarcinile cu prioritățile lor reale.:
38b7fa6c77dc344401485cd338ea4128
Aproape toate sarcinile mele au rulat cu prioritate 7. Acum corectăm în mod specific prioritatea mai multor sarcini simultan:
38b7fa6c77dc344401485cd338ea4128
După setarea priorității la 4 (În mod normal) scriptul meu PHP a rulat din nou în cele 300 de secunde așteptate. Dacă ați configurat sarcini cu un anumit cont de utilizator, puteți specifica cu ușurință acest lucru și în linia 10, după cum urmează.:
38b7fa6c77dc344401485cd338ea4128