Шрифт
Отлов зависших php скриптов, на сервере
Play

Отлов зависших php скриптов, на сервере

Подскажите чем лучше отлавливать php скрипты по нагрузке на процессор и времени выполнения, есть Сервер, на нем крутится апач2 с виртуальными хостами > 100 сайтов, дочерний процесс апача от имени пользователя стартует, у каждого виртуального хоста свой пользователь заведен. Начал с парсера mod_stat apache, но такой костыль выходит. Может есть по эффективней что нибудь?

Хочется ловить скрипты с завышенным time limit, и CPU% аварийно завершать их, и складывать в лог т.к. чудо сайтов с вирусами и криворуким кодом очень много. Что посоветуете?

присоединяюсь к вопросу

Хочется ловить скрипты с завышенным time limit, и CPU% аварийно

Он будет делать работу за вас. В логе смотрите по статусу все скрипты.

One alternative would to attempt to kill all the Apache processes using PHP. It will send a kill signal to all Apache processes, except the one it is running under. This might work if the Apache process running under a shared process without setuid(). Attempt at your own risk.

по ссылке пример скрипта, убивающего лишние процессы.

как насчет такого?

как это делать грамотно: все HTTP запросы идут через единую точку входа (тут у большинства будет облом) в которой записывается время старта и pid (по возможности параметры запроса для последующего диагноза), по выполнении запроса записи удаляются, в какойнить убогой java - вся эта инфа болталась бы в памяти.

в дальнейшем внешний демон (в тойже убогой яве простой поток из памяти) берет эти записи и грохает те что задержались на этом свете

Сегодня ковырялся, вычищал вирус. Запустил чекалку - таймаут, гад отрабатывал, НО отваливался браузер (ч/з 30 сек), а процесс php-cgi продолжал висеть!

С другой стороны в FAQ на чекалку были упомянуты квоты по использованию проца (как причина несрабатывания).

тем что любой вебмастер используя функцию set_time_limit может заставить работать скрипт бесконечно.

этот скрипт просто убивает процессы определенного пользователя.

все HTTP запросы идут через единую точку входа (тут у большинства будет облом) в которой записывается время старта и pid (по возможности параметры запроса для последующего диагноза)

Предлагаешь модуль для апача создавать?

предлагаю перед тем как писать на пхп подумать и писать так чтобы сия задача решалась парой строчек.

предлагаю перед тем как писать на пхп подумать и писать так чтобы сия задача решалась парой строчек.

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

ну у тебя в топике не написано что это сервер с произвольными php чудоскриптами.

ну у тебя в топике не написано что это сервер с произвольными php чудоскриптами.

Написать ещё один который будет их опрашивать, а они корректно отвечать, ответил значит трудится, не ответил убить.

Написать ещё один который будет их опрашивать, а они корректно отвечать, ответил значит трудится, не ответил убить.

ребят я может как то не так выразился. но сервер с сайтами в продакшене, там движки, самописные сайты, и т.д. скриптов больше 10000

тем что любой вебмастер используя функцию set_time_limit может заставить работать скрипт бесконечно.

Посмотрите сами по теме:

Выставляете, переводите в safe mode.

вот тебе все дети с пидами и временем работы в формате mm:ss - а дальше решай что с ними делать. скрипт по крону раз в минуту. да, у линуксового ps аргументы могут отличаться но такой функционал есть, это решение для бсд.

большинство кривого кода не работает в safe mode

не, с безопасным режимом куча других проблем появляется.

в этом случае не видно скрипта создающего проблемы

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

с предлагаемым списком можно делать все. например lsof -p по PID и грепать оттуда скрипт. можно добавить в order еще %cpu и сортировку по нему.

А по-ангельски функции назвать слабо?

с предлагаемым списком можно делать все. например lsof -p по PID и грепать оттуда скрипт. можно добавить в order еще %cpu и сортировку по нему.

а можно подробнее, это как, увидеть из списка процессов apache скрипт php который в данный момент выполняется?

в server-status есть связь pid <--> запрос.

Да понятно что с данными из server-status можно любую информацию по процессу узнать, хотел я без server-status обойтись костыль ведь. Надо исходники mod_status посмотреть, может смогу чего оттуда выдернуть.

А я думаю кто мне отрубает скрипт обновления инет-магаза в кроне.

Задача не тривиальная, сразу скажу. Там ведь инклюды всякие, о которых веб-сервер не знает и не обязан знать. По сути у большинства движков запускается только 1 скрипт из сайта - index.php, который разруливает уже через mod_rewrite все остальное. Тут нужен профайлинг ставить какой-то глобальный для всех сайтов. В эту сторону смотреть короче.

Не, мне не надо вплоть до файлов отлавливать, достаточно индексного скрипта, и профайлинг тут не нужен, мне не движки дебагить а за сервером следить чтобы они ресурсы не сжирали.

Так ещё проще. Настрой апачевские логи, вроде это должно помочь %D: The time taken to serve the request, in microseconds.

📎📎📎📎📎📎📎📎📎📎