高并发, PHP 请求超时, CPU 占用上不去

2020-09-16 16:48:11 +08:00
 xiaoshouchen
服务器是阿里云的 8 核 8G
当有稍微高一点的并发时,PHP 就会超时 504 或者 502,然后 CPU 占用率在 30 %左右上不去
PHP 用的 Docker + Alpine-fpm 7.2

pm=static
pm.max_children=16

我尝试把 max_children 提高,CPU 占用率还是低
4511 次点击
所在节点    PHP
27 条回复
opengps
2020-09-16 16:52:07 +08:00
你的问题不一定是配置问题,更像是单个站点下的某些资源占用较大成为瓶颈点了
思路一:找出来代码操作资源使用的瓶颈点,代码优化,提高单站点负载能力
思路二:如果不从优化资源占用代码角度讲的话,适合用多个站点来“负载均衡”
ben1024
2020-09-16 16:54:46 +08:00
排查下有没有 磁盘 IO 或者 DB 操作限制
qq1340691923
2020-09-16 16:56:18 +08:00
代码问题
owenliang
2020-09-16 16:57:00 +08:00
空接口能跑上去,那就不是 PHP 配置问题了。
wakzz
2020-09-16 16:57:24 +08:00
1. 输出红火图,查看应用 CPU 时间分片占用分布
Aliencn
2020-09-16 16:57:58 +08:00
pm.max_children=16
这个值太小了吧。
wakzz
2020-09-16 16:58:16 +08:00
2. 执行命令`dstat 1`,监控一下压测期间服务器的 CPU,IO,网络,中断的数据情况
keepeye
2020-09-16 16:59:15 +08:00
php-fpm 进程数量太低了,加到 256

你这个大概率是 io 瓶颈,跟 cpu 没啥关系,检查下你的代码吧,是否有远程调用或者数据库是否慢查询了。
xiaoshouchen
2020-09-16 16:59:46 +08:00
@Aliencn 请问大概多大的比较合适,我曾经请教过别人,别人给我的回复时,CPU 切换本身也是消耗资源的,CPU 本身的限制在那,过多的提高 max_children 没有效果,反而有副作用( CPU 切换消耗资源)。
sagaxu
2020-09-16 17:02:53 +08:00
@xiaoshouchen 瞎 jb 扯,fpm 先加到 100 再说
zibber
2020-09-16 17:04:45 +08:00
8g 内存,把每个进程占用内存调小, max_children 调到 500 没问题
xiaoshouchen
2020-09-16 17:05:42 +08:00
@keepeye 数据库用的阿里云的 RDS,没有查到慢查询的记录,而且 CPU 和内存的占用率也很低。除了微信分享、登录之外,基本上没有第三方的请求。磁盘 IO 占用率也不高买的是 IO 优化版的服务器。php-fpm 进程开太多,会不会导致 CPU 切换时间片本身消耗 CPU 资源。
xiaoshouchen
2020-09-16 17:10:10 +08:00
@sagaxu 可否详细说明一下,FPM 进程数和配置的关系,”进程数过多,CPU 时间片切换消耗资源“这个说法的错误之处在什么地方呢?
janxin
2020-09-16 17:22:15 +08:00
@xiaoshouchen 你现在 CPU 的占用很低,没有到 max_children 敏感的阶段。还是需要加大的。其他的要看周边的数据影响,比如是否 DB 拖慢 etc
zpfhbyx
2020-09-16 17:25:17 +08:00
贴下 fpm 配置?
GM
2020-09-16 17:30:36 +08:00
别听上面的人瞎扯,fpm 进程数量没必要太大的,50 个已经非常大了。
每个 fpm 进程都要单独消耗一份内存,假设每个 50M 内存,100 个进程那就是 5G 内存,256 个那就是 12.5G 内存,别的程序还跑不跑了?
keepeye
2020-09-16 17:39:19 +08:00
@GM 进程数量是动态的,max 只是一个理论最大值而已,而且也不是每个进程都一直占用 30M 内存不释放的
keepeye
2020-09-16 17:41:30 +08:00
具体定个什么值还是要靠实际压测,总比一开始小气吧啦的好,爆内存了再说
GM
2020-09-16 18:33:19 +08:00
@keepeye pm=static 的时候就不是动态了
GM
2020-09-16 18:36:46 +08:00
@keepeye
至于每个进程占多少,这个不好说,要看是什么框架,也要看具体业务代码怎么写。
而且,框架本身也要占不少内存,如果是轻量级框架还好,占得少点,如果是 Laravel 之类重量级框架,那预留 50M 很正常的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/707619

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX