При запуске определенных функций в веб-приложении команда 'top' иногда показывает, что загрузка ЦП для конкретного httpd.worker увеличивается до 100%; Кроме того, использование памяти на одного рабочего иногда становится достаточно высоким, чтобы вызывать беспокойство. Конфигурация wsgi довольно стандартна и выглядит так:
...
MaxSpareThreads 3
MinSpareThreads 1
MaxRequestsPerChild 500
ServerLimit 1
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
WSGIDaemonProcess w2p processes=5 python-path=/home/[...]/python2.7 threads=1
...
Есть ли способ ограничить использование ЦП на одного рабочего, чтобы оно не превышало определенный процент ЦП, и перезапустить рабочий, как только его использование памяти превышает определенный предел?
Учитывая, что вы уже ограничиваете количество запросов на ребенка до 500, я бы искал утечку памяти в вашем коде.
Чтобы ограничить память, вы можете использовать ulimit
в скрипте, запускающем apache. Установите для него ограничение, немного большее, чем вы ожидаете от рабочих потоков. Если поток пытается вырасти больше указанного размера, операционная система убьет работника. Apache повторно запустит новый процесс, чтобы заменить убитого рабочего. Если вы включите дампы ядра, вы можете проанализировать их, чтобы увидеть, для чего используется память. Это перехватит большинство процессов, которые не обрабатывают неудачные запросы к памяти, и выйдет из строя. Некоторые процессы могут обнаружить сбой и корректно завершиться с дампом ядра или без него.
Если у вас многоядерный процессор, меня не будет беспокоить рабочий, использующий 100% ЦП. Даже в отношении одного основного процесса я бы не стал беспокоиться, если другие процессы не пострадают. Однако это может указывать на то, что у вас есть неэффективный код.
Средняя загрузка обычно является хорошим индикатором, если процессор перегружается. Если оно часто превышает количество ядер, то ЦП становится узким местом.
Если у вас в течение длительного времени выполняются высокие запросы к ЦП, существуют программы, которые улучшают (понижают приоритет ЦП) вызывающий нарушение процесс, позволяя другим процессам получать время ЦП. Что касается запланированного кода, возможно, стоит обратить внимание на то, чтобы превратить его в приложение, которое можно запускать с помощью центрального процессора.