2

Два вопроса:

  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 ответ1

2

Вы можете запретить обмен в своем приложении, вызвав mlockall(MCL_CURRENT|MCL_FUTURE) , см. Справочную страницу.

Вы можете отключить overcommit:

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

Бег без свопа вообще ужасная идея. Теперь все анонимные карты будут принудительно поддерживаться оперативной памятью, даже если они не используются. Unix нуждается в обмене, даже если ничего не поменялось.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .