我有一个催化剂网络服务器。我可以看到每个子服务器进程分别加载了大量相同的.so文件,这会占用大量内存。
对于所有子进程,是否有任何可能的Catalyst预加载所有.so文件一次?
答案 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还有一些其他说明。