Perl Catalyst: возможность совместного использования.so файлов между дочерними серверными процессами

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

Есть ли какой-либо возможный предварительный загрузчик Catalyst для.so файла один раз для всех дочерних процессов?

2 ответа

Конкретное поведение, которое вы описываете, является особенностью mod_perl, а не самой Catalyst. Но вы можете, конечно, запустить приложение Catalyst в среде mod_perl.

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

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

Но если это то, что, по вашему мнению, соответствует вашим потребностям, то mod_perl может быть для вас средой.

Поддержка mod_perl с Catalyst находится в небольшом состоянии. Обычно предпочтительный метод заключается в использовании методов Plack :: Handler для загрузки Catalyst в качестве приложения PSGI в среду mod_perl. Есть некоторые дополнительные замечания по конфигурации здесь.


Я не знаю, какие опции доступны на встроенном сервере Catalyst, но, глядя на документацию для Starman, вы можете увидеть эту опцию:

--preload-приложение

Этот параметр позволяет Starman предварительно загружать указанное приложение PSGI в основной родительский процесс перед тем, как предворить детей. Это позволяет экономить память при управлении памятью с записью на запись. Если не установлено (по умолчанию), разветвленные дети загружают приложение в крючок инициализации.

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

Начиная со Starman 0.2000, эта опция по умолчанию имеет значение false, и вы должны явно установить эту опцию для предварительной загрузки приложения в мастер-процесс.

В качестве альтернативы вы можете использовать опцию командной строки -M (общий вариант plackup) для предварительной загрузки модулей, а не самого себя.starman -M Catalyst -M DBIx :: Class myapp.psgi

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

Если вы включите этот параметр, отправка HUP-сигнала в главный процесс не будет получать никаких изменений кода, которые вы делаете. Подробнее см. "СИГНАЛЫ".

licensed under cc by-sa 3.0 with attribution.