Назад | Перейти на главную страницу

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

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

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

Обозреватель процессов 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, которые я использую?