我为一个非常简单的C API编写了一个perl XSUB包装器(我没有源代码)。
C API由4个函数组成。其中一个返回一个“句柄”(只是一个int),这个值必须传递回任何其他3个函数,以获得正确的内部“对象”来调用。假设C API保留了这些对象的列表,并为提供的句柄抛出正确的对象。
在独立脚本中运行时,一切都很好。
我现在正尝试使用mod_perl在apache2下运行此API。最初,一切正常 - 我将“句柄”返回给客户端,然后客户端使用相同的句柄值进行后续调用。但是,在(非常短暂的)不活动时段之后,C API决定它丢失了它的“对象”列表并重新开始。
我认为这是因为正在卸载底层的.so文件。
所以,我的问题:
我有什么办法可以防止apache / perl卸载这个.SO吗?唯一可行的方法是使用-X在调试模式下运行apache。
由于
答案 0 :(得分:2)
我认为这是因为正在卸载基础.so文件。
不,这是因为一个不同的apache子获取HTTP请求,并且它对其他子节点一无所知
的基本详情答案 1 :(得分:0)
我认为问题在于SO必须为第一个请求进行大量初始化,并且您希望避免重复这样做。
如果您调整MPM设置,可能会有所帮助。
根据MPM文档,您可以通过设置适当的指令来避免子进程被终止和重新启动。
除了活动子进程集之外,还可能有其他子进程正在终止,但至少有一个服务器线程仍在处理现有客户端连接。尽管可以预期实际数量可以小得多,但是可以存在最多MaxClients终止过程。通过禁用单个子进程的终止可以避免此行为,这可通过以下方式实现:
将
MaxRequestsPerChild
的值设为零将
MaxSpareThreads
的值设置为与MaxClients
相同的值
这意味着关闭了调节子进程生命周期的两种机制。首先,进程在MaxRequestsPerChild之后自动终止并重新启动。将其设置为零会禁用此功能。其次,如果有多个MaxSpareThreads闲置,可以剔除子进程以节省服务器资源。第二个指令禁用该过程。