Как ограничить время выполнения Perl-скрипта в IIS?

Это общая среда хостинга. Я контролирую сервер, но не обязательно контент. У меня есть клиент со сценарием Perl, который время от времени выходит из-под контроля и высасывает 50% процессора, пока процесс не будет убит.

С помощью сценариев ASP я могу ограничить количество времени, в течение которого сценарий может выполняться, и IIS просто выключит его, скажем, через 90 секунд. Это не работает для скриптов Perl, так как он работает как процесс cgi (и фактически запускает внешний процесс для выполнения скрипта).

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

Есть ли способ заставить IIS прервать сценарий Perl (или другой процесс типа cgi), который выполняется слишком долго? Как??


person Eric Longman    schedule 16.09.2008    source источник
comment
Можете ли вы дать больше информации о том, как вы его настроили?   -  person Leon Timmermans    schedule 16.09.2008


Ответы (4)


В системе в стиле UNIX я бы использовал обработчик сигналов, перехватывающий события ALRM, а затем использовал бы функцию будильника для запуска таймера перед запуском действия, которое, как я ожидал, может истечь по тайм-ауту. Если действие завершено, я бы использовал alarm(0), чтобы отключить сигнал тревоги и выйти в обычном режиме, в противном случае обработчик сигнала должен подобрать его, чтобы изящно закрыть все.

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

Более подробную информацию об обработке сигналов и подобного рода программировании самоуничтожения с помощью alarm() можно найти в Perl Cookbook. Вот краткий пример, взятый из другого поста и немного измененный:

eval {
    # Create signal handler and make it local so it falls out of scope
    # outside the eval block
    local $SIG{ALRM} = sub {
        print "Print this if we time out, then die.\n";
        die "alarm\n";
    };

    # Set the alarm, take your chance running the routine, and turn off
    # the alarm if it completes.
    alarm(90);
    routine_that_might_take_a_while();
    alarm(0);
};
person arclight    schedule 16.09.2008

Тайм-аут сценария ASP применяется ко всем языкам сценариев. Если сценарий выполняется на странице ASP, тайм-аут сценария закроет страницу-нарушитель.

person jwmiller5    schedule 16.09.2008

Обновление по этому поводу...

Оказывается, этот конкретный скрипт, по-видимому, немного глючит, и что робот Google имеет сверхъестественную способность «нажимать на свои кнопки» и сводить его с ума. Сценарий представляет собой старое коммерческое приложение, которое ведет календарь. По-видимому, он отображает ссылки на «следующий месяц» и «предыдущий месяц», и если вы перейдете к «следующему месяцу» слишком много раз, вы упадете с обрыва. Однако полученная страница по-прежнему содержит ссылку «в следующем месяце». Робот Google постоянно избивал скрипт до смерти и сожрал процессор.

Любопытно, что добавление robots.txt с Disallow: / не решило проблему. Либо гугл-бот уже завладел скриптом и не собирался его выпускать, либо он просто игнорировал файл robots.txt.

Во всяком случае, Microsoft Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) оказал огромную помощь, так как позволил мне более подробно увидеть среду для процесса perl.exe, и я смог определить, что причиной моего проблемы.

Как только я узнал об этом (и решил, что robots.txt не решит проблему), я смог напрямую использовать IIS, чтобы заблокировать весь трафик на этот сайт с *.googlebot.com, что в данном случае сработало хорошо, поскольку мы не не волнует, индексирует ли Google этот контент.

Большое спасибо за другие идеи, которые все опубликовали!

Эрик Лонгман

person Eric Longman    schedule 01.10.2008

Поиск в Google «предела процессора iis» дает следующие результаты:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/38fb0130-b14b-48d5-a0a2-05ca131cf4f2.mspx?mfr=true

«Функция мониторинга ЦП отслеживает и автоматически отключает рабочие процессы, потребляющие большое количество времени ЦП. Мониторинг ЦП включен для отдельных пулов приложений».

http://technet.microsoft.com/en-us/library/cc728189.aspx

«Используя мониторинг ЦП, вы можете отслеживать использование ЦП рабочими процессами и при необходимости отключать рабочие процессы, которые потребляют большое количество времени ЦП. Мониторинг ЦП доступен только в режиме изоляции рабочих процессов».

person piCookie    schedule 16.09.2008