【问题标题】:Keep perl XSUB SharedObject loaded under mod_perl保持在 mod_perl 下加载 perl XSUB SharedObject
【发布时间】:2011-12-26 14:41:09
【问题描述】:

我为一个非常简单的 C API(我没有源代码)编写了一个 perl XSUB 包装器。

C API 由 4 个函数组成。其中一个返回一个“句柄”(只是一个 int),并且这个值必须传递回其他 3 个函数中的任何一个,以获取正确的内部“对象”来调用。假设 C API 保留了这些对象的列表,并为提供的句柄提供了正确的对象。

在独立脚本中运行时,一切正常。

我现在正在尝试使用 mod_perl 让这个 API 在 apache2 下运行。最初,一切正常 - 我将“句柄”返回给客户端,然后客户端使用相同的句柄值进行后续调用。但是,在一段(非常短的)不活动之后,C API 决定它已经丢失了它的“对象”列表并重新开始。

我认为这是因为正在卸载底层 .so 文件。

所以,我的问题:

我能做些什么来防止 apache/perl 卸载这个 .SO?唯一可行的方法是使用 -X 在调试模式下运行 apache。

谢谢

【问题讨论】:

    标签: perl mod-perl


    【解决方案1】:

    我认为这是因为正在卸载底层 .so 文件。

    不,这是因为不同的 apache 子节点获得了 HTTP 请求,并且它不知道其他子节点的任何信息

    http://perl.apache.org/docs/1.0/guide/porting.html的基本信息

    【讨论】:

    • 谢谢。我希望使用 apache 工作线程 mpm 而不是 fork 来避免这个问题,但这似乎做同样的事情?
    【解决方案2】:

    我认为问题在于 SO 必须为第一个请求进行大量初始化,并且您希望避免重复执行此操作。

    调整 MPM 设置可能会有所帮助。

    根据 MPM 文档,您可以通过设置适当的指令来避免子进程被终止和重新启动。

    除了一组活动的子进程之外,可能还有其他子进程正在终止,但至少有一个服务器线程仍在处理现有的客户端连接。最多可能存在 MaxClients 终止进程,但实际数量可能会小得多。这种行为可以通过禁用个别子进程的终止来避免,这可以通过以下方式实现:

    • MaxRequestsPerChild 的值设置为零

    • MaxSpareThreads的值设置为与MaxClients相同的值

    这意味着关闭了调节子进程生命周期的两种机制。首先,进程在 MaxRequestsPerChild 之后自动终止并重新启动。将其设置为零会禁用此功能。其次,如果有超过 MaxSpareThreads 处于空闲状态,则可能会剔除子进程以节省服务器资源。第二个指令禁用该进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多