Профилирование сценария Perl CGI, для которого истекло время ожидания

У меня есть приложение Perl CGI, которое иногда прерывается, вызывая его уничтожение Apache и 504 Gateway Time-out ошибка для отправки в браузер. Я пытаюсь профилировать это приложение с помощью NYTProf, однако я не могу прочитать данные профиля:

 $ nytprofhtml -f www/cgi-local/nytprof.out
Reading www/cgi-local/nytprof.out
Profile data incomplete, inflate error -5 ((null)) at end of input file, perhaps the process didn't exit cleanly or the file has been truncated  (refer to TROUBLESHOOTING in the documentation)

я использую sigexit=1 NYTProf вариант. Вот минимальный CGI-скрипт, который воспроизводит проблему:

#!/usr/bin/perl -d:NYTProf

sleep 1 while 1;

2 ответа

Решение

Настройка sigexit=1 говорит NYTProf, чтобы поймать следующие сигналы:

INT HUP PIPE BUS SEGV

Тем не менее, когда ваш сценарий CGI истекает, Apache отправляет SIGTERM, Вам нужно поймать SIGTERM:

sigexit=term

Ловить SIGTERM в дополнение к сигналам по умолчанию используйте:

sigexit=int,hup,pipe,bus,segv,term

CGI.pm имеет режим отладки, который вы можете использовать для запуска вашей программы из командной строки и передачи параметров CGI в виде пар ключ / значение.

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

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

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

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

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