我有一个网站,每天有大约 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
在考虑了这些评论之后,我将大胆提出三点建议:
从动态池切换到静态池:假设您有一个 FPM 池,并且您的服务器没有执行太多其他操作,那么就没有必要不断增加和减少您使用的进程数。选择一定数量的子进程,启动那么多进程,然后保留它。
子进程数量少得多:最终,您的 VPS 最多只有几个 CPU。每个 FPM 子进程可以一次处理一个请求,其他请求则排在后面。拥有许多进程所做的就是从队列中接受许多请求,然后迫使它们竞争 CPU 使用率。如果您拥有较小的池并让突发流量排队,您可能会获得更好的结果。
增加 FPM 子进程的生命周期:您目前在每个子进程处理完 200 个请求后都会将其终止。这个数目并不多,而且流量激增可能会导致大量子进程被终止并重新生成,这只会增加开销。将其增加到更大的值(例如 5000),看看会发生什么。
值得指出的是,很难知道这些建议是否有效,因为我真的不知道问题到底是什么(可能是硬件故障,也可能是其他原因)。这些建议对我来说似乎很合理:尝试一下,看看它是否适用于您的环境。