两个问题:
是否有某种方法可以关闭给定进程的交换,即,如果某个进程使用了系统所有可用的主内存,是否可以终止它?
如何在 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 需要交换,即使实际上没有交换任何内容。