Отлов зависших 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.