我不确定我是否有内存泄漏问题(正如我的托管公司所建议的那样),或者我们是否都需要阅读http://linuxatemyram.com。也许你们这些聪明人可以帮助我们?
这是一台前端 Web 服务器虚拟机,主要在 RHEL 5.5 上运行 nginx 和 php-fpm。该服务器为 Magento(一款 PHP 电子商务产品)提供支持。该服务器在共享环境中运行,但我们很快就会改变这种情况。
无论如何……重启后服务器运行良好,但一天之内就会变得一无所有。页面加载需要 2 分钟,CPU 峰值疯狂上升,等等。当我通过 SSH 登录时,控制台甚至变得迟缓。就好像我的整个服务器都瘫痪了。
我还通过 top 和 tcpdumping 传入流量来监控数据库服务器。数据库在“缓慢”加载时间的大部分时间里处于空闲状态。当我开始看到来自前端服务器的查询时,页面很快就会加载。
这是我在速度变慢期间登录并重新启动 php-fpm 后的一些统计数据:
[mike@front01 ~]$ free -m
total used free shared buffers cached
Mem: 5963 5217 745 0 192 314
-/+ buffers/cache: 4711 1252
Swap: 4047 4 4042
[mike@front01 ~]$ top
top - 11:38:55 up 2 days, 1:01, 3 users, load average: 0.06, 0.17, 0.21
Tasks: 131 total, 1 running, 130 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.3%sy, 0.0%ni, 99.3%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 6106800k total, 5361288k used, 745512k free, 199960k buffers
Swap: 4144728k total, 4976k used, 4139752k free, 328480k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31806 apache 15 0 601m 120m 37m S 0.0 2.0 0:22.23 php-fpm
31805 apache 15 0 549m 66m 31m S 0.0 1.1 0:14.54 php-fpm
31809 apache 16 0 547m 65m 32m S 0.0 1.1 0:12.84 php-fpm
32285 apache 15 0 546m 63m 33m S 0.0 1.1 0:09.22 php-fpm
32373 apache 15 0 546m 62m 32m S 0.0 1.1 0:09.66 php-fpm
31808 apache 16 0 543m 60m 35m S 0.0 1.0 0:18.93 php-fpm
31807 apache 16 0 533m 49m 30m S 0.0 0.8 0:08.93 php-fpm
32092 apache 15 0 535m 48m 27m S 0.0 0.8 0:06.67 php-fpm
4392 root 18 0 194m 10m 7184 S 0.0 0.2 0:06.96 cvd
4064 root 15 0 154m 8304 4220 S 0.0 0.1 3:55.57 snmpd
4394 root 15 0 119m 5660 2944 S 0.0 0.1 0:02.84 EvMgrC
31804 root 15 0 519m 5180 932 S 0.0 0.1 0:00.46 php-fpm
4138 ntp 15 0 23396 5032 3904 S 0.0 0.1 0:02.38 ntpd
643 nginx 15 0 95276 4408 1524 S 0.0 0.1 0:01.15 nginx
5131 root 16 0 90128 3340 2600 S 0.0 0.1 0:01.41 sshd
28467 root 15 0 90128 3340 2600 S 0.0 0.1 0:00.35 sshd
32602 root 16 0 90128 3332 2600 S 0.0 0.1 0:00.36 sshd
1614 root 16 0 90128 3308 2588 S 0.0 0.1 0:00.02 sshd
2817 root 5 -10 7216 3140 1724 S 0.0 0.1 0:03.80 iscsid
4161 root 15 0 66948 2340 800 S 0.0 0.0 0:10.35 sendmail
1617 nicole 17 0 53876 2000 1516 S 0.0 0.0 0:00.02 sftp-server
...
还有什么我应该看的吗,或者还有什么可能有用的信息?我只是一名开发人员,但这个系统的减速让我很担心,让我很难完成工作。
帮帮我,ServerFault!
答案1
以防其他人也遭遇同样的遭遇。
我们刚刚遇到了同样的问题。php5-fpm 内存泄漏。每次页面请求都会耗尽 RAM,最终达到最大容量。然后 CPU 进入超速状态,KSWAP 进程运行交换磁盘。
唯一可以修复的问题(虽然不是理想的设置)是更改我们的 www.conf 池文件
pm = 动态
到
pm=按需
记忆现在看起来很稳定。
答案2
有两件事需要检查:
最有可能是内存泄漏。
pm.max_requests
在处理完这么多请求后,将终止/重新启动 php-fpm 子进程。由于您的机器需要大约一天的时间才能变慢,请尝试将其设置为一个数字,以使每个子进程每 20 分钟左右重新生成一次。因此,如果您每分钟收到 200 个请求,并且您有 5 个进程,请设置pm.max_requests
为 800。如果您不想做数学运算,500-1000 之间的设置可能会有效。尝试一下,在浪费时间重新生成进程与浪费内存进行内存泄漏之间找到平衡。当流量激增时,Php-FPM 可能会创建过多的子进程,导致其耗尽 RAM 并开始交换到磁盘。确定分配给 php-fpm 的总 RAM 量,然后将其除以每个子进程占用的内存量。对于 Wordpress 和基于 PHP 的论坛,我经常看到每个子进程需要 30-45MB。如果您只使用一个 php-fpm 池,请设置
pm.max_children
为该数字。
如果您只有一个 php-fpm 池,设置后您将看到速度提升pm.type = static
。
如果您有多个 php-fpm 池,可能是因为您托管多个应用程序并希望出于安全原因将它们隔离,您需要设置pm.type = dynamic
并尝试使用start_servers
、min_spare_servers
和max_spare_servers
。只需确保max_children
所有池的累积量不超过您的机器可以处理的数量。
如果您有大量低流量应用程序,每个应用程序都有自己的 php-fpm 池,最好设置pm.type=ondemand
成每个应用程序只在实际使用时占用资源。同时设置得pm.max_children
合理低,这样就不会有应用程序完全压垮整个系统。
答案3
我的猜测是 php5 刚刚更新了默认内存限制为 128Mb,并且正在运行的 php5 实例太多(检查 php-fpm 配置中的 pm.max_children)。
上述情况也发生在我身上,我一直在绞尽脑汁想找出原因。我已经向 ubuntu 提交了一份错误报告,但我认为需要使用 php-fpm 上游修复它——如果可以的话,我使用的默认设置会占用 6Gb 内存。这肯定会让我的 1Gb 服务器变得毫无用处……
答案4
您可能没有在服务器上安装某些操作码缓存,这导致了速度缓慢。
此外,正如 Marco 所说,您可能在系统上运行大量 php-fpm 实例。
如果您怀疑存在内存泄漏问题,请安装 php 的 suhosin 扩展,这将防止内存泄漏。
实际上,如果是内存泄漏,它应该记录在 php 错误日志中,php.ini 有一个报告内存泄漏的选项,report_memleaks = On