Windowsタスクスケジューラでジョブを実行する人は、遅かれ早かれ説明のつかない実行時間の違いに遭遇するでしょう。コマンドラインでは5分で実行できるPHPスクリプトが、Windowsタスクスケジューラで実行すると突然20分もかかることがあります。同じユーザー、同じ権限、同じコードなのに、実行時間が4倍もかかってしまうのです。一体何が起こっていたのでしょうか?
何時間ものデバッグ、プロセスモニターセッション、そして数え切れないほどの設定比較を経て、解決策は驚くほどシンプルでした。Windowsのタスクスケジューラは、デフォルトでプロセスの優先度を低く設定していました。タスクスケジューラにおけるタスクのデフォルト値は 7 (正常以下)、 4-6 (正常)予想通りです。この一見小さな差は、I/Oを集中的に使用する操作では大幅なパフォーマンス低下につながる可能性があります。
Windowsの優先度レベルの詳細は:
| 価値 | 優先度 | 説明 |
|---|---|---|
| 0 | リアルタイム | 最優先(注意!) |
| 1 | 高い | 優先度が高い |
| 2-3 | 正常範囲以上 | ノーマルについて |
| 4-6 | 普通 | 対話型プロセスの標準 |
| 7 | 正常以下 | タスクスケジューラのデフォルト |
| 8-9 | 正常以下 | さらに低い |
| 10 | アイドル | 最低優先度 |
タスクスケジューリングにおける優先順位の問題は多層的である。タスクをエクスポートしてXMLを見ると、 いいえ 優先度設定。Windowsはデフォルト値を暗黙的に使用します。 7. GUIはエクスポート中にこの値を表示しますが、タスクに明示的に保存されるわけではありません。優先度を低くするとCPU時間が短くなるだけでなく、:
- スロットルされたディスクI/O操作
- ネットワーク優先度を下げる
- ファイルシステムのキャッシュが不十分
- データベースアクセスの遅延
同じユーザーで「最上位の権限で実行」を有効にしても、タスクは異なる優先度を持つ別のWindowsステーション/デスクトップ環境で実行されます。問題を特定するには、PowerShellを使用して、すべてのタスクとその実際の優先度を一覧表示できます。:
38b7fa6c77dc344401485cd338ea4128
ほぼすべてのタスクが優先的に実行されました 7. 複数のタスクの優先度を一度に修正できるようになりました:
38b7fa6c77dc344401485cd338ea4128
優先順位を設定した後 4 (通常通り)PHPスクリプトは予想通り300秒で再度実行されました。特定のユーザーアカウントでタスクを設定している場合は、10行目で以下のように簡単に指定できます。:
38b7fa6c77dc344401485cd338ea4128