質問: redhat7.2でとあるベンダのDBを使用しています。 DBの動きとしては、新規SQL(insert)が発行されコミットされると、分毎に分割されたファイルに結果が格納されます。(ディスクにwriteされます) ※例:20190101_000100.txt,20190101_000200.txt,20190103_000100.txtという感じで保存されます このときDBの仕様では直近更新されたファイルをプロセスのメモリ上に保有します。そのため、チューニングで保有するファイルの数を変更するとプロセスが確保するメモリの量が変動します。 ※例:100MBのファイルを60分間メモリに確保すると、100MBx60分=6GBのメモリを消費する --- この時、以下の実験を行いました。 実験1 --- DBサーバに500GBのメモリを割り当て400GBのデータを書き込みました。この時、プロセスが保有するファイル数の上限を∞にし、プロセスが保有するメモリ(VSZ/RSS)とcache(ページングキャッシュ)を確認しました。 ### 結果1 すると結果として、以下のようにDBに書き込んだ量分のRSSとcached(freeコマンドで見れるページキャッシュ)が同じぐらいの値で推移をしました。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/8e94dc9c5015a98a7bac2d9201d8e0be.png) 実験2 --- 続いて、プロセスが保有するファイル数の上限を2000程度にしテストを行いました。 ※メモリを減らしていますがそこは無視してください(128GB) ※データの書き込み自体は128GB程度おこなっている ### 結果2 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/91b44582433a01d9cee6b6be28bb605d.png) はじめのほうは変なデータが入っているので無視して頂きたいのですが、 結論としては以下のとおりです。 * プロセスが保有するファイル量を制限したのでRSS/VSSは軒並み下がった * ページキャッシュは書き込んだデータ分保有している 質問 -- 1. Linuxでfreeコマンドを叩くと物理メモリの内訳が見れます。 私の理解では、ここのうちのusedがプロセスが使用しているメモリサイズ、cacheがディスク書き込み時/読み込みを高速化するためのページキャッシュのメモリサイズです。 ``` total used free shared buff/cache available Mem: 31211 3456 24394 217 3360 27051 Swap: 0 0 0 ``` 結果1をみると使用しているメモリ量がRSS=VSZ=ページキャッシュとなっております。RSSとVSZは同じプロセスのものを指しているのでいいのですが、RSSとページキャッシュが同じなのが理解できません。 ※物理メモリ上、プロセスが見れるデータ領域とVFSのページキャッシュ領域は違うのでは??? ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/8e94dc9c5015a98a7bac2d9201d8e0be.png) これは、物理メモリ上にロードされるファイルは実は一箇所にしか載っておらず、プロセスの仮想メモリもページキャッシュも同じ物理メモリのアドレスを参照しているという動きなのでしょうか? 教えてください。 (エビデンスがあれば合わせて教えていただけますと幸いです)
回答: > > RSSとページキャッシュが同じなのが理解できません。 > > > たまたまじゃないでしょうか? メモリに余裕があれば、ページキャッシュは使い続けますので。 `echo 3 > /proc/sys/vm/drop_caches` でページキャッシュを解放すると、RSS は減らず、Cached だけ減ると思います。