我的记忆呢?!Nginx + PHP-FPM 前端网络服务器缓慢爬行

inc*_*ike 7 php memory nginx memory-leak vmware-esx

我不确定我是否有内存泄漏问题(正如我的托管公司所建议的那样),或者我们是否都需要阅读http://linuxatemyram.com。也许你们聪明的人可以帮助我们?

这是一个前端 Web 服务器虚拟机,基本上只在 RHEL 5.5 上运行 nginx 和 php-fpm。该服务器正在为 PHP 电子商务工具 Magento 提供支持。服务器在共享环境中运行,但我们很快就会改变这种情况。

无论如何.. 重新启动后服务器运行得很好,但一天之内它就会把自己磨成一团糟。加载页面实际上需要 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
 ...
Run Code Online (Sandbox Code Playgroud)

还有什么我应该看的,或者还有更多可能有用的信息吗?我只是一名开发人员,但这个系统的缓慢让我担心,让我很难完成我的工作..

帮帮我,ServerFault!

小智 6

万一其他人遭受这个。

我们刚刚遇到了同样的问题。php5-fpm 中的内存泄漏。RAM 被每个页面请求用完并最终用完。然后 CPU 进入超速运转状态,KSWAP 进程运行交换磁盘。

唯一固定的,虽然不是理想的设置是更改我们的 www.conf 池文件

pm = 动态

下午 = 点播

内存现在似乎稳定。

  • 一年后,这是如何实现的?你最终保留了这个配置吗? (4认同)

Jef*_*man 5

这里有两件事需要检查:

  1. 您很可能存在内存泄漏。pm.max_requests在处理这么多请求后,将终止/重新启动 php-fpm 子进程。由于您的盒子大约需要一天的时间才能慢下来,因此请尝试将其设置为一个数字,以使每个子进程每 20 分钟左右重生一次。因此,如果您每分钟收到 200 个请求,并且有 5 个进程,则设置pm.max_requests为 800。如果您不想进行数学计算,则 500-1000 之间的设置可能会起作用。尝试一下,在浪费时间重生进程和浪费 RAM 造成内存泄漏之间找到平衡。

  2. 当流量高峰发生时,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_serversmin_spare_serversmax_spare_servers。只要确保max_children所有池的累积量不超过您的盒子的处理能力即可。

如果您有大量低流量应用程序,每个应用程序都有自己的 php-fpm 池,那么最好进行设置,pm.type=ondemand以便每个应用程序仅在实际使用时占用资源。还要设置得pm.max_children相当低,这样就没有任何一个应用程序可以完全压倒这个盒子。


blu*_*ben 1

下次服务器速度变慢时,运行“vmstat 1”和“iostat 1”,然后将结果报告给我们。