Linux

tmpfs (/dev/shm) 是否使用 Linux 頁面記憶體?如果是這樣,那怎麼辦?

  • February 14, 2019

AFAIK,Linux 有一個頁面記憶體來提高性能(例如,如果你打開一個文件,linux 會將該文件記憶體在 RAM 中),然後如果再次請求文件並將其記憶體,則作業系統會避免從磁碟讀取文件並從記憶體…

我的問題是:如果您在tmpfs中有一個文件並且您與該文件互動(讀取),該文件是否會在 RAM 中重複(一個在 tmpfs 中,一個在頁面記憶體中?)

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。這很有趣,但它仍然只算一個,猜這就是他們稱之為共享的原因 -.-'

故意讀取文件:

# 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 中讀取文件時,它們不再被頁面記憶體複製。

引用自:https://unix.stackexchange.com/questions/500484