人類はなぜWindowsにメモリを足さないのか



####概要‐のようなもの

　　メモリ不足は WindowsPCを用いて業務に従事する者の時間を最も多く奪っている要因… 
　と言っても過言ではないが、そのことについて どういう訳か誰も目を向けようとはしない
　　また自分でも 適正なメモリ搭載量について「自作erの経験と勘」以外の説明ができない事
　に今更ながら気づく

　　メモリ不足とは一体何なのか？
「分かりそう」で「分からない」でも「誰も説明できない」この事象について紐解いてみたい
　　（wa3も見てきたが、メモリ不足の解説についての記載が無かった事は確認している）



##○前編　傾向と対策

####~~どうしてこうなった~~状況の整理
　・タスクマネージャーの表示[メモリ使用量]では不足しているようには見えない
　　「性能度外視」なら、もっと少ないメモリ搭載量でも動かせる
　
　・何となくザックリとしたイメージで語っていたのでは、誰も取り合ってくれない
　　「足せばわかる」では全然話にならない

　・「メモリを追加しても効果が出ない」というイメージがある
　　　ディスク性能の不足など、他に存在する支配的なボトルネック要因を潰せていない
　　　
　・メモリ不足の影響はディスクへの連続アクセス（スラッシング）として顕在化する
　　　それを知らなければディスク性能にばかり目を奪われがちになる

　　こんなところだろうか
　　自作PCであれば、原因不明のパフォーマンス低下要因などコンタミさせないんだけど


####メモリ不足とは、どういう事か？

　ググればググるほどわからなくなる　
　　~~Microsoftのコミュニティとか読んだ日にはドツボ確定~~

　　作戦変更 自分の知識の中で使える物はないか探ってみる
　　　メモリ不足によるパフォーマンスの低下（スラッシングの発生）はページファイルへ
　　　のスワップ
　　　ならばハードフォールトを追えれば、発生状況くらいは掴めるのではないか？

　　リソースモニタのグラフ [ハードフォールト] で確認できる模様
　　詳しくはDOS/V POWER REPORTの記事があるので、そちらを参照

　　http://www.dosv.jp/other/1006/09.htm

　　自前環境の検証でもメモリ搭載量が 4Gbyteと16GbyteのPCではグラフの振れ方が全然違う
　　速度低下の体感とも概ね一致する
　　この辺は各自で試してみてほしい



####リソースモニタなんて使わせないよ？

　ああ、それを閲覧するには [管理者権限] が必要だった
　よろしい、ならばperfだ

```
  コマンドプロンプト
　typeperf "\Memory\Pages/sec"
```

　なお、サーバ管理では20/秒を超えるようならメモリ不足を疑うらしい
　

####メモリ増設から先に検討すべき理由

・SSDには書き換え寿命がある
　　ほぼ書き換え寿命無制限なメモリの不足を補うために、SSDの寿命を消費するのか？
　　レンタルサーバーなら、SSDでもお構いなしにスワップごりごり書き込むけどｗ
　　　　
・ディスクIOPSはベストエフォート
　　その名の通りI/Oの性能を意味する
　　そして高性能なSSDほど、I/O帯域を簡単に埋め尽くす
　　（埋め尽くされたのは I/Oバスが受付可能な単位時間当たり コール回数の方かも）
　　メモリ上で完結可能な処理を、I/Oバスへ垂れ流して更に圧迫することになる
　　

####前半の要点

　　**・動作状況の確認もせずにメモリ過多／不足を決め付けるのはナンセンス**


　おつかれさまでした
　ここまで読めば、何となくザックリとメモリ不足が理解できると思います

　でもまだタスクマネージャー [メモリ使用量] の謎は解けていないし、自分が納得しない
　何より、こんなペラいとQiita投稿に耐えられる内容ではないし…

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　後編につづく


##○後編　技術的考察

　そんな大風呂敷で大丈夫か？

　　使える物は無さげなので、電卓片手に泥臭い調査を開始する（ｗ



####分かったこと

　・[メモリ使用量] はワーキングセット合計と一致　…する時もあれば、しない時もある
　　　一定間隔ごとにページの事前解放（アクセス頻度の低い共有メモリの解放？）が走る

　・コミットはページファイルから先に埋めていく？
　　　いや、その方が合理的だけど…

　・プロセス毎のワーキングセットメモリ使用量は、他のPCと同じ値はにならない？
　
　・プライベート － アクティブ ＝ 圧縮
　　　なにゆえ圧縮？


####その幻想をぶち壊す
　　ページファイル ≠ 仮想メモリ

　　仮想メモリ (virtual memory)
　　　https://wa3.i-3-i.info/word1715.html
　　　そんなふうに考えていた時期が俺にもありました

　　　ピヨピヨ先生ごめんなさい
　　　でも、それでは仮想メモリの「参照の局所性」を説明できないんです


####Re:ゼロから始める仮想メモリ

　　いちプロセスがOSから貸し与えられる仮想メモリマップ
　　@TAKUYA-110さん お借りします
![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1698056/066a9e19-9c29-ab76-19e9-ce3a1c6c9b8c.png)



　　　CPU側から見たらどうなる？

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1698056/7917a21c-0181-258f-1491-17b247ad539c.png)
　　　　数百のプロセスが動作する広大な仮想メモリ空間（のつもり）
　　　　~~あちこちリークしてるように見えるのが、いかにもそれっぽい~~



　それでは ご覧いただこう



```
　コマンドプロンプト
　typeperf "Process(_Total)\Virtual Bytes"
```
　おわかりいただけただろうか


####つまり、広大な仮想メモリ空間のように見える「張りぼて」

　CPUは既に広大なメモリ空間を運用してるが、OSはそこまで大量のメモリ実装を許さないし
　それは数Gbyteの実装メモリと 幾らかのページファイルと 参照の局所性で支えられている
　　…メモリが足りなければ、その分ハードフォールトを連呼されることになるが
　　
　　　　
####うん、書いてた…

　ページング方式 - Wikipedia
　https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E6%96%B9%E5%BC%8F
　いろいろ調べた結果 Wikipedia の内容を多少は理解できるようになっていたが、結果として
　後編に書いた事は、Wikipedia の内容をぼんやり理解する為の補完みたいになってしまった…

####タスクマネージャー [メモリ使用量] グラフの正体

　ページの事前開放でワーキングセットとも どんどん合わなくなっていくし、何だろこれ…
　広大な仮想メモリ空間「張りぼて」を倒壊させないよう安定度合を見る為のものだろうと
　解釈してみる
　（ページの事前解放がメモリ使用量の急増に間に合うのか？ とか調べるのには有効）
　なお、CPUやディスクのグラフのようにパフォーマンスに関わる値は得られない
　



####で、メモリはどれくらい足せばいいの？


　計算か何かで参照の局所性を割り出すことができれば、判かるのかも（ムリだー
（事前予測でどのくらい積めばいいのか判断するには限界があるというのを今回再確認した）

　メモリは8Gbyteあれば足りるのか？とか 運用するアプリと相談しなければ見えない話だし
　\Memory\Pages/secならアプリ側でもモニタリングできるでしょ？
　それならアプリ側で個別にメモリ不足の警告を出すようにしてはもらえないだろうか… 
　と書いてみる

　~~もうやめてください！　PCに使われてる子もいるんですよ！~~
　世の中PCに詳しい人ばかりではないのです

　
ここまで駄文にお付き合い下さりありがとうございました


　一番いいPCを頼む