Windows Server など Windows が重い場合に確認事項

# 基本この 3 つのリソースの利用状況が肝です

- CPU
- メモリ
- ディスク I/O

「Windows が重い」は言い換えると「何かに負荷が掛かっていて、処理の完了までに時間が掛かっている」状態です。

Windows 10 でしたら、タスクマネージャーの `パフォーマンス` タブを見る事で負荷状況を確認できるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/8a3dd4ea-5468-872c-07f8-a16dbd9d6968.png)

Windows Server の場合は、ディスク が表示されない場合があります。というか、表示されているものを見たことがありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/1593bdad-f69e-0485-017d-d3a21facc38f.png)

Windows Server で、ディスク を表示する方法が見つかりました。参考記事より転記します:

> close Taskmanager
> open a `cmd.exe` as admin
> run `diskperf -Y`
> close cmd.exe and run Taskmgr

参考: [hard drive - How to see disk usage graph on Windows Server 2012 - Server Fault](https://serverfault.com/questions/738640/how-to-see-disk-usage-graph-on-windows-server-2012)


このタスクマネージャーは「負荷の表現方法」が秀逸であり、改善が必要な項目は 100% に近づくような表現が意図されています。
そこで、負荷を減らす方向に目が行きます。

素人判断ですが、

## CPU の例

### CPU or パソコン / サーバーを買い替える

CPU の性能を数値化する方法として、ベンチマークが出したスコア (得点) を利用する方法が挙げられます。
PassMark というサイトでは数多くの CPU のベンチマーク結果を網羅しているようで、私が CPU を比較する際の参考にしています。

`i5-7500 passmark` のようなキーワードで Google 検索すると www.cpubenchmark.net のサイトがヒットすると思います。

- [PassMark - Intel Core i5-7500 @ 3.40GHz - Price performance comparison](https://www.cpubenchmark.net/cpu.php?cpu=Intel+Core+i5-7500+%40+3.40GHz&id=2910)

2022/06/08 時点では `6,058` でした。

この数値を高いと感じるか低いと感じるかは、自分の感覚と結び付けておくのが良いでしょう。

私の感覚では `1,000` 以下は事務にも使えません (利用者から苦情が出ました)。 

今まで出会ったパソコンの中で最低値を記録したのが `Intel Atom 230 @ 1.60GHz` の `295` です。EPSON Endeavor NP11 (Windows XP Home) という斬新な形状を持ったパソコンで、内容に期待していたものですが… 動作は非常に重く、利用者の期待に応えることはできませんでした。

`2,500` までは「遅いと感じられる」 `3,500` に至ってようやく「マシな反応速度」

という感じで… CPU の性能を何とか可視化しようと長年追求していると、このような形で着地点を見つけることができました。

### 負荷の高いプロセスの優先度を下げる

Windows はラウンドロビン方式で、スレッドの実行順序をスケジュールするようです。端的には、優先順位の高い順から CPU の実行時間を割り当てていきます。

![2022-06-08_12h06_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/0303f142-db49-e485-1601-690dc7a33de1.png)

逆にいうと、優先度の高いスレッドがスリープ状態に入らないと、より優先度の低いスレッドには実行の機会がまったく巡ってきません。

参考:
- [優先度のスケジュール設定 - Win32 apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/win32/procthread/scheduling-priorities)
- [ラウンドロビン・スケジューリング - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%83%AD%E3%83%93%E3%83%B3%E3%83%BB%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0)

#### 余談: CPU 使用率 100% の状態とは

Windows NT はプリエンプティブ・マルチタスク方式のため 1 秒間に実行できるスレッドの数が決まっています。
参考記事によると 15.6 ミリ秒ごとに切り替えを発生するようです。この数値をもとにすると 1,000 [ミリ秒] ÷ 15.6 [ミリ秒 / スレッド] で約 64 スレッド / 秒です。

この値を元に想定すると…

- CPU 100% のプロセスが 1 個ある場合は、1 秒間に 15.6 ms × 64 回の処理の機会が回ってくるが、
- CPU 100% のプロセスが 64 個ある場合は、プロセスあたり 1 秒間に 15.6 ms × 1 回の処理の機会しか回ってこない。

UI の反応速度への悪影響を検討するため、同じ優先度の explorer のプロセス 1 個を追加すると…

- CPU 100% のプロセスが 1 個 + explorer 1 個であれば、explorer は 1 秒間に 15.6 ms × (0 ~ 32) 回 (0% ~ **50%** の時間) の処理の機会が得られる
- CPU 100% のプロセスが 64 個 + explorer 1 個であれば、explorer は 1 秒間に 15.6 ms × (0 ~ 1) 回 (0% ~ **1.5%** の時間) の処理の機会が得られる

CPU 100% のプロセスが複数あると Windows の UI の反応が激重になります…

参考: [ASCII.jp：マルチコアCPUの消費電力はスケジューリングで変わる？ (1/4)](https://ascii.jp/elem/000/000/672/672088/)

![2022-06-08_12h09_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/eea68b91-b4aa-2eb7-5edd-4776ad9b32d9.png)

> 前述したタイマー割り込みの1周期(15.6ミリ秒)が、3Quantumに相当すると定義されている。
> 基本的に、Windows 7などクライアント系のWindowsでは、タイムスライスは6quantumであり、サーバー系では36Quantumとなっている。
> クライアント系での割り当ては「Short」と呼ばれ、サーバー系の割り当ては「Long」という。
> これはレジストリで制御されるパラメーターであり、クライアント系でもタイムスライス割り当てをLongに設定することが可能だ。

Long … 15.6 ÷ 3 × 36 → 187.2 ms (約 5.3 スレッドの実行 / 秒)
Short … 15.6 ÷ 3 × 6 → 31.2 ms (約 32 スレッドの実行 / 秒)

### 負荷の高いプロセスを強制終了する

## メモリの例

- 物理的なメモリ容量を増量する
- 大きなサイズのページングファイルを固定確保しておく

例:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/3e69bc34-0bbe-bed4-32d2-52cebeb84b7b.png)

## ディスク I/O の例

- 負荷が掛かっている原因を特定する

ディスク I/O が発生する一般的なユースケースは「ファイルの読み書き」が想定できます。

リソースモニターを使用しましょう。ディスクの `合計 (バイト/秒)` を降順ソートする事で、負荷をある程度に可視化できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/0badc790-e8d0-5370-4b67-894f6ac03211.png)

通常はリソースモニターで片が付くはずですが… アクセスしているファイル数が膨大の場合、集計処理が追い付かない、フリーズするケースがあります。

そういう場合は [Process Monitor - Windows Sysinternals | Microsoft Docs](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) を用いて、瞬間風速的な計測をする方法があると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/645b48f2-2c72-fd92-cea3-22a5966cf09c.png)

ただ、このツール自体、CPU とメモリに結構な負荷が掛かります。使用に際しては、事前に、テスト環境での操作慣れ等、状況準備をすることをお勧めします。