【问题标题】:How to optimize the php process memory usage?如何优化php进程内存使用?
【发布时间】:2012-04-27 15:35:04
【问题描述】:

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

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

关于如何减少内存使用的任何建议?还是我唯一的选择是升级到 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`

【问题讨论】:

  • 您是否已经尝试安装 APC 或一些类似的操作码缓存解决方案?
  • 是的。我正在使用 eAccelerator 和 Zend Optimizer。 APC 目前不包含在 cPanel 中。其他两个可以用easyapache编译。
  • 这很奇怪,我正在运行一些托管服务器,大多数 PHP 实例消耗 7 到 50 MB 的 RSS 内存。我的建议是: 1. 升级到 php 5.4(因为减少了内存占用)。 2.在wordpress前面安装一些反向代理(如varnish)。
  • @strkol cpanel 尚未提供 5.4。像清漆这样的反向代理可以减少负载并使服务器处理更多流量。但我不会帮助找出导致问题的原因。有些东西导致 PHP 消耗 200 到 250 MB 的 RSS 内存,我只是不知道如何找到它。谢谢你的提示。
  • @Lisa,你能粘贴 pmap -d 的输出吗?

标签: php linux wordpress centos


【解决方案1】:

我将总结一下丽莎为找到问题所做的工作:

  • 使用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 并删除创建的共享内存区域:

对于 i in `ipcs -m |剪切-d''-f2 | grep '^[0-9]'`;做 ipcrm -m $i;完成

【讨论】:

    【解决方案2】:

    Rasmus Lerdorf 于 2010 年在 Confoo 举办了一次关于 PHP 性能的会议,他以 Wordpress 博客为例,这应该为您提供了很好的工具来回答您的问题:

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

    总结一下:

    • 运行phpinfo() 并禁用您不使用的PHP 扩展。它们会占用大量内存(imagick、curl 等)
    • 使用 included.so 扩展生成包含图表。您可能会在您的 wordpress 设置中加载无用的函数。
    • 使用siege 运行基准测试。有时,微小的优化会对性能产生很大影响,因此请确保您有指标,以帮助您做出决定。
    • 使用 callgrind 显示性能下降的地方。在我的一个项目中,我使用md5() 来散列我的 SQL 查询并缓存它们。 md5() 调用使用 20% 的 CPU 时间。

    如果可能,我肯定会从禁用 PHP 扩展开始。

    【讨论】:

    • 谢谢。 Strkol 发现加速器是问题所在。禁用时,PHP 每个进程仅使用 60m 到 80m RES。
    • @Lisa 没问题。如果有机会,请查看 Rasmus Lerdorf 建议的工具。这是一个很棒的演讲!
    • 问题是关于内存而不是速度优化。
    猜你喜欢
    • 2017-08-15
    • 2010-11-09
    • 2011-04-08
    • 1970-01-01
    • 2014-05-05
    • 2015-12-09
    • 2014-04-25
    • 2015-07-05
    • 2011-09-06
    相关资源
    最近更新 更多