如何识别PHP进程内存问题并优化(EC2)?

时间:2017-03-03 02:50:42

标签: php apache memory amazon-ec2

我一直在四处寻找,但是没有成功并为我的案例寻找解决方案。

我注意到在我的EC2实例上运行PHP时需要大量内存(同时这似乎会增加HTTPD进程所需的内存,因为如果禁用PHP,HTTPD进程内存将会关闭扩展)

要执行简单的检查,我有Apache运行(HTTPD)和一个非常简单的php程序

<?php
while(true) {
   sleep(1);
   $x = 1;
}

然后,在一个单独的控制台上,我运行top命令和SHIFT+m按内存排序

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
31155 apache    20   0  936m 299m  27m S  0.0  7.6   0:00.48 httpd
31141 apache    20   0  935m 298m  27m S  0.0  7.5   0:00.41 httpd
31147 apache    20   0  936m 297m  26m S  0.0  7.5   0:00.41 httpd
31121 root      20   0  839m 294m  29m S  0.0  7.5   0:00.93 httpd
31505 ec2-user  20   0  630m 279m  16m S  0.0  7.1   0:00.81 php
31264 apache    20   0  847m 271m 6404 S  0.0  6.9   0:00.18 httpd
31266 apache    20   0  847m 271m 6404 S  0.0  6.9   0:00.18 httpd
31123 apache    20   0 1039m 271m 6400 S  0.0  6.9   0:00.30 httpd
31143 apache    20   0  847m 271m 6400 S  0.0  6.9   0:00.31 httpd
31145 apache    20   0  847m 271m 6400 S  0.0  6.9   0:00.30 httpd
31149 apache    20   0  847m 271m 6400 S  0.0  6.9   0:00.31 httpd
31151 apache    20   0  847m 271m 6400 S  0.0  6.9   0:00.31 httpd
31157 apache    20   0  847m 271m 6400 S  0.0  6.9   0:00.30 httpd
31261 apache    20   0  847m 271m 6244 S  0.0  6.9   0:00.17 httpd

您会注意到,尽管Apache服务刚刚启动并处于非活动状态,并且只是一个简单的PHP脚本,但它们都消耗了大量内存。

来自类似的问题How to optimize the php process memory usage?

我去了pmap -d 31505我找到了两个主要条目

31505:   php /home/ec2-user/infinite.php
Address           Kbytes Mode  Offset           Device    Mapping
0000000000400000    3044 r-x-- 0000000000000000 0ca:00001 php-5.5
...
00000000027a3000  265876 rw--- 0000000000000000 000:00000   [ anon ]
00007f9f1e249000    1028 rw--- 0000000000000000 000:00000   [ anon ]
...
00007f9f2de29000      32 rw--- 0000000000000000 000:00000   [ anon ]
00007f9f2de31000  103588 r---- 0000000000000000 0ca:00001 locale-archive
00007f9f3435a000     120 r-x-- 0000000000000000 0ca:00001 libselinux.so.1
00007f9f34378000    2044 ----- 000000000001e000 0ca:00001 libselinux.so.1
...

据此,我注意到一些[ anon ]使用了265Mb而文件locale-archive使用了103Mb

做了一些更多的研究,我对locale-archive有了更多了解,我发现系统/usr/lib/local/locale-archive上的文件大约是103Mb匹配。

我发现了另一个我尝试遵循的链接,以减少locale-archive文件的大小,但我遇到了同一链接上提到的所有问题,并且无法调整其大小。<登记/> (问题:/ usr / sbin / build-locale-archive:无法读取存档标题
https://unix.stackexchange.com/questions/90006/how-do-i-reduce-the-size-of-locale-archive

因此,似乎介于此[ anon ]locale-archive之间的某处导致PHP进程占用大量内存。

问题

  • 什么是[ anon ]以及如何减少它?
  • 缩小locale-archive的大小会有帮助吗? 如果是这样,我如何只使用glibc-common等单一区域设置重新安装en

这种需要的原因

我需要与至少10个进程并行运行PHP脚本 在尝试时,我注意到由于内存分配不足,许多进程无法启动 在试图找出这一点时,我注意到httddphp进程只消耗了不真实的内存

执行free -m收益

             total       used       free     shared    buffers     cached
Mem:         15042      14558        484         26        216        695
-/+ buffers/cache:      13645       1397
Swap:            0          0          0

所以,我几乎只有大约400Mb来运行这些脚本,这只允许我运行最多2个基于单个php脚本使用的默认294Mb,该脚本仅使用大约1kb的内存,但其余的是PHP过程本身。

现在,尽管httpd占用了大部分内存,但它似乎是使用该服务启动的基础PHP模块的间接结果。 (与我禁用PHP模块并且httpd进程下降到他们使用的内存的1/3的测试相比)

所以,它确实看起来PHP进程是责任者,受[ anon ]的影响,间接受locale-archive

的影响

如果我可以让PHP进程不使用这么多内存,那么我不仅可以运行10个脚本(我可以运行20或30)而且没有问题,Apache甚至可以拥有更多内存来提供更多连接我想。

0 个答案:

没有答案