Хорошо, ионы не достаточно

У меня есть скрипт, который запускает большой, процессор и потребление памяти дерево процессов. Там есть Python и исполняемые файлы, но все начинается с одного скрипта bash и подпроцессов python.

Во время выполнения остальная часть системы полностью отключается. Я пытался смягчить путем $ nice -n10 ionice -c2 ./Script.shОднако этого недостаточно - использование компьютера очень запаздывает (на самом деле это рабочий стол разработчика, но проблема на назначенном сервере будет аналогичной).

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

Есть ли способ снизить приоритет процесса (и его рекурсивных потомков) в доступе к физической памяти? Я предпочитаю делать это медленнее в фоновом режиме с ограниченным влиянием на другие задачи.

2 ответа

Решение

Вы не можете ограничить "темп" потребления памяти, но вы можете ограничить ее общее использование памяти с помощью различных механизмов.

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, и даже если бы вы могли - это не гарантирует, что некоторые из используемых вами программ все равно не будут заменены таким образом вызывая еще более медленный отклик системы. Просто не ходи туда.

Хотя следующее не поможет вам в обмене памяти, оно должно помочь вам повлиять на IO вашего процесса.

Кажется, вы должны явно установить level также.

ionice -c2 -n5 ./slowscript.sh

Одного C2 может быть недостаточно, в зависимости от вашего ядра.

Цитата из справочной страницы (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, поэтому, если вы хотите снизить IO до минимально возможного значения, либо перейдите в режим ожидания (C3), либо C2 N7.

Другие вопросы по тегам