我们经常出现内存不足的情况,而且 fork 无法分配内存。我做了一些调查。
看来脚本并不是我之前想的那样。我将分析后得到的信息分享给大家。
我有隔离的服务器,所以其他人无法访问服务器。在这种情况下,这将显示“真实”内存使用情况。
- 我没有启动 mysqld 和 apache [内存使用量~182mb]。
- 刚刚启动了 mysqld。没有与 mysqld 建立连接 [mu ~340mb]。
- httpd 已启动 [~360mb]。
- 首次向脚本发出请求。[~630mb]。但是!!最有趣的部分。内存没有被释放。一切看起来都很好。脚本结束,页面加载成功。但它仍然在 ~630mb 左右。
为什么一个请求就占用了 270MB?为什么请求后没有释放?
一些统计数据:
- 服务器 RAM 保证 512 MB
- 256 MB 可突发
- PHP 内存限制:256MB
httpd配置文件
<IfModule prefork.c>
StartServers 1
MinSpareServers 1
MaxSpareServers 3
ServerLimit 50
MaxClients 50
MaxRequestsPerChild 50
</IfModule>
答案1
为什么一个请求会占用270MB?
可能是因为它访问了磁盘上的文件中或关于磁盘上的文件的大量数据或元数据。
为什么请求之后没有释放?
因为数据可能很快就会再次使用。请求后释放数据会使下一次请求变得昂贵。将释放延迟到内存真正需要用于其他用途时更有意义。