php-fpm下使用eaccelerator产生的内存问题
使用EA或者类似的OP CODE加速器已经是搭建PHP环境的默认选项了 但是在使用nginx的环境内 会需要使用f...
扫描右侧二维码阅读全文
23
2009/06

php-fpm下使用eaccelerator产生的内存问题

使用EA或者类似的OP CODE加速器已经是搭建PHP环境的默认选项了
但是在使用nginx的环境内
会需要使用fastcgi方式来运行php
这种情况下.EA的内存占用可能会和你在APACHE下使用EA不同
由于APACHE调用PHP的方式是模块方式的
所有PHP是位于同一个进程下面的
所以所有PHP模块调用的EA是同一个的.
内存只会占用shm_size大小.
APACHE进程间共享这同一个EA
也就是如果你在ea的配置下面写了64M.则只会占用整个系统的64M
而如果用fastcgi模式
特别是php-fpm
每个php都是独立进程
导致每个PHP进程下面都会独立分配EA的内存
则总的内存占用量 = shm_size * php进程数
如果你还用64M的话.开启20个PHP进程就意味着你用掉了1280M内存.
虽然目前只是分配到虚拟内存
但是对于大型网站的话,
不久之后就会占用到了这么大量的内存.
目前具体如何解决还没有找到
但是大家需要注意这个情况.
不同进程间ea缓冲相同文件是否会导致两份数据目前还没有测试.

Last modification:November 26th, 2018 at 04:16 pm
If you think my article is useful to you, please feel free to appreciate

