關閉單一進程交換和過量使用

關閉單一進程交換和過量使用

兩個問題:

  1. 有沒有某種方法可以關閉給定進程的交換,即,如果某個進程使用了系統的所有可用主內存,是否可以殺死該進程?

  2. 如何在 Linux 系統中停用記憶體過量使用?

情境

我正在運行一個分散式應用程序,並且我希望在系統主記憶體耗盡時終止一個進程。這個過程對硬碟通訊的影響相當大,因此我認為檢查記憶體使用情況是合理的以程式設計方式, 喜歡:

std::ifstream statm("/proc/self/statm");
size_t mem_virt, mem_rss, mem_shared;
statm >> mem_virt >> mem_rss >> mem_shared;
if (mem_virt == MAX_SYSTEM_PRIMARY_MEMORY) {
    // kills current process
}

但如果有一些命令列能夠關閉給定進程的交換,那肯定會更好。

然而,我仍然不知道如何關閉過度使用。有任何想法嗎?

答案1

您可以透過呼叫 來禁止應用程式中的交換mlockall(MCL_CURRENT|MCL_FUTURE),請參閱手冊頁。

您可以停用過度使用:

$ sysctl vm.overcommit_memory=2    # policy number 2
$ sysctl vm.overcommit_ratio=0     # ratio = 0%

在沒有交換的情況下運行通常是一個糟糕的主意。現在,所有匿名 mmap 都將被迫由 RAM 支持,即使它們沒有被使用。 Unix 需要交換,即使實際上沒有交換任何東西。

相關內容