PHP5-fpm失控-优化配置

PHP5-fpm失控-优化配置

我有一个网站,每天有大约 80K 名访问者。

该站点托管在 linode.com 上,并有一个节点均衡器(与负载均衡器相同),其后面有 3 个节点(2x linode 512 和 1x linode 1024)。

有时流量会让我崩溃,我的服务器变得没有响应(/ping 不再起作用,并迫使我的节点平衡器将节点退出旋转)。

我正在寻找一种方法来了解如何管理负载。我已经在 www.slow.log 中查找导致进程长时间运行的可能原因。也许你们可以帮助我优化我的机器的配置?

我当前的配置:

[www]
user = www-data
group = www-data

listen = 127.0.0.1:9000


pm = dynamic
pm.max_children = 70
pm.start_servers = 10
pm.min_spare_servers = 6
pm.max_spare_servers = 15
pm.process_idle_timeout = 10s;
pm.max_requests = 200
pm.status_path = /status
ping.path = /ping
ping.response = pong
slowlog = /var/log/$pool.log.slow
request_slowlog_timeout = 60
chdir = /
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on

编辑

这是正在构建 op 负载的机器的顶部

> top - 12:33:41 up 35 days, 44 min, 12 users,  load average: 8.57,
> 12.83, 12.21 Tasks: 193 total,   6 running, 187 sleeping,   0 stopped,   0 zombie Cpu(s): 36.6%us,  4.2%sy,  0.0%ni, 30.1%id,  0.0%wa,  0.0%hi,
> 0.6%si, 28.5%st Mem:   1027516k total,   603048k used,   424468k free,   149040k buffers Swap:   524284k total,   110392k used,   413892k free,
> 54064k cached
> 
>   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
> 31585 www-data  20   0 70600  16m 4388 R   37  1.7   0:09.92 php5-fpm 
> 31558 www-data  20   0 71352  17m 4344 R   33  1.7   0:18.18 php5-fpm 
> 31581 www-data  20   0 66480  13m 4312 S   22  1.3   0:12.08 php5-fpm 
> 31555 www-data  20   0 66220  12m 4344 S   19  1.3   0:16.51 php5-fpm 
> 31578 www-data  20   0 67244  13m 4352 S   19  1.4   0:10.53 php5-fpm 
> 31604 www-data  20   0 66992  13m 4180 S   15  1.3   0:05.31 php5-fpm 
> 31556 www-data  20   0 67244  13m 4324 S   15  1.4   0:16.53 php5-fpm 
> 31557 www-data  20   0 66476  12m 4340 R   13  1.3   0:17.35 php5-fpm 
> 31602 www-data  20   0 66468  13m 4320 S   12  1.3   0:06.59 php5-fpm 
> 31582 www-data  20   0 67244  13m 4328 S   11  1.4   0:11.18 php5-fpm 
> 31579 www-data  20   0 69328  15m 4344 R   11  1.6   0:10.76 php5-fpm 
> 31586 www-data  20   0 66736  13m 4308 S    9  1.3   0:08.17 php5-fpm 
> 31603 www-data  20   0 67504  14m 4324 S    8  1.4   0:06.35 php5-fpm 
> 31580 www-data  20   0 67244  13m 4336 S    7  1.4   0:11.06 php5-fpm 
> 31583 www-data  20   0 66736  13m 4300 S    7  1.3   0:10.80 php5-fpm 
> 31584 www-data  20   0 68024  14m 4356 S    6  1.4   0:10.17 php5-fpm 
> 31587 www-data  20   0 66736  13m 4328 S    6  1.3   0:08.18 php5-fpm 
> 31574 www-data  20   0 57856  52m  816 S    2  5.2   0:01.75 nginx    
> 31634 ward      20   0  2520 1040  736 R    1  0.1   0:00.09 top      
> 15554 ward      20   0  2520  552  264 R    1  0.1  59:04.40 top      
> 1023 root       0 -20     0    0    0 S    0  0.0  18:19.96
> kworker/0:1H                                                          
> 31575 www-data  20   0 57856  52m  808 S    0  5.2   0:00.53 nginx    
> 31607 ward      20   0  8868 1292  772 S    0  0.1   0:00.01 sshd     
> 
>     1 root      20   0  2088  120  120 S    0  0.0   0:46.60 init                                                                                                                                                                                                                                                            
>     2 root      20   0     0    0    0 S    0  0.0   0:03.17 kthreadd

EDIT2:growse 对解决方案的反馈

我将 3 台服务器切换为静态池。现在负载似乎得到更好的控制。我还将 max_requests 增加到 5000。

您可以在下面看到每个服务器的池静态信息:

服务器1:1024台机器

pool:                 www
process manager:      static
start time:           30/Dec/2012:12:48:23 +0100
start since:          489
accepted conn:        4311
listen queue:         0
max listen queue:     0
listen queue len:     128
idle processes:       35
active processes:     15
total processes:      50
max active processes: 35
max children reached: 0

服务器2:512台机器

pool:                 www
process manager:      static
start time:           30/Dec/2012:12:45:40 +0100
start since:          709
accepted conn:        11010
listen queue:         0
max listen queue:     9
listen queue len:     128
idle processes:       33
active processes:     7
total processes:      40
max active processes: 40
max children reached: 0

服务器3:512台机器

pool:                 www
process manager:      static
start time:           30/Dec/2012:12:38:25 +0100
start since:          1159
accepted conn:        21645
listen queue:         0
max listen queue:     129
listen queue len:     128
idle processes:       35
active processes:     5
total processes:      40
max active processes: 40
max children reached: 0

所有服务器运行现在更加稳定,负载约为 1-2。

答案1

在考虑了这些评论之后,我将大胆提出三点建议:

  1. 从动态池切换到静态池:假设您有一个 FPM 池,并且您的服务器没有执行太多其他操作,那么就没有必要不断增加和减少您使用的进程数。选择一定数量的子进程,启动那么多进程,然后保留它。

  2. 子进程数量少得多:最终,您的 VPS 最多只有几个 CPU。每个 FPM 子进程可以一次处理一个请求,其他请求则排在后面。拥有许多进程所做的就是从队列中接受许多请求,然后迫使它们竞争 CPU 使用率。如果您拥有较小的池并让突发流量排队,您可能会获得更好的结果。

  3. 增加 FPM 子进程的生命周期:您目前在每个子进程处理完 200 个请求后都会将其终止。这个数目并不多,而且流量激增可能会导致大量子进程被终止并重新生成,这只会增加开销。将其增加到更大的值(例如 5000),看看会发生什么。

值得指出的是,很难知道这些建议是否有效,因为我真的不知道问题到底是什么(可能是硬件故障,也可能是其他原因)。这些建议对我来说似乎很合理:尝试一下,看看它是否适用于您的环境。

相关内容