关闭单进程交换和过量提交

关闭单进程交换和过量提交

两个问题:

  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 需要交换,即使实际上没有交换任何内容。

相关内容