Tmpfs

累積 tmpfs 超出可用虛擬記憶體

  • February 14, 2019

我想知道,如果分配的 tmpfs 空間多於物理記憶體 - 並且它們已被填滿,會發生什麼。


更詳細:

假設我有 4GB RAM,4GB 交換空間。

mount -o size=4G -t tmpfs tmpfs /mnt1
mount -o size=4G -t tmpfs tmpfs /mnt2
mount -o size=4G -t tmpfs tmpfs /mnt3

據我了解,沒有問題,因為這些設備實際上並沒有分配它們從一開始就分配的記憶體。

現在我開始寫這些:

cat /dev/zero >/mnt1/bla &
cat /dev/zero >/mnt2/bla &
cat /dev/zero >/mnt3/bla &

和…


問題:

我想知道,系統應該如何處理這個問題?

我沒有在上面找到任何東西,但是當我多次掛載 tmpfs 時,我是在後台一遍又一遍地掛載同一個設備,還是創建了不同的、完全獨立的設備實例?

我是否以某種方式阻止了我的系統崩潰,或者我可以自由地這樣做嗎?

在將 tmpfs 分配給 /tmp 時,我開始思考的根本原因:

  1. 一種方法是直接安裝,
  2. 另一種是在*/dev/shm*創建一個文件,然後綁定掛載它。

如果沒有限制分配 tmpfs 空間,2. - 綁定安裝 - 如果我想廣泛使用 tmpfs,但不想花太多時間考慮我的行為的後果,這可能是一個本質上更安全的選擇。

機器會崩潰。故事結局。(*)

系統管理員可以對所有 tmpfs 實例進行合理的大小限制。

tmpfs很棒並且使“ramdisk”變得簡單,但要注意的一件事是它tmpfs沒有全域大小限制,而是每個已安裝實例的大小限制。

OOM kill 無法回收tmpfs. 最多可以換出,但前提是有足夠的可用交換空間。

所以,如果你在這裡掛載一個tmpfs,那裡掛載一個,這裡掛載一個,那裡掛載一個……並且每個都有幾個千兆字節的限製而不是小尺寸,很容易使機器崩潰(或發送到無限交換-取消交換) -reswap 循環)只需將它們全部填滿即可。

不幸的是tmpfs,預設為高達 50% 的 RAM(而不是10M或足以滿足許多任務的東西),並且預設為全域可寫。因此,通常會看到三個或四個tmpfs實例在填滿後會佔用 200% 的 RAM。任何普通使用者都可能使系統崩潰。

是時候拜訪您/etc/fstab並給他們合理的限制了。


(*)

現在我開始寫這些:

cat /dev/zero >/mnt1/bla &

你的例子實際上是最無害的。您正在編寫零而不是隨機數據,因此如果您正在進行一些簡單的優化(相同的頁面合併或 zswap),您可能仍然可以倖免於難。零可以通過其他方式壓縮或優化掉。

你想寫隨機數據。那是不可優化的,它必須完整儲存。

但是,寫入隨機數據仍然相對無害。你的交換將被填滿,如果你有足夠的,那就結束了。對於交換最好的情況是永遠不會讀回被交換的內容。

因此,您不僅要寫作,還要閱讀它。然後,即使您的 tmpfs 幾乎沒有被 ram 和 swap 覆蓋,機器仍然會自行交換到死。

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