Как предотвратить замедление работы Linux под нагрузкой?

Как предотвратить замедление работы Linux под нагрузкой?

Когда у меня есть процессы, потребляющие большой объем памяти, или у меня запущено много процессов, связанных с ЦП, часто становится трудно даже войти в систему. Я хотел бы предотвратить это и всегда поддерживать отзывчивость системы. Есть ли способ сделать это?

Уточняющая правка:

Я говорю о двух разных ситуациях, в которых я испытываю одни и те же симптомы:

  1. Очень высокая загрузка памяти. Один процесс потребляет около или более доступных 64 ГБ ОЗУ. Когда система приближается к 100% использованию, программы перестают отвечать.

  2. Очень высокая загрузка ЦП, проблемы с планированием. Наличие 10 тыс. готовых к запуску процессов вызывает ту же проблему. Обратите внимание, что это не проблема 100% загрузки ЦП. Когда я убиваю все, кроме 200 из этих процессов, все 32 ЦП остаются на 100% загрузке, но система становится гораздо более пригодной для использования.

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

Я полностью контролирую эти системы и во всех случаях мне удавалось останавливать задания с помощью kill -STOP или просто Cc.Я хотел бы исправить то, что при использовании графического интерфейса это становится невероятно сложным, а иногда и невозможным, поскольку ввод обрабатывается невероятно медленно, если вообще обрабатывается. Я хотел бы исправить это в целом, а не вносить изменения в какие-то конкретные работы.

Что я пробовал:

  1. Для многих запущенных процессов, которые у меня сейчас есть, я просто перенастроил все запущенные процессы на +5, но это, похоже, не помогло. Как и установка их на niceness 19.

  2. Как предложено в одном из ответов. Я попробовал изменить политику планировщика на IDLE с помощью sudo schedtool -D $(pgrep -u myuser progname -d " ")и сsudo sh -c 'for pid in $(pgrep -u myuser progname); do chrt -i -p 0 $pid; done;' Похоже, это несколько улучшает ситуацию.

решение1

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

Подкачка — это метод поддержания работоспособности системы при достижении пределов физической памяти. В слабо загруженной системе это может означать, что система продолжает работать, и данные выгружаются при возникновении скачка, а затем возвращаются при необходимости с незначительными эффектами.

Большинство операционных систем сбрасывают программы и код в своп на основе "наименее давно используемых". Трудно сделать какие-либо предположения о "приоритетности" памяти, поскольку загрузка памяти меняется, а "приоритет" — это скользкая дорожка субъективных суждений о том, что важнее. То, что важнее для одной системы, менее важно для другой. Программы командной строки — это просто другие программы, и их невозможно отличить от других программ, запущенных пользователем.

Поскольку у вас сильно загруженная система с большим количеством процессов, использующих много памяти, вы сталкиваетесь с проблемой конкуренции. В тот момент, когда операционная система пытается выгрузить что-то на диск, чтобы освободить немного памяти, другой процесс уже запросил несколько других страниц, которые нужно вернуть. Каждый запрос на возврат чего-то выталкивает что-то еще.

Как среди 10 000 процессов может какая-либо система определить, что должно иметь приоритет над «системными» запросами командной строки, которые выглядят как запросы любой другой программы?

Другая проблема — время поиска жесткого диска. Для старых жестких дисков время перемещения головки диска и начала чтения или записи составляет порядка 9,5 миллисекунд. При большом количестве запросов, поступающих одновременно для разных областей, время поиска может доминировать над всем остальным и сократить фактическое полезное время и пропускную способность до удивительно малых цифр. SSD может помочь, но если у вас ограниченная память, то он может помочь лишь отчасти.

Похожие узкие места могут возникать по всей системе и иметь разные симптомы. Операционная система может управлять большим количеством одновременных программ, но она все равно остается "просто" программой и нуждается во времени среди всего остального. Использование файла подкачки — это лишь одно из самых экстремальных узких мест.

Перегружать систему таким образом и ожидать, что она «справится с этим», — не очень хорошая идея.

Если вы постоянно используете больше памяти, чем у вас есть, то ответ — купить больше памяти. Если у вас есть тысячи процессов, конкурирующих за время жесткого диска для чтения или записи данных, то вам нужно распределить нагрузку между большим количеством машин или дисков.


В другой ситуации, при наличии 10 000 активных процессов, ваша проблема заключается как в разногласиях, так и в нереалистичных ожиданиях.

Одна из проблем заключается в том, что «хорошесть» не обязательно всегда имеет более низкий приоритет. Это зависит от планировщика операционной системы, и добавление все большего количества процессов может фактически работать против честной и полезной системы, поскольку в итоге вы сокращаете количество времени, выделенного любому данному процессу.

См. этот вопрос на нашем родственном сайте UnixКак вам работа?который описывает Полностью Справедливый Планировщик:

CFS имеет целевую задержку для длительности планирования. Меньшие целевые задержки обеспечивают лучшую интерактивность, но по мере уменьшения целевой задержки увеличиваются накладные расходы на переключение, тем самым снижая общую пропускную способность.

...

Теперь рассмотрим два процесса: один с уровнем приоритетности 0 (по умолчанию), другой с уровнем приоритетности 5. Пропорциональная разница между соответствующими весами составляет примерно 1/3, что означает, что процесс с более высоким приоритетом получает временной интервал приблизительно в 15 миллисекунд, а процесс с более низким приоритетом получает временной интервал в 5 миллисекунд.

В этом планировщике удобство означает, что ваши 10 000 процессовдолженполучите меньше времени, но из-за их огромного количества вы можете достичь нижнего предела значения временного среза для "справедливого" планирования, а это означает, что никто не получит хорошего размера среза времени. Вы даже можете достичь предела, когда загрузка или выгрузка задач из ЦП будет доминировать по времени.

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

Более подробную информацию о планировщике можно найти на сайтеhttp://man7.org/linux/man-pages/man7/sched.7.html

Использование более разумного количества процессов (от 100 до 200) обеспечивает разумное распределение времени между задачами ОС и вашими процессами.

Вместо того чтобы начинать 10 000 задач одновременно, следует начинать новые по мере завершения старых.

Связанный контент