Отключить подкачку и перераспределение отдельных процессов

Отключить подкачку и перераспределение отдельных процессов

Два вопроса:

  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
}

Но если бы существовал какой-то набор команд, способный отключить подкачку для определенного процесса, это было бы определенно лучше.

Но я все еще не знаю, как отключить 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ится.

Связанный контент