
當我們要設定Linux系統時,有一個常見的建議是將交換空間設定為實體記憶體的兩倍。我想知道為什麼我們需要這個,以及這個建議是如何產生的?
答案1
簡短的回答是「你不有到」。
根據核心/系統類型,調整交換空間的大小可能是有意義的,例如在 FreeBSD 中調音(7)在線上說明頁中,我們發現交換大小至少是實體記憶體大小的 2 倍背後的以下基本原理:
對於 RAM 小於 2GB 的系統,通常應將交換空間大小調整為大約 2 倍主內存,如果內存更多,則應將交換空間調整為大約 1 倍主內存。但是,如果您沒有大量 RAM,則通常需要更多交換空間。不建議您在系統上配置小於 256M 的交換空間,並且在調整交換分區大小時應牢記未來的記憶體擴充。核心的 VM 分頁演算法經過調整,當交換記憶體與主記憶體相比至少有 2 倍時,效能最佳。配置太少的交換可能會導致虛擬機器頁面掃描程式碼效率低下,並且如果您向電腦添加更多內存,還會在以後產生問題。最後,在具有多個 SCSI 磁碟(或在不同控制器上執行的多個 IDE 磁碟)的大型系統上,我們強烈建議您在每個磁碟機上設定交換。磁碟機上的交換分割區大小應大致相同。核心可以處理任意大小,但內部資料結構可擴展至最大交換分割區的 4 倍。保持交換分割區接近相同的大小將允許核心在 N 個磁碟上以最佳方式條帶化交換空間。不要擔心做得太過分,交換空間是 UNIX 的優點,即使您通常不使用太多交換空間,它也可以讓您在被迫重新啟動之前有更多時間從失控的程序中恢復。
當您決定分配多少交換空間、分配到何處等時,其他因素可能也很重要。例如,如果您要安裝具有 128 GB 實體記憶體的大型伺服器,最好避免為永遠不會使用的交換預先分配 256 GB 磁碟空間。
另一方面,有一些交換空間通常可以取得核心轉儲(例如在 Open-、Net- 和 FreeBSD 中)。因此,最好至少有足夠的交換空間來在緊急情況下取得完整的核心轉儲。
沒有絕對適合的規則全部案例。您必須閱讀特定係統的行為,了解它的工作原理,考慮系統的預期用途並決定適合的交換空間的最佳大小你的需要。
答案2
你根本不需要。舊版的Windows 會將分配的記憶體的每一頁本質上視為交換文件上的mmap,因此您至少需要交換中的總物理RAM 大小才能使其有用- 如今不再是這種情況,而且從來都不是這樣Linux 中的情況,但謠言仍然存在。
然而,有一種情況需要至少與 RAM 一樣多的交換空間——休眠。由於 Linux 使用交換文件進行休眠(又稱掛起到磁碟),因此您需要足夠的交換來保存 RAM 中的所有數據,以及已換出的所有數據(減去緩存 RAM)。當然,這只適用於需要休眠的機器,例如筆記型電腦。
最後,過多的交換可能會導致壞的不管別人怎麼說。想想看 - 如果您有 4G RAM,並且除此之外還需要額外的 8G 交換空間,您認為您的系統仍然可用嗎?當記憶體耗盡時,最好立即終止佔用記憶體的進程,而不是當整個系統開始花費所有時間將資料編入和編出交換區時,讓整個系統減慢至無法使用的水平。
答案3
很久以前,有一個常見的unix變體(我認為它是一個BSD,但我現在找不到參考),它會在交換空間中分配每個虛擬記憶體頁面。因此,如果您的交換空間與 RAM 一樣多,則虛擬記憶體的大小仍將與 RAM 相同。當時通常的建議是使交換區數量是 RAM 的兩倍,這使得虛擬記憶體是 RAM 的兩倍。
現代的 unice 不會那樣做,所以這個規則的原因已經過時了(我認為它在 1992 年就已經過時了,所以它與 Linux 從來沒有關係)。但奇怪的是,這條規則仍然存在。如果您現在遵循它,您將獲得的虛擬記憶體是 RAM 量的三倍,而最初的目的是獲得兩倍的虛擬記憶體。
僅僅因為該規則背後的歷史原因是錯誤的,並不意味著它是愚蠢的。磁碟空間變得更便宜,因此分配更多交換空間是有意義的。您應該擁有多少交換空間很大程度上取決於您擁有多少 RAM 以及您如何使用它。您可以在沒有交換的情況下運行系統,但是如果您的 RAM 已滿,您就沒有機會選擇要殺死哪些程序,並且系統可能會變慢(有時最好使用 RAM 進行緩存並交換一些程序內存)出去)。分配過多的交換會消耗少量的 RAM(用於核心資料結構),當然還有磁碟空間(但如今,除了 SSD 之外,這通常非常便宜)。如果您想休眠,則需要有足夠的交換空間來容納所有虛擬記憶體。
答案4
這是一個古老的建議,基於對典型系統記憶體容量、記憶體匯流排速度與磁碟速度以及進程處於各種等待狀態的時間百分比的假設。我懷疑現在您是否需要在交換空間中使用超過 1/2 的實體記憶體——當您在接近完全使用記憶體的情況下運行時,足以防止隨機 OOM 終止。但完全取決於你的典型工作量、YMMV 等。