
У меня есть скрипт, который запускает большое, потребляющее CPU и память дерево процессов. Там есть Python и исполняемые файлы, но все начинается с одного скрипта bash и подпроцессов python.
Во время выполнения остальная часть системы полностью забита. Я попытался смягчить это с помощью
$ nice -n10 ionice -c2 ./Script.sh
, однако этого недостаточно - использование компьютера очень тормозит (на самом деле это рабочий стол разработки, но проблема на указанном сервере будет такой же аналогичной).
Подозреваю, что проблема в том, что процессы используют слишком много памяти — в итоге все выгружается и становится медленным.
Есть ли способ понизить приоритет процесса (и его рекурсивных потомков) при доступе к физической памяти? Я предпочитаю, чтобы это делалось медленнее в фоновом режиме с ограниченным влиянием на другие задачи.
решение1
Вы не можете ограничить «скорость» потребления памяти, но вы можете ограничить ее общее использование с помощью различных механизмов.
1) ограничения безопасности Ограничьте использование памяти для пользователя, запускающего процесс, через /etc/security/limits.conf. Это может не сработать в вашем случае, если вы запускаете этот процесс как тот же пользователь, работающий над разными вещами.
Пример:
username hard as 1000000
2) Контрольные группы Вы можете - с помощью cgroups, создать группу и также ограничить использование памяти. Просто создайте cgroup, например так:
# cat >> /etc/cgconfig.conf << EOF
group memlimit {
memory {
memory.limit_in_bytes = 1073741824;
}
}
EOF
# cat >> /etc/cgrules.conf <<EOF
username memory memlimit/
EOF
Конечно, в обоих случаях вам придется разрабатывать программу так, чтобы она могла восстанавливаться после сбоя выделения дополнительной памяти.
Если это невозможно, вам просто нужно добавить больше памяти в вашу систему, чтобы вы могли избежать подкачки. Как только подкачка начинается, она находится в руках ядра, и вы не можете, например, понизить приоритет kswapd, и даже если бы вы могли, это не гарантирует, что некоторые из используемых вами программ все равно не будут подкачаны, тем самым вызывая еще более медленную реакцию системы. Просто не делайте этого.
решение2
Хотя следующий пункт не поможет вам с подкачкой памяти, он должен помочь вам с воздействием ввода-вывода вашего процесса.
Похоже, вам level
также следует явно задать это.
ionice -c2 -n5 ./slowscript.sh
В зависимости от вашего ядра одного C2 может быть недостаточно.
Цитата из man-страницы ( man ionice
)
Note that before kernel 2.6.26 a process that has not asked for an I/O priority formally uses "none" as scheduling class, but the I/O scheduler will treat such
processes as if it were in the best-effort class. The priority within the best-effort class will be dynamically derived from the CPU nice level of the process:
io_priority = (cpu_nice + 20) / 5.
For kernels after 2.6.26 with the CFQ I/O scheduler, a process that has not asked for an I/O priority inherits its CPU scheduling class. The I/O priority is
derived from the CPU nice level of the process (same as before kernel 2.6.26).
По сути: каждый вновь запущенный процесс получит C2 N4, поэтому, если вы хотите максимально снизить объем ввода-вывода, перейдите либо в режим простоя (C3), либо в режим C2 N7.