nginx+php的内存占用问题

64 views
Skip to first unread message

Yorgo Sun

unread,
Jun 3, 2009, 4:21:47 AM6/3/09
to cng...@googlegroups.com
各位有没有用nginx配php的,目前我发现php进程占用内存很大,基本上一个进程占用20多兆物理内存,如果进程开少了,并发响应上不去,开多了,都20多M的时候系统总内存又不够,多次都因为swap吃光而死机。我的应用里面应该有很多人通过php下载物理文件,这是应用的一个策略,没让用户直接下载而是用php打开然后再写到用户那面去,所以我怀疑是不是这个问题导致的问题呢?

另外我设置了每个php的存活时间,访问到一定程度的时候自然就会销毁,但是实际好像没有销毁,这是不是也是一个问题,请大家帮我分析一下

谢谢

--
孙绍轩 Yorgo Sun

Delta Yeh

unread,
Jun 3, 2009, 8:25:10 AM6/3/09
to cng...@googlegroups.com
你让PHP操作一遍,当然慢了。
NGINX和擅长服务静态文件的,你可以应用做一些逻辑检查,通过后用302转到一个URL以静态文件方式下载啊。
为了保证安全,这个时候可能需要用上 secure link模块了。
2009/6/3 Yorgo Sun <yorg...@gmail.com>

Yorgo Sun

unread,
Jun 3, 2009, 8:58:03 AM6/3/09
to cng...@googlegroups.com
实际测试发现php会处理下载文件的问题,没有占用太多内存和cpu,绕过去了,问题并不在这里。

换上php-fpm好一些了,继续观察中

2009/6/3 Delta Yeh <delt...@gmail.com>



--
孙绍轩 Yorgo Sun

Willko Cheng

unread,
Jun 3, 2009, 9:01:56 AM6/3/09
to cnginx
php5.2.8有内存泄漏bug
2009-06-03

Willko Cheng

发件人: Yorgo Sun
发送时间: 2009-06-03  20:58:09
收件人: cnginx
抄送:
主题: Re: nginx+php的内存占用问题

Zou Yong

unread,
Jun 3, 2009, 9:19:38 AM6/3/09
to cng...@googlegroups.com
之前用的什么呢?lighttpd的那个spawn-fcgi吗?我现在用的spawn-fcgi,一般php也就6、7M的内存,VIRT是虚拟内存占用么?那个倒是挺高
 
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2724 apache    15   0 10200 3500  972 S    0  0.1  13:06.34 nginx                                                                        
 2762 root      15   0 25088  716  356 S    0  0.0   5:13.01 searchd                                                                      
 3096 apache    15   0 38536 6684 4228 S    0  0.2   0:00.65 php-cgi                                                                      
 3179 apache    15   0 38544 6796 4220 S    0  0.2   0:00.64 php-cgi                                                                      
 3406 apache    15   0 38332 6504 4140 S    0  0.2   0:00.65 php-cgi                                                                      
 3791 apache    15   0 38292 6508 4196 S    0  0.2   0:00.57 php-cgi                                                                      
 4130 apache    15   0 38240 6044 3756 S    0  0.2   0:00.52 php-cgi                                                                      

2009/6/3 Yorgo Sun <yorg...@gmail.com>

Delta Yeh

unread,
Jun 3, 2009, 10:06:40 AM6/3/09
to cng...@googlegroups.com
我的意思用PHP处理一遍文件,
1.慢是可预见的。
2.如果PHP脚本没写好,单个PHP CGI占用很多内存也是可能的。单个CGI占用了过多内存,不就导致你整体服务能力下降了么?

你可以:
 1. 优化PHP脚本,使单个CGI占用内存数降到最低
 2.用NGINX来处理文件下载,降低由CGI占用的内存,同时提升系统整体服务能力。

2009/6/3 Yorgo Sun <yorg...@gmail.com>

Yorgo Sun

unread,
Jun 3, 2009, 10:46:30 AM6/3/09
to cng...@googlegroups.com
我现在用的是php 5.2.9
之前是spawn模式,每个大概消耗20多兆,换成php-fpm后每个10几兆,是物理内存,不是虚拟的那个,虚拟的那个要到100多200多兆了。

效率问题肯定有的,准备用nginx直接做下载,目前正在想怎么管理下载文件,毕竟这些东西最好不能直接下载,就是防盗功能。
php的程序按说没有问题,现在也没有办法判断是什么导致php cgi占用过大,难道是完全的面向对象导致的?

php目前常用的是下列模块
PDO
PDO:mysql
memcache
imagick


2009/6/3 Delta Yeh <delt...@gmail.com>



--
孙绍轩 Yorgo Sun

Yorgo Sun

