Bárki, aki feladatokat futtat a Windows Feladatütemezőben, előbb-utóbb megmagyarázhatatlan futásidejű különbségekkel fog találkozni. Egy PHP szkript, ami 5 perc alatt lefut a parancssorban, hirtelen 20 percet vesz igénybe, amikor a Windows Feladatütemezőn keresztül futtatják. Ugyanaz a felhasználó, ugyanazok az engedélyek, ugyanaz a kód – négyszeres futási idő. Mi is történt valójában?
Órákig tartó hibakeresés, Process Monitor munkamenetek és számtalan konfigurációs összehasonlítás után a megoldás ijesztően egyszerűnek bizonyult: a Windows Feladatütemező alapértelmezés szerint alacsonyabb folyamatprioritást állít be. A Feladatütemezőben a feladatok alapértelmezett értéke: 7 (Normális alatt), nem 4-6 (Normális) ahogy várható volt. Ez a látszólag kis különbség hatalmas teljesítményromláshoz vezethet I/O-intenzív műveletek során.
A Windows prioritási szintjei részletesen a következők::
| Érték | Prioritás | Leírás |
|---|---|---|
| 0 | Valós idejű | Legmagasabb prioritás (figyelem!) |
| 1 | Magas | Magas prioritás |
| 2-3 | Normális felett | A Normálról |
| 4-6 | Normál | Interaktív folyamatok szabványa |
| 7 | Normál alatt | ALAPÉRTELMEZETT a Feladatütemezőben |
| 8-9 | Normál alatt | Még alacsonyabb |
| 10 | Tétlen | Legalacsonyabb prioritás |
A feladatütemezés prioritásával kapcsolatos probléma többrétegű: Amikor exportál egy feladatot és megnézi az XML-t, gyakran a következőket fogja tapasztalni: nem Prioritásbeállítás. A Windows ezután csendben fogja használni az alapértelmezett értéket 7. A grafikus felhasználói felület exportálás közben megjeleníti ezt az értéket, de ez nincs explicit módon tárolva a feladatban. Az alacsonyabb prioritás nemcsak kevesebb CPU-időt eredményez, hanem:
- Szabályozott lemez I/O műveletek
- Alacsonyabb hálózati prioritás
- Gyenge fájlrendszer gyorsítótárazás
- Késések az adatbázis-hozzáférésben
Még ha ugyanazt a felhasználót használja és engedélyezi a „Futtatás legmagasabb jogosultságokkal” beállítást, a feladat egy másik Windows állomáson/asztali környezetben fut, eltérő prioritásokkal. A probléma azonosításához a PowerShell segítségével listázhatja az összes feladatot a tényleges prioritásaikkal.:
38b7fa6c77dc344401485cd338ea4128
Szinte minden feladatom prioritással futott 7. Most már konkrétan több feladat prioritását korrigáljuk egyszerre:
38b7fa6c77dc344401485cd338ea4128
Miután beállította a prioritást 4 (Normális esetben) a PHP szkriptem újra lefutott a várt 300 másodpercben. Ha adott felhasználói fiókkal konfiguráltad a feladatokat, akkor ezt a 10. sorban is könnyen megadhatod az alábbiak szerint.:
38b7fa6c77dc344401485cd338ea4128