Назад | Перейти на главную страницу

приятно, ионизатора недостаточно

У меня есть сценарий, который запускает большое дерево процессов, потребляющих ресурсы ЦП и памяти. Там есть 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.