web-dev-qa-db-ja.com

tmpfs(/ dev / shm)はLinuxページキャッシュを使用しますか?もしそうなら、どのように?

申し訳ありませんが、Linuxにはパフォーマンスを向上させるためのページキャッシュがあります(たとえば、ファイルを開いた場合、LinuxはそのファイルをRAMにキャッシュします)。ファイルが再度要求されてキャッシュされると、OSはディスクからのファイルの読み取りを回避し、ファイルを返します。キャッシュ...

私の質問は: tmpfs にファイルがあり、そのファイルを操作(読み取り)した場合、ファイルはRAM(tmpfs内の1つと1つはページキャッシュにありますか?)

4
Carlitos Way

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でファイルを読み取るとき、それらはページキャッシュによって複製されなくなりました。

5
frostschutz