出力は次のとおりです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
代わりに使用されますsystemd
。mmap()
read()
を使用して残りのキャッシュを確認できますsudo smem -t -m
。私は彼らが現在主にプログラムと彼らが使用しているライブラリを実行すると予想しています。
証明する
これを確認するには、次のカーネルコードへのリンクを参照してください。
キャッシュの削除キャッシュされた各 "inode"(ファイル)に対してvalidate_mapping_pages()を呼び出して動作します。
無効化_マッピング_ページ()- inodeのロック解除されたすべてのページを無効にします。
[...]
validate_mapping_pages() は IO アクティビティをブロックしません。ダーティページ、ロックされたページ、書き込み保存ページ、またはページテーブルへのマッピング。
「ダーティ」ページ(キャッシュされた書き込み)がある場合、または書き込みが進行中であっても削除または保留されません。これはにも言及されています。ドキュメント/sysctl/vm.txt。
ダーティ/書き込み保存ページの場合、invalidate_mapping_pages()はdeactivate_file_page()を呼び出して「リサイクルをスピードアップしようとしています。」私はこれが何を意味するのか具体的には確認しませんでした:-).