一部のキャッシュはなぜ削除できないのですか?

一部のキャッシュはなぜ削除できないのですか?

出力は次のとおりですfree -m

              total        used        free      shared  buff/cache   available
Mem:            421         158         153          39         109         195
Swap:             0           0           0

echo 3 > /proc/sys/vm/drop_caches可能なすべてのキャッシュを削除しましたが、buff/cache値はまだ109 MBのままです。このキャッシュは何に保存されていますか?どういうわけかあきらめることができますか?

使用されるシステムはXUbuntu 16.04です。

これらのキャッシュの一部(43MB)はtmpfsで使用できます。

tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=43188k,mode=700,uid=1000,gid=1000)

これにより、解釈の余地がより多くなります。

出力df -mt tmpfs

Filesystem     1M-blocks  Used Available Use% Mounted on
tmpfs                 43     3        40   7% /run
tmpfs                211     1       211   1% /dev/shm
tmpfs                  5     1         5   1% /run/lock
tmpfs                211     0       211   0% /sys/fs/cgroup
tmpfs                 43     1        43   1% /run/user/1000

答え1

tmpfsを埋めると、43MBのみが使用されます。あらかじめメモリを予約しません。しかし:

信じられないか、39Mの「共有」番号は削除できず、すべて「バフ/キャッシュ」としてカウントされます。これには、すべてのtmpfsファイルが含まれます。また、秘密カーネルtmpfs :-)から割り当てられた「共有」メモリも含まれています。これには、「System V 共有メモリ」と特定の種類のメモリが含まれます。グラフィックバッファ

それにもかかわらず、2つの誤差はほぼ相殺される。残りの記憶はどうですか?

Linuxでキャッシュを削除するときは、現在実行中のプログラムにマップされているキャッシュを削除しないように選択します。 これらのマッピングのほとんどはプログラム/ライブラリコードファイルです。

一部のデータファイルもマッピングできます。たとえば、検索ログを実行すると、アクセスログファイルのjournalctl代わりに使用されますsystemdmmap()read()

を使用して残りのキャッシュを確認できますsudo smem -t -m。私は彼らが現在主にプログラムと彼らが使用しているライブラリを実行すると予想しています。

証明する

これを確認するには、次のカーネルコードへのリンクを参照してください。

キャッシュの削除キャッシュされた各 "inode"(ファイル)に対してvalidate_mapping_pages()を呼び出して動作します。

無効化_マッピング_ページ()- inodeのロック解除されたすべてのページを無効にします。

[...]

validate_mapping_pages() は IO アクティビティをブロックしません。ダーティページ、ロックされたページ、書き込み保存ページ、またはページテーブルへのマッピング

「ダーティ」ページ(キャッシュされた書き込み)がある場合、または書き込みが進行中であっても削除または保留されません。これはにも言及されています。ドキュメント/sysctl/vm.txt

ダーティ/書き込み保存ページの場合、invalidate_mapping_pages()はdeactivate_file_page()を呼び出して「リサイクルをスピードアップしようとしています。」私はこれが何を意味するのか具体的には確認しませんでした:-).

関連情報