unread,
Jun 3, 2009, 10:48:09 AM6/3/09
to cng...@googlegroups.com
我现在的情况
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
15179 apache    15   0 50632  32m  732 S    0  1.6   0:23.90 nginx
15177 apache    15   0 38952  21m  732 S    0  1.1   0:22.97 nginx
15443 php       15   0  154m  18m 5676 S    0  0.9   0:17.56 php-cgi
15425 php       16   0  154m  18m 5680 S    0  0.9   0:18.83 php-cgi
15471 php       15   0  155m  18m 5744 S    0  0.9   0:17.65 php-cgi
15450 php       16   0  157m  18m 5856 S    0  0.9   0:18.92 php-cgi
15468 php       16   0  153m  18m 5684 S    0  0.9   0:17.95 php-cgi
15428 php       15   0  155m  17m 5704 S    0  0.9   0:17.14 php-cgi
15462 php       15   0  153m  17m 5684 S    0  0.9   0:17.49 php-cgi
15472 php       16   0  155m  17m 5772 S    0  0.9   0:16.93 php-cgi
15455 php       16   0  155m  17m 5676 S    0  0.9   0:18.13 php-cgi


2009/6/3 Yorgo Sun <yorg...@gmail.com>
我现在用的是php 5.2.9



--
孙绍轩 Yorgo Sun

Delta Yeh

unread,
Jun 3, 2009, 10:57:18 AM6/3/09
to cng...@googlegroups.com
防盗链的问题,你可以看看secure link模块。既然是你自己的PHP脚本生成的下载链接,使用这个模块技术上应该没问题的。

PHP处理的内容越多,占用内存就越大。我PHP用的不多,个人觉得:PHP只适合做做那种“扁平”业务的CGI。


2009/6/3 Yorgo Sun <yorg...@gmail.com>

Zou Yong

unread,
Jun 3, 2009, 11:23:45 AM6/3/09
to cng...@googlegroups.com
你的php死不是加载的模块太多了?把不用的都去掉吧,我就加载了需要的

2009/6/3 Yorgo Sun <yorg...@gmail.com>

坏人

unread,
Jun 3, 2009, 11:51:37 AM6/3/09
to cnginx
你为啥不把下载转发给nginx操作?php输出文件占用内存大,效率还不高
别告诉我你用的是file_get_contents,这个巨慢。如果一根筋非要用php,起码也要readfile
最好的就是用sendfile,巨方便,资源占用巨低,防盗链还容易,由php接手随便你

On 6月3日, 下午4时21分, Yorgo Sun <yorgo...@gmail.com> wrote:
> 各位有没有用nginx配php的,目前我发现php进程占用内存很大,基本上一个进程占用20多兆物理内存,如果进程开少了,并发响应上不去,开多了,都20-多M的时候系统总内存又不够,多次都因为swap吃光而死机。我的应用里面应该有很多人通过php下载物理文件,这是应用的一个策略,没让用户直接下载而是用p-hp打开然后再写到用户那面去,所以我怀疑是不是这个问题导致的问题呢?

坏人

unread,
Jun 3, 2009, 11:55:45 AM6/3/09
to cnginx
用sendfile,看起来仍然是php输出,只是系统内部交接了处理权,php在输出完文件地址后就歇菜了。
因为由php控制是否sendfile,所以并不需要额外的第三方模块去防盗链
try_files也可以做到这点,办法太多了。总之nginx非常灵活,不怕做不到就怕想不到。人有多大胆地有多大产,哈

On 6月3日, 下午8时25分, Delta Yeh <delta....@gmail.com> wrote:
> 你让PHP操作一遍,当然慢了。
> NGINX和擅长服务静态文件的,你可以应用做一些逻辑检查,通过后用302转到一个URL以静态文件方式下载啊。
> 为了保证安全,这个时候可能需要用上 secure link模块了。

> 2009/6/3 Yorgo Sun <yorgo...@gmail.com>
>
>
>
>
>
> > 各位有没有用nginx配php的,目前我发现php进程占用内存很大,基本上一个进程占用20多兆物理内存,如果进程开少了,并发响应上不去,开多了,都20-多M的时候系统总内存又不够,多次都因为swap吃光而死机。我的应用里面应该有很多人通过php下载物理文件,这是应用的一个策略,没让用户直接下载而是用p-hp打开然后再写到用户那面去,所以我怀疑是不是这个问题导致的问题呢?


> > 另外我设置了每个php的存活时间,访问到一定程度的时候自然就会销毁,但是实际好像没有销毁,这是不是也是一个问题,请大家帮我分析一下
>
> > 谢谢
>
> > --

> > 孙绍轩 Yorgo Sun- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Yorgo Sun

unread,
Jun 3, 2009, 8:54:48 PM6/3/09
to cng...@googlegroups.com
 现在用的是readfile函数,不知道你说的sendfile是哪个部分的,是nginx还是php
readfile也是这样转交给系统的,php自己不做什么过多的处理

昨天的问题估计是spawn-php分出来的进程没有按照规则重新启动,导致累计的占用内存过多,另外访问量大加上正好那个时候跑了一个后台的程序占用内存。可以说都赶在一起了。

用nginx直接下载的问题回头可以研究一下,主要解决动态地址授权以及下载物理文件名和用户保存文件名不一致等问题,转给nginx我相信应该会很快。

至于加载php模块的问题,目前用的都是必要的,除了memcache, imagick通过模块加载,其它的都编译在php内部,所以可能不够敏捷,回头可以重新编译一个轻巧的版本出来再试试。

2009/6/3 坏人 <eel...@foxmail.com>



--
孙绍轩 Yorgo Sun

Reply all
Reply to author
Forward
0 new messages