Linux 上沒有交換記憶體時如何防止核心 I/O 抖動?

Linux 上沒有交換記憶體時如何防止核心 I/O 抖動?

由於錯誤,我遇到了一個進程產生大量線程的問題,耗盡內存,導致交換分區進行大量交換。因此,我關閉了交換(無論如何在伺服器叢集中都是建議的),讓有缺陷的程式儘早失敗。令我驚訝的是,這根本沒有改善事情!同樣,設定vm.swappiness為 0 也沒有幫助。 iotop透露出沉重閱讀從磁碟(幾乎沒有寫入)。

我懷疑Linux核心仍在內存中交換代碼頁,並在需要時從磁碟重新讀取被覆蓋的代碼頁。當 RAM 非常低時,這種情況會非常頻繁地發生,導致系統抖動,使電腦幾乎沒有回應。

如何防止這種不幸且潛在危險的情況發生?我嘗試關閉交換、用於該進程的記憶體和 CPU 限制的 cgroups 以及用於最大限制的 ulimit。 30道工序。情況甚至沒有任何改善。 (嗯,這並不完全正確:RAM 限制導致數百 MB 永久未使用確實有所幫助。)

特別是:我可以防止交換記憶體中的程式碼段,並讓 RAM 請求進程簡單地為其下一個 malloc 取得 NULL 嗎?

答案1

如何調整記憶體過量使用會計並將其設定為選項 2(不過量使用)而不是預設選項 0(啟發式過量使用)?該說明指出

Don't overcommit. The total address space commit
for the system is not permitted to exceed swap + a
configurable amount (default is 50%) of physical RAM.
Depending on the amount you use, in most situations
this means a process will not be killed while accessing
pages but will receive errors on memory allocation as
appropriate.

上面的片段來自內核文件

此策略可以透過vm.overcommit可調參數進行設定。

相關內容