20 comments

  1. [...] 关闭php.ini中有关eaccelerator模 块加载 (参考 php-fpm下使用eaccelerator产生的内存问题) [...]

  2. Nathan
    Johnny Woo :
    进程缓存之间要共享数据是很麻烦的
    要么是IPC要么是文件池之类的.
    只有线程才默认是共享数据的.
    所以这个情况应该在APC以及XCACHE下面同样存在

    There is no chinese input,so that I have to write this in English.
    Could u do the same test using APC, and send the result to me? mail2:3602500@qq.com
    That's will be a great help for me,Thx.

  3. Johnny Woo

    to piggy:
    如果是内存公用,那么应该体现在VIRT很高,但是实际RES并不高,而且虽然VIRT高但是不会用到SWAP,因为这块虚拟内存是共享的,但是实际情况是VIRT的数量最后加起来接近SWAP和内存的总量,说明这部分内存是没有复用的.或者说即便是内容一样,也是被每个进程单独复制出来了.

  4. 君子堂

    补充:
    我想,APACHE下应该有同样的问题,就看php运行方式是prefork还是worker了。

  5. 美国VPS推荐

    这个没怎么研究过,用Nginx不知道会不会存在这个问题

  6. c1g

    我的内存占用很高,看来要减少点

    centos 5.2 64位
    nginx0.761+php5.2.10+php-fpm0.5.13+ea0.9.5.3
    96个php,shm_size=64M
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    7565 nobody 16 0 235m 97m 63m S 3.7 1.2 18:34.29 php-cgi
    8242 nobody 16 0 235m 96m 61m S 3.7 1.2 18:18.20 php-cgi
    ================================
    as4 32位
    nginx0.6.32+php5.2.6+php-fpm0.5.8+xcache-1.2.2
    80个php,xcache_size=32M
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    15037 nobody 16 0 55120 22m 19m S 1.0 1.1 0:28.97 php-cgi
    15047 nobody 16 0 55212 25m 22m S 1.0 1.3 0:30.82 php-cgi
    15064 nobody 16 0 54800 22m 20m S 0.7 1.1 0:28.99 php-cgi

    =========================================
    centos 5.2 64位
    nginx0.6.32+php5.2.6+php-fpm0.5.8+xcache-1.2.2
    64个php,xcache_size=32M
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    31001 nobody 16 0 174m 19m 12m S 5 0.2 5:02.87 php-cgi
    29429 www 15 0 48840 36m 884 S 1 0.5 232:41.13 nginx
    685 nobody 15 0 176m 17m 12m S 0 0.2 5:03.62 php-cgi
    689 nobody 16 0 178m 23m 16m S 0 0.3 4:44.94 php-cgi

  7. Hofacker

    Thanks for this. Bookmarked.

  8. Cat.

    学习....
    VPS,安装eaccelerator用处不大啊

  9. Willko

    ^_^

    围观和学习

  10. April

    Pretty cool post. I just came across your blog and wanted to say
    that I've really enjoyed browsing your posts. Anyway
    I'll be subscribing to your blog and I hope you write again soon!

  11. JulyClyde

    apache+mod_php 工作于prefork模式下,其实也是很多进程而非线程吧?
    附属于多个apache子进程的mod_php之间怎样共享opcode缓存呢?

  12. Johnny Woo

    父进程只有一个,就是PHP-FPM本身的管理进程.
    所有子进程的VIRT占用数是每个进程一个独立EA的
    这个你做下测试就知道了.shm_size一开大之后
    所有子进程直接VIRT增加

    root 30180 0.0 0.1 151624 3436 ? Ss 11:07 0:00 php-cgi --fpm --fpm-config php-fpm.conf
    www 30181 0.5 0.3 150964 8012 ? S 11:07 0:29 php-cgi --fpm --fpm-config php-fpm.conf
    www 30182 0.5 0.3 150964 7340 ? S 11:07 0:28 php-cgi --fpm --fpm-config php-fpm.conf
    www 30183 0.5 0.3 150964 7516 ? S 11:07 0:29 php-cgi --fpm --fpm-config php-fpm.conf
    www 30184 0.5 0.3 150964 7340 ? S 11:07 0:29 php-cgi --fpm --fpm-config php-fpm.conf
    www 30185 0.5 0.3 150964 7724 ? S 11:07 0:26 php-cgi --fpm --fpm-config php-fpm.conf

  13. piggy

    1. 可以用 ipcs -m 看一下,实际上就一块ea的
    2. ps, top 或 lsof 看的内存都是"面向独自视角"的,它们显示的值是每个fpm自占内存,再都加上了ea的那唯一的一块共享内存的总结果

  14. 老王

    解决方法就是父进程别设太多,使用ea的情况下一般2~3个

  15. 老王

    文章提到:如果你还用64M的话.开启20个PHP进程就意味着你用掉了1280M内存.

    我印象中这是不对的,php进程分两种:你用ps aux查看的时候,会看到有的是Ss状态,有的是s状态,Ss状态的是父进程,s状态的是子进程,有多少个父进程,就占用多少份ea内存,和子进程无关。

  16. Johnny Woo

    进程缓存之间要共享数据是很麻烦的
    要么是IPC要么是文件池之类的.
    只有线程才默认是共享数据的.
    所以这个情况应该在APC以及XCACHE下面同样存在

  17. Willko

    进程缓存不共享,是ea独有的吧?

  18. Johnny Woo

    最好是试过以后再对我说文档里面写的内容
    文档的内容是针对APACHE的模块性PHP来说的
    那种形式下的PHP是单一进程的
    但是FASTCGI是多进程的.
    不是多虑,而是实际验证的.

  19. 君子堂

    There is just one restriction: all the worker processes, will use the same cache, even if the workers are started under a different uid/gid.

    使用ea的时候,所有的worker进程,共享一个cache。

    作者多虑了。

  20. 君子堂

    很惭愧,盲目的相信了文档。

    我的ubuntu原先是nginx+php-fpm+memcaches+ea
    稳定之后php-cgi的每个进程能占用达到80多M的内存资源。4G内存被他们吃掉大部分(40个进程)。搞得经常要使用swap(多的时候高达3G swap)

    24号我的服务器系统毁了,重新安装之后,阴差阳错,就没有安装ea;
    结果现在发现,稳定之后php-cgi只占用20M内存。

    这多出来的60M大概就是ea的内存空间(我原先给ea开的是64MB)吧。
    现在贴出服务器正常运行4天多的服务器资源——内存剩余2G做系统cache、swap只用了45M:

    top - 21:44:42 up 4 days, 3:37, 1 user, load average: 1.30, 1.05, 0.73
    Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie
    Cpu(s): 26.4%us, 6.6%sy, 0.0%ni, 62.6%id, 3.8%wa, 0.0%hi, 0.5%si, 0.0%st
    Mem: 4053420k total, 4000708k used, 52712k free, 295092k buffers
    Swap: 7920004k total, 45136k used, 7874868k free, 2112600k cached

    实践出真知啊!

Leave a Comment