Отключить однопроцессный обмен и перегрузить

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
}

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

Тем не менее, я до сих пор не знаю, как отключить сверхкоммит. Есть идеи?

Rubens
источник

Ответы:

2

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

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

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

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

vbraun
источник
Это звучит для меня как лучшее решение. Спасибо большое! (:
Rubens
1
Если я правильно прочитал ( kernel.org/doc/Documentation/vm/overcommit-accounting ) установив vm.overcommit_ratio=0 как и выше, вы ограничиваете общее выделение памяти размером только подкачки. Я попробовал вышеизложенное и попал в состояние, в котором ничего не может работать, так как все распределения не удаются. Я предполагаю, что система уже использовала больше памяти, чем размер подкачки. Четное ls дает -bash: fork: Cannot allocate memory, Я думаю, что вы хотели установить процент до 100, нет?
Edd Barrett