申し訳ありませんが、Linuxにはパフォーマンスを向上させるためのページキャッシュがあります(たとえば、ファイルを開いた場合、LinuxはそのファイルをRAMにキャッシュします)。ファイルが再度要求されてキャッシュされると、OSはディスクからのファイルの読み取りを回避し、ファイルを返します。キャッシュ...
私の質問は: tmpfs にファイルがあり、そのファイルを操作(読み取り)した場合、ファイルはRAM(tmpfs内の1つと1つはページキャッシュにありますか?)
TmpfsはLinuxページキャッシュを使用しますか?
tmpfsとページキャッシュは、同じコインの両面です。
https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt で説明されているように(鉱山を強調)
tmpfsはすべてをカーネルの内部キャッシュに入れて、それが含むファイルに合わせて拡大および縮小します不要なページをスワップスペースにスワップアウトできます。
[...]
tmpfsはページキャッシュに完全に存在し、スワップ時に存在するため、すべてのtmpfsページは「/proc/meminfoのShmem」およびfree(1)の「共有」。
そのため、このキャッシュが複製されることは非常に予想外です。これはすでにキャッシュにあります。tmpfsは、キャッシュシステムに対する一種のフロントエンドにすぎません。
私の質問は、tmpfsにファイルがあり、そのファイルを操作(読み取り)した場合、ファイルはRAM(tmpfsに1つ、ページキャッシュに1つ)に複製されますか?)
これは実験的に決定できます。
# sync
# echo 3 > /proc/sys/vm/drop_caches
# free -m
total used free shared buff/cache available
Mem: 15940 2005 13331 264 603 13390
Swap: 0 0 0
だから、私はたまたま約13000の利用可能なメモリを持っています、そしてそれをあまりにも劇的に変えるであろう実行中のプロセス、そしてスワップはありません。 tmpfsに〜6000を書き込みましょう:
# mount -t tmpfs -o size=6000M none /mnt/tmp
# dd if=/dev/urandom of=/mnt/tmp/big.file
dd: writing to '/mnt/tmp/big.file': No space left on device
6291456000 bytes (6.3 GB, 5.9 GiB) copied
したがって、tmpfsはランダムなデータで満たされます。今何が無料ですか?
# free -m
total used free shared buff/cache available
Mem: 15940 1958 7347 6269 6633 7429
Swap: 0 0 0
したがって、free
は13331から7347に減少しましたが、shared
およびbuff/cache
両方とも6000増加しました。それは興味深いですが、それでも1つとしてカウントされます。それが、彼らが共有と呼んでいる理由だと思います-.- '
意図的にファイルを読み取る:
# cat /mnt/tmp/big.file > /dev/null
# free -m
total used free shared buff/cache available
Mem: 15940 2055 7237 6269 6647 7332
Swap: 0 0 0
カウントは上がりませんでした(とにかく6000のオーダーではありません)。
意図的に別のものを読む:
# cat /some/other/file > /dev/null
# free -m
total used free shared buff/cache available
Mem: 15940 2011 157 6303 13771 7334
Swap: 0 0 0
...そしてfree
が157になり、キャッシュがほぼいっぱいになりました。
要約すると、tmpfs自体はすでにページキャッシュを表しています。 tmpfsでファイルを読み取るとき、それらはページキャッシュによって複製されなくなりました。