Как определить fastcgi процессы

Мы запускаем несколько php-сайтов на iis с использованием FastCgi. Некоторые сайты в настоящее время порождают множество экземпляров FastCgi, которые работают с высокой загрузкой процессора. К сожалению, все сайты работают из сетевых служб, и мы не видим, какой процесс W3WP порождает процесс FastCgi.

Есть ли способ идентифицировать FastCgi и отследить его до определенного AppPool или веб-сайта?

2 ответа

Решение

Process Explorer из Sysinternals Suite, который доступен в Ms Technet в качестве первого комментария.

http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx

Просто проведите достаточно времени с этими инструментами. Выберите "Просмотр"> "Показать маркеры". затем вы увидите на нижней панели все IPC и открытые файлы и порты, которые в данный момент использует служба iis. Также инструменты командной строки доступны в версии пакета для программных решений через IPC. Все инструменты, начинающиеся с Ps* в их названии, могут предоставить вам больше информации, чем достаточно.

Для пользователей Linux: Process Explorer - это топ /htop-подобный инструмент для вывода списка процессов с возможностью lsof.

Я на самом деле думаю, что это один из лучших аргументов для использования apache и mod_php, а не fastcgi. Это очень важно, когда у вас происходит кризис производительности. Иногда я размышлял над тем, что нужно сделать, чтобы реализовать это в php_fpm, но не нашел времени для этого.

К сожалению, мой ответ основан на Linux, что может быть вам не полезно (учитывая, что вы ссылаетесь на IIS). В любом случае, я поставлю ответ, и, возможно, есть средства для Windows, которые я упоминаю)

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

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

Другой подход (самый полезный из известных мне в linux) - посмотреть, что происходит внутри процесса php, который использует весь ваш процессор. Ваши основные инструменты здесь - strace и ltrace. Имейте в виду, что при этом вы будете налагать дополнительную нагрузку на процессор и ввод-вывод, но вы можете прикрепить процесс для регистрации системных вызовов (strace) или вызовов библиотечных функций (ltrace), связанных с интересующим вас процессом. Это не всегда работать, потому что вы можете застревать в узком цикле процесса, который не вызывает систему или другие библиотеки, но чаще всего это даст вам то, что вам нужно.

На самом деле я не вдавался в подробности, но я полагаю, что это также возможно, если вы используете php-dev, чтобы прикрепить что-то вроде gdb к вашему процессу, который остановится, и вы можете посмотреть на стек. вы бы получили стек языка C, а не стек PHP, но, вероятно, вы могли бы найти там имена функций php и выяснить, какие функции задействованы. Как я уже сказал, вам придется приостановить выполнение, но если вы что-то написали в сценарий, чтобы присоединить gdb, распечатать лист стека и отключиться, вам не пришлось бы сильно прерывать. Я подозреваю, что существуют средства отладки Windows, используемые программистами в таких языках, как C, C++ и, возможно, C#, которые могут это сделать?

Стоит посмотреть, что вы можете получить от различных отладчиков PHP.

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

Может быть, кто-то еще может указать некоторые эквиваленты Windows для инструментов Linux, которые я использую?

Другие вопросы по тегам