在 tmpfs 上交換(顯然是個壞主意,但有可能嗎?)
這個問題源於同事之間關於通過將交換文件移動到 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
系統呼叫需要readpage
和bmap
(間接)由文件系統實現的呼叫: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 - 沒有這個問題。