Linux

在 tmpfs 上交換(顯然是個壞主意,但有可能嗎?)

  • January 4, 2020

這個問題源於同事之間關於通過將交換文件移動到 tmpfs 來提高性能的笑話。顯然,即使這是可能的,這也不是一個好主意。我只想知道,能做到嗎?

我目前使用的是 Ubuntu 14.04,但我想這個過程對於大多數 Linux/Unix 機器來說都是相似的。這就是我正在做的事情:

> mkdir /mnt/tmp
> mount -t tmpfs -o size=10m tmpfs /mnt/tmp
> dd if=/dev/zero of=/mnt/tmp/swapfile bs=1024 count=10240
> chmod 600 /mnt/tmp/swapfile
> mkswap /mnt/tmp/swapfile
# So far, so good!

> swapon /mnt/tmp/swapfile
swapon: /mnt/tmp/swapfile: swapon failed: Invalid argument

那麼,在 linux 或 unix 上(我對任何解決方案都感興趣)你能以某種方式在駐留在 ram 中的文件/分區上設置交換嗎?有沒有辦法解決Invalid argument我遇到的錯誤?

再次強調,我不希望這是解決現實世界問題的方法。只是一個有趣的實驗,我猜。

這應該是不可能的。swapon系統呼叫需要readpagebmap(間接)由文件系統實現的呼叫:

http://lxr.free-electrons.com/source/mm/swapfile.c?v=4.0#L2412

if (!mapping->a_ops->readpage) {
   error = -EINVAL;
   goto bad_swap;
}   

但是它們都不是由tmpfs實現的,相應的條目中缺少這樣的條目:http address_space_operations: //lxr.free-electrons.com/source/mm/shmem.c?v=4.0# L3104

出於同樣的原因,tmpfs 不能保持循環掛載,並且 ramfs 也不會工作(它沒有bmap呼叫)

從這個問答https://superuser.com/questions/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem(原始引用的站點沒有響應):

所以“無效參數”應該讀作“你的文件系統不支持交換文件”

我懷疑不兼容的原因是“循環依賴”。從這篇文章:http ://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk :

ramfs 和 tmpfs 之間的這兩個區別使 tmpfs 更易於管理,但這是一個主要缺點;tmpfs 可能會使用 SWAP 空間。如果您的系統用完了物理 RAM,則 tmpfs 分區中的文件可能會寫入基於磁碟的 SWAP 分區,並且在下次訪問文件時必須從磁碟讀取。

在您的情況下,這幾乎是不可能的。

可能適用於ramfs, tho - 沒有這個問題。

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