我的VPS帐户偶尔会耗尽内存。它在Linux上使用Apache。支持称这是一个缓慢的内存泄漏,并使MaxRequestsPerChild能够处理它。
我对此有几个问题。当子进程死亡时,它会导致我的脚本丢失会话数据吗?有没有人有关于如何追踪内存泄漏的建议?
由于
答案 0 :(得分:0)
不,当子进程死亡时,您不会丢失任何数据,除非它当时处于请求的中间(如果由于MaxRequestsPerChild而退出,则不会发生这种情况)。
您应该尝试使用测试系统上相同的软件堆栈重现内存泄漏。您可以使用Valgrind等工具来尝试检测它。
您还可以尝试调试构建Web服务器及其模块,这样您就可以检测到正在发生的事情。
很难重现非生产系统中生产系统的行为。如果您对Web应用程序进行了自动测试,则可以尝试使用完整的自动测试套件,但实际上这不太可能涵盖每个代码路径,因此可能会漏掉漏洞。
答案 1 :(得分:0)
当子进程终止时,是否会导致我的脚本丢失会话数据?
在不知道您使用的脚本语言和会话处理程序(以及实际代码)的情况下,很难说。
在大多数情况下,在模块中使用脚本语言或通过[fast] cgi使用脚本语言,那么会话数据实际上不会丢失 - 尽管如果进程在处理请求的过程中死亡,它可能无法获得机会将更新的会话写回存储会话的任何内容。并且在回写期间它很可能发生死亡,它可能会破坏会话数据。这些都是非常特殊的情况。
OTOH如果您的应用程序逻辑是通过守护程序(例如Java容器)实现的,则很可能会累积内存泄漏(尽管这些将针对不同的进程进行报告)。
请注意,如果通过设置MaxRequestsPerChild来缓解问题,那么它意味着问题发生在Apache模块中。
根据我的经验,Apache本身的生产版本非常稳定,没有内存泄漏。但是我没有使用所有模块。不确定ExtendedStatus是否给出了模块内存使用量的突破 - 可能值得检查。
我之前看到PHP模块加载的模块的内存管理存在问题,不考虑PHP的内存限制 - 但这些问题在请求结束时确实已经明确了。
下进行。