Как я могу улучшить производительность Moose в непостоянных процессах CGI?


Лось - фантастическая структура объекта. Беда в том, что вместе со своими зависимостями он очень велик. Наше профилирование показывает, что на нашей платформе простая загрузка Moose потребует 5-6 секунд накладных расходов на непостоянные сценарии приложений CGI. Это просто неприемлемо для этих одноразовых приложений.

Напротив, когда мы используем постоянную процессную систему (такую как FCGI), эти издержки запуска устраняются (или, скорее, только возникают один раз), и все хорошо. Проблема заключается в том, что мы не можем гарантировать, что весь наш код всегда будет выполняться под постоянным процессом.

Мы исследовали использование мыши в качестве ограниченной функцией замены для лося, но, как оказалось (как упоминалось в этом ответе), это не жизнеспособный вариант. Любые библиотеки, которые мы пишем для работы с Moose, не смогут работать с мышью тонкими, но важными способами. И мы действительно не хотим раскошеливаться на все наши модули, поэтому что мы можем поддерживать как лося в постоянной среде, так и мышь для "ванильного" CGI.

Учитывая это, у нас есть следующие варианты:

  1. вилка наших внутренних модулей для работы с лосем или мышью, в зависимости от обстоятельств. (Фу!)
  2. разрабатываем только наши модули для FCGI/Moose . Больше не поддерживайте "ванильный" CGI. Если нам придется писать сценарии, которые не являются постоянными, они не смогут использовать наши внутренние модули.
  3. не надо использовать либо лося или мышь, а какой-то другой объект структуры.

Какой вариант лучше? Мы склоняемся к 2 прямо сейчас, и мы просто поглотим его, если нам нужно будет что-то запустить как vanilla CGI. А как насчет других фреймворков? Есть ли что-нибудь более легкое, на что мы должны смотреть?

6 10

6 ответов:

Я бы предпочел отказаться от поддержки vanilla CGI. FCGI хостинг действительно дешев в наши дни, и нет никаких причин потакать vanilla CGI (IMO), потому что это просто укрепляет мнение, что Perl медленный. Но если вы не можете избежать этого, то вы можете использовать что-то вроде Object::Tiny. Но если вам нужны роли, ограничения, мета-программирование и все другие прелести, которые предоставляет Moose, вам не повезет, если вы не бросите vanilla CGI.

Вы можете написать серверное приложение с помощью Moose, а затем написать очень маленькие, простые CGI-скрипты, которые запрашивают серверную часть.

+-------+    +--------------+
| Small |===>|  Persistent  |
|  CGI  |<===| Moose Server |
+-------+  ^  +--------------+
           |
         Socket
       Connection

Это более или менее то, что делает FCGI, поэтому, возможно, имеет больше смысла просто использовать FCGI.

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

Например, если вы используете сокеты TCP (или UDP), то у вас может быть собственное настольное приложение. та же задняя часть, что и у вашего CGI.

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

Мое предложение состоит в том, чтобы согласиться с вариантом № 2 и затем помочь нам рефакторинг лось так, что компьютерная графика становится жизнеспособным. в настоящее время fREW работает над тестовым пакетом Moose, чтобы включить проект MooseX::Antlers, который должен уменьшить большую часть накладных расходов, что означает, что Moose непригоден для среды CGI.

Мэтт Траут (mst), человек, в настоящее время стоящий за MooseX::Antlers, выразил желание иметь возможность запускать приложения в среде CGI, если это необходимо. Я бы посоветовал пока остаться с FCGI и приставать к нему за то, что вы можете сделать, чтобы помочь!

Джонатан Рокуэй написал оAPP::Peristent (который, как ни странно, не находится в CPAN) несколько месяцев назад. Я не использовал его, но, основываясь на его вышеупомянутом посте в блоге, он, похоже, обеспечивает довольно прозрачную серверно-клиентскую архитектуру, в которую вы можете обернуть фактическую обработку вашего CGI.

Основная идея App::Persistent, pperl, SpeedyCGI и, вероятно, некоторые другие - это то, что процесс компиляции вашей программы Perl в байтовый код выполняется только один раз, и после этого используется своего рода кэширование при вызовах. Поскольку у Moose, как говорят, довольно большой штраф за компиляцию, я бы попробовал сначала этот подход.

Я успешно использовал pperl для рисования множества MRTG графиков на древней системе около 2001 года. Программа Perl была выполнена для каждого графика что было довольно накладными расходами - это, вероятно, сравнимо с вашим сценарием CGI.

Есть и другой вариант - PPerl.

Я никогда не использовал его, но он определенно выглядит интересным. И человек, который его написал (Мэтт сержант, он же БОД) - это дает вам практически гарантию хорошего качества кода.