Swap

交換是不合時宜的嗎?

  • February 28, 2021

我使用 unix 已經有一段時間了,在過去的幾年裡,我覺得交換是不合時宜的,但我很好奇其他人的想法。

我的論點大致是這樣的(假設沒有全域 ulimit 或 OOM 設置的旋轉):

There is little value in swap because if you need to swap out to disk, 
odds are it's going to be a vicious cycle where an app will continue 
to eat not only real memory, but swap as well until it gets OOM 
reaped (_if_ it gets OOM reaped). 

If you have swap enabled, it will only prolong this death march to 
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.

Without swap, it will probably get OOM reaped sooner (if at all)

對於任何針對性能進行調整的服務,我認為了解其資源使用的上限將是首先對其進行調整的關鍵,在這種情況下,您知道自己需要多少。

我無法想像在很多情況下(一些,但不是很多)你會暫停一個正在執行的程序,它可以換出為其他事情騰出空間,但如果你這樣做,你仍然會失去你的套接字,所以強制一個通過 gcc 進行核心轉儲或手動複製記憶體在功能上是等效的。

我絕對不希望在嵌入式系統上進行交換(即使它可能有更小的可用記憶體),如果你的記憶體用完了,我寧願讓我的程序死掉,也不願毀掉每扇區百萬寫入的快閃記憶體通過將扇區磨損到小塊來驅動一個週末。

那裡有任何 unix-beards 有任何令人信服的理由來保持交換嗎?

更新答案&&分析:

  • 確認的?- fork() 子程序需要與父程序相同的記憶體量

現代 fork() 是POSIX 上的兒童寫時複製(通常),但特別是LinuxFreeBSD,我假設 OSX 通過外推。我認為交換隨身攜帶的這部分不合時宜的行李。

奇怪的是,這篇 Solaris 文章聲稱,即使 Solaris 使用帶有 fork() 的 Copy-on-Write,您應該在空閒虛擬記憶體中至少有**2 倍(!)**父程序大小,以便 fork() 不會在中間。雖然 Solaris 元素在某種程度上打破了交換是不合時宜的論點 - 我認為足夠多的作業系統正確地實現了 CoW,因此消除神話比將其標記為交換的進一步理由更重要。自從。面對現實吧。在這一點上,真正使用 Solaris 的人可能只是 Oracle 人。無意冒犯索拉里斯!

  • 已確認- 當 tmpfs/ramfs 填滿時,可以方便地交換 tmpfs/ramfs 文件

不要使用無限制的 tmpfs/ramfs!始終明確定義您希望 tmpfs/ramfs 使用的 ram 數量。

  • PLAUSABLE - 有一點交換“以防萬一”

我的一位老老闆曾經有一句很好的說法,“你不知道你不知道什麼”——本質上,你無法根據你還沒有的資訊做出決定。然而,這對我來說是一個合理的交換論點——我懷疑你為檢測你的應用程序是否正在換出所做的事情類型比檢查 malloc() 是否成功或從一個失敗的新()。

這在您正在執行桌面並且有一堆隨機事情發生的情況下可能很有用,但即便如此 - 如果事情變得瘋狂,我寧願它被 OOM 收割而不是潛入交換地獄。這就是我。

  • 搞砸了!- 在Solaris上,swap重要,有幾個原因

tmpfs - states tmpfs可用的可用空間量取決於系統中未分配的交換空間量。tmpfs 文件系統的大小會增長以容納寫入其中的文件,但對於 tmpfs 的重度使用者而言,存在一些固有的權衡。Tmpfs 與執行程序的數據和堆棧段共享資源。如果 tmpfs 文件系統接近其最大允許大小,則非常大的程序的執行可能會受到影響。Tmpfs 可以自由分配系統交換空間的 4MB 以外的所有空間。

關於交換狀態的Solaris 事實和神話今天的虛擬記憶體由物理 RAM 和磁碟上的交換空間的總和組成。Solaris 根本不需要配置任何交換空間。如果選擇此選項,一旦 RAM 已滿,您將無法啟動新程序。.

我不確定這是否意味著您可以創建的最大虛擬地圖是ram+swap,或者您是否仍然可以執行類似 mmap() 的操作,一個大於 ram 的文件並依賴 mmap() 的延遲初始化。當您這些天可以在沒有交換的情況下很好地執行 Solaris,它似乎不像其他 POSIXy 作業系統那樣友好。

  • **搞砸了!**流行的 Linux 休眠工具似乎依賴交換

預設情況下,TuxOnIce看起來像是依賴交換來休眠 - 儘管存在其他後端。但是,如果您沒有執行需要休眠的機器,我仍然會支持“交換在 linux 上是 anacronistic”的說法

不要混淆()交換(作為磁碟區域)和(到)交換(作為將記憶體頁面從 RAM 移動到磁碟的一種方法,並且相互)。

出於性能原因,應避免過度交換,但擁有交換區域不一定是問題。

在像 Linux 這樣過度使用記憶體的系統上,即允許程序分配比可用記憶體更多的記憶體,記憶體不足而沒有足夠的交換來處理這種情況將觸發 OOM 殺手。您必須信任用於選擇要殺死的“正確”程序的算法,並接受您的一個或多個程序被殺死而沒有機會正確關閉。這是一個著名的類比,它解釋了為什麼 OOM 殺手可能根本不是一個好主意。

在像 Solaris 這樣不會過度使用記憶體的系統上,即確保記憶體保留始終由虛擬記憶體支持,無論是在 RAM 中還是在磁碟上,具有足夠的交換區域是絕對必要的,否則 RAM 的潛在重要部分將是浪費了。

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