У меня есть сценарий, который запускает большое дерево процессов, потребляющих ресурсы ЦП и памяти. Там есть Python и исполняемые файлы, но все начинается с одного сценария bash и подпроцессов python.
Во время выполнения вся остальная система полностью заглушается. Я попытался смягчить последствия $ nice -n10 ionice -c2 ./Script.sh
, однако этого недостаточно - использование компьютера очень тормозит (на самом деле это рабочий стол разработки, но проблема на указанном сервере будет такой же аналогичной).
Я подозреваю, что проблема связана с процессами, использующими слишком много памяти - все в конечном итоге выгружается и становится вялым.
Есть ли способ снизить приоритет процесса (и его рекурсивных потомков) в доступе к физической памяти? Я предпочитаю, чтобы это выполнялось медленнее в фоновом режиме с ограниченным влиянием на другие задачи.
Вы не можете ограничить «темп» потребления памяти, но можете ограничить общее использование памяти с помощью различных механизмов.
1) ограничения безопасности. Ограничьте использование памяти для пользователя, запускающего процесс, через /etc/security/limits.conf. Это может не сработать в вашем случае, если вы запускаете этот процесс как один и тот же пользователь, работающий над разными материалами.
Пример:
username hard as 1000000
2) Группы управления. Вы можете - с помощью контрольных групп, создать группу, а также ограничить использование памяти. Просто создайте контрольную группу, например:
# cat >> /etc/cgconfig.conf << EOF
group memlimit {
memory {
memory.limit_in_bytes = 1073741824;
}
}
EOF
# cat >> /etc/cgrules.conf <<EOF
username memory memlimit/
EOF
Offcourse - в обоих случаях вы должны разработать свою программу так, чтобы она могла восстанавливаться после неспособности выделить больше памяти.
Если это невозможно, вам просто нужно добавить больше памяти в вашу систему, чтобы избежать подкачки. Как только начинается обмен, он находится в руках ядра, и вы не можете, например, снизить приоритет kswapd, и даже если бы вы могли, это не гарантирует, что некоторые из используемых вами программ все равно не будут заменены out, что приводит к еще более медленному отклику системы. Только не ходи туда.
Хотя следующий вариант не поможет вам с подкачкой памяти, он должен помочь вам в воздействии ввода-вывода вашего процесса.
Кажется, вы должны явно установить level
также.
ionice -c2 -n5 ./slowscript.sh
Одного C2 может быть недостаточно, в зависимости от вашего ядра.
Qoute из справочной страницы (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.