突然我的服务器内存不足。我尝试使用“df -k”命令检查磁盘空间,但看起来一切正常。因此,在跟踪了很多事情之后,我发现 httpd 服务将已删除的文件保存在临时内存中,无法通过“df -k”进行跟踪。为了检查仍在服务中的最后删除的文件,我使用了“sudo lsof | grep removed”这个命令。
httpd 58324 58501 apache 8ur REG 253,0 0 279075355 /tmp/.ZendSem.SpCcXd (已删除)
这是 centos7 (linux) 服务器上的 Magento 应用程序,安装了 apache 2.4.6,花了一些时间后我发现,当停止 apache 并运行“sudo lsof | grep removed”这个命令时,我没有遇到任何此类问题。一旦我启动 apache 并检查“sudo lsof | grep removed”命令,就会再次显示如所附屏幕截图所示的内容。
答案1
我在不同的平台上使用不同的应用程序时都遇到过这个问题。这是一个常见的编码问题,使用文件的代码在使用完文件后不会关闭文件。代码在使用完文件后应该始终关闭文件。
保护临时文件的一种常见方法是打开文件,删除它,然后使用它。这可能就是这里所做的。但是,该文件仍然存在,直到它被关闭。
一个解决方法是限制 Apache 子进程在关闭前处理的请求数。子进程退出时文件将被关闭。将 MaxRequestsPerChild 设置为 100 到 1000 之间的某个值可能会缓解此问题。默认值为 10000。