
Два вопроса:
Есть ли способ отключить подкачку для определенного процесса, т. е. можно ли завершить определенный процесс, если он использует всю доступную основную память системы?
Как отключить избыточное выделение памяти в системе 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
}
Но если бы существовал какой-то набор команд, способный отключить подкачку для определенного процесса, это было бы определенно лучше.
Но я все еще не знаю, как отключить overcommit. Есть идеи?
решение1
Вы можете запретить подкачку в своем приложении, вызвав mlockall(MCL_CURRENT|MCL_FUTURE)
, см. страницу руководства.
Вы можете отключить избыточное выделение ресурсов:
$ sysctl vm.overcommit_memory=2 # policy number 2
$ sysctl vm.overcommit_ratio=0 # ratio = 0%
Запуск без swap — это вообще ужасная идея. Теперь все анонимные mmaps будут вынуждены поддерживаться RAM, даже если они не используются. Unix нуждается в swap, даже если на самом деле ничего не swapится.