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

StackOverflow https://stackoverflow.com/questions/1410939

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

<Ол>
  • Настройте наши собственные модули для работы с Moose или Mouse, в зависимости от ситуации. (Тьфу!)
  • Разрабатывайте наши модули только для FCGI / Moose . Не поддерживает "ваниль" CGI больше. Если нам придется писать непостоянные сценарии, они не смогут использовать наши внутренние модули.
  • Не используйте Moose или Mouse , но используйте некоторые другие объектные рамки.
  • Какой вариант лучше? Мы склоняемся к 2 прямо сейчас, и мы просто смиримся с этим, если нам нужно будет запустить что-то вроде ванильного CGI. Как насчет других фреймворков? Есть ли что-нибудь более легкое, на что мы должны смотреть?

    Это было полезно?

    Решение

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

    Другие советы

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

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

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

    С другой стороны, может быть реальная выгода от того, что сервер не-cgi может иметь ЛЮБОЙ абстрактный интерфейс, прикрепленный по мере необходимости.

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

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

    Мое предложение состоит в том, чтобы перейти к варианту № 2, а затем помочь нам реорганизовать Moose, чтобы CGI стал жизнеспособным. В настоящее время 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 .

    Я никогда не использовал это, но это определенно выглядит интересно. И тот, кто написал это (Matt Sergeant aka baud) - это дает вам практически гарантию хорошего качества кода.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top