如何优化php进程的内存使用情况?

我正在运行一个WordPress的网站,每个PHP进程使用大约200mb到250mb常驻大小的内存。 有了16GB的内存,服务器只能处理大约70个进程。 通过增加虚拟内存到16GB,它可以处理140.之后,负载不断上升。 如果10分钟内有200个连接,那么3Ghz四核xeon处理器上的服务器负载将达到20个!

我已经尝试停用所有的插件,但这只会减less每个进程的PHP内存使用量不到10%。 suPHP告诉我哪个用户正在使用这么多的内存,而不是wordpress代码的哪一部分。

任何有关如何减less内存使用的build议? 或者是我唯一的select升级到32GB的内存?

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10585 nobody 16 0 2266m 237m 199m S 21.3 1.5 1:09.17 /usr/bin/php 10597 nobody 16 0 2257m 255m 226m S 15.3 1.6 0:17.56 /usr/bin/php 

来自pmap -d的最大输出

 000000000e8b8000 27580 rw--- 000000000e8b8000 000:00000 [ anon ] 00002b3772850000 2097152 rw-s- 0000000000000000 000:00009 [ shmid=0x2d1b803a ] 00002b37f2a62000 55108 r---- 0000000000000000 0fd:00000 locale-archive mapped: 2320852K writeable/private: 30012K shared: 2097152K 

ipcs输出

 ------ Semaphore Arrays -------- key semid owner perms nsems 0x000000a7 0 root 600 1 0x00000000 162529281 nobody 600 1 0x00000000 162562050 nobody 600 1 0x00000000 162594819 nobody 600 1 0x00000000 162627588 nobody 600 1 ------ Message Queues -------- key msqid owner perms used-bytes messages` 

Solutions Collecting From Web of "如何优化php进程的内存使用情况?"

我将总结一下Lisa如何找到问题所在:

  • pmap -d <pid>检查单个PHP进程的内存布局。 输出显示进程使用了​​大量的共享内存:
 00002b3772850000 2097152 rw-s- 0000000000000000 000:00009 [ shmid=0x2d1b803a ] 
  • ipcs -m检查共享内存区域。 它表明有很多用户nobody(Web服务器)创建的共享内存区域,这里只是其中的几个:
 0x00000000 117964807 nobody 600 2147483648 1 dest 0x00000000 117997576 nobody 600 2147483648 1 dest 0x00000000 118030345 nobody 600 2147483648 1 dest 0x00000000 118063114 nobody 600 2147483648 1 dest 
  • 在php.ini中禁用eAccelerator并删除创建的共享内存区域:

因为我在`ipcs -m | 切-d''-f2 | grep'^ [0-9]'; 做ipcrm -m $ i; DONE

Rasmus Lerdorf在2010年在Confoo做了关于PHP性能的一个会议,他用一个Wordpress博客作为例子,这会给你很好的工具来回答你的问题:

http://talks.php.net/show/confoo10/1

总结一下:

  • 运行phpinfo()并禁用不使用的PHP扩展。 他们可以花费很多的记忆(想象,卷曲,…)
  • 使用inclued.so扩展名生成包含图。 你可能会加载你的WordPress的设置无用的功能。
  • siege运行基准。 有时,微小的优化会对性能产生很大的影响,因此请确保您有指标,以帮助您做出决定。
  • 使用callgrind来显示你失去表现的地方。 在我的一个项目中,我使用md5()来散列我的SQL查询并缓存它们。 md5()调用了20%的CPU时间。

如果可能的话,我肯定会先禁用PHP扩展。