答案1
我認為你缺少的部分是「過度承諾」的含義。
過度使用並不是一種技巧,可以用來實際擁有比您限制系統擁有的資源更多的資源。這是一種表現得好像有更多資源的技巧。
基本概念是,大多數程式會分配比實際使用更多的記憶體。例如,他們可能會分配 32K RAM 來讀取只有 57 位元組的檔案。他們讀入它,並實際上使用一頁內存。但仍有 32K 分配。請注意,這個範例來自 90 年代,而今天,分配更大,文件也更大,但重點是額外的記憶體仍然是永遠不會被收集的承諾。
如果我沒記錯的話,這種情況甚至會發生在一些不知情的程序中,因為它們加載執行此操作的庫,甚至加載這些庫也會執行此操作- 鏈接器為庫分配足夠的內存,但只為例程分配足夠的記憶體實際呼叫的內容實際上已載入。這可能是共享內存,因此影響最小化,但它仍然存在。
發生的過度承諾的數量很大程度上取決於所調用的程序及其使用方式。如果一個程式被非常徹底地運用,它可能會使用更多的一些函式庫。呼叫 calloc 而不是 malloc 的程式不會出現過度提交的情況,因為 calloc 會寫入已分配空間的每個字節,從而要求作業系統滿足所請求的提交,即使將使用的記憶體的實際部分也是如此會少很多。有些程式更加小心,只分配它們需要的確切內存量,而另一些程式則依賴作業系統支援過度使用,以允許它們在資料結構安排中務實。
如果您的伺服器上限制使用 1GB 的應用程式實際上嘗試存取完整 GB 的頁面,則它將使用您配置為能夠使用的 8GB 交換空間。但它並沒有將其用於過度承諾。從技術上講,它不會使用過度使用,直到分配的 VM 超過實際擁有的 9GB。
話雖如此,這是Linux,我的記憶是,在不啟用過度使用的情況下嘗試將Linux 推向最大內存分配,它往往會提前失敗- 它為各種東西保留了一些保留,例如少量的文件快取和其他東西。那次經驗已經是十多年前的事了,但我不認為有什麼理由改變這種情況。擁有能夠執行檔案 I/O 的記憶體非常重要。