Perl Catalyst:在子服务器进程之间共享.so文件的可能性

时间:2014-04-04 00:47:41

标签: perl catalyst

我有一个催化剂网络服务器。我可以看到每个子服务器进程分别加载了大量相同的.so文件,这会占用大量内存。

对于所有子进程,是否有任何可能的Catalyst预加载所有.so文件一次?

2 个答案:

答案 0 :(得分:1)

我不知道内置Catalyst服务器中有哪些选项,但查看Starman的文档会显示以下选项:

  

- 预压应用

     

此选项允许Starman预加载指定的PSGI应用程序   在预备孩子之前掌握父母过程。这允许记忆   通过写时复制内存管理节省成本。未设置时(默认),   forked children在初始化钩子中加载应用程序。

     

启用此选项可能会导致资源不佳等问题   主服务器在加载时打开套接字或数据库连接   过程并由多个孩子共享。

     

自Starman 0.2000以来,此选项默认为false,您应该这样做   显式设置此选项以在主服务器中预加载应用程序   过程

     

或者,您可以使用-M命令行选项(plackup常用   选项)预加载模块而不是   本身.starman -MCatalyst -MDBIx :: Class myapp.psgi

     

将加载主进程中的模块以节省内存   CoW,但myapp.psgi的实际加载是按照每个孩子完成的,   允许资源管理(如数据库连接)更安全。

     

如果启用此选项,则将HUP信号发送到主进程   不会接受您所做的任何代码更改。参见" SIGNALS"详情。

答案 1 :(得分:1)

您描述的特定行为是mod_perl的特征,而不是Catalyst本身。但是你当然可以在mod_perl环境下运行你的Catalyst应用程序。

在mod_perl下,只能加载共享库文件一次,并且不可能有不同的版本。除了为多个孩子节省加载之外,这实际上可以在同一服务器上的不同应用程序上工作。因此,使用mod_perl解释器的两个不同的Web应用程序实际上将共享它们都使用的lirbrary的加载实例。

出于这个原因,大多数人通常更喜欢不使用mod_perl作为服务其应用程序的方法,因为他们实际上希望为每个应用程序维护不同的库版本。由于上述原因,在这种环境下这是不可能的。

但如果您认为这符合您的需求,则mod_perl可能适合您。

对Catalyst的mod_perl的支持处于轻微的变化状态。通常首选的方法是使用Plack::Handler方法将Catalyst作为PSGI应用程序引导到mod_perl环境。关于配置here还有一些其他说明。

相关问题