AFAIK,Linux 有一个页面缓存来提高性能(例如,如果您打开一个文件,Linux 会将该文件缓存在 RAM 中),那么如果再次请求该文件并缓存该文件,操作系统将避免从磁盘读取该文件并从缓存...
我的问题是:如果你有一个文件临时文件系统并且您与该文件交互(读取),该文件是否会在 RAM 中重复(一个在 tmpfs 中,一个在页面缓存中?)
答案1
tmpfs 是否使用 Linux 页面缓存?
tmpfs 和页面缓存是同一枚硬币的两面。
如中所述https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt(强调我的)
tmpfs 将所有内容放入内核内部缓存中并增长和缩小以容纳其包含的文件,并且能够将不需要的页面交换到交换空间。
[...]
自从tmpfs 完全存在于页面缓存中在交换时,所有 tmpfs 页面将在 /proc/meminfo 中显示为“Shmem”,在 free(1) 中显示为“Shared”。
因此,该缓存被复制是非常意外的。它已经在缓存中,tmpfs 只是缓存系统的前端。
我的问题是:如果 tmpfs 中有一个文件并且与该文件交互(读取),该文件是否会在 RAM 中重复(一个在 tmpfs 中,一个在页面缓存中?)
这可以通过实验来确定。
# 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 中的文件时,页面缓存不再复制它们。