生产服务器 PHP-FPM 响应慢

服务器配置

  • 64 G 内存
  • 12 CPU

运行环境

使用的 ansible 搭建的 docker swarm 集群,目前是单服务器,因为出了问题。一直找不到原因。所以其他节点没有搭建。

出现的问题

php-fpm 响应很慢。发几个图就能很明显的看到。

prometheus 监控的服务器信息

生产服务器 PHP-FPM 响应慢

可以看到,负载不是很高。

prometheus 监控的 php-fpm 信息

生产服务器 PHP-FPM 响应慢
可以看到,有大量的响应是几百毫秒和超过 1 秒的。

低流量的时候,响应是很快的。基本在 30 ms 左右。如下图:

生产服务器 PHP-FPM 响应慢

kibana 查看的 nginx 日志信息

生产服务器 PHP-FPM 响应慢
在这里可以看到,upstream_connect_time 居然花费了 1s 多,找不到原因。

php-fpm 配置:

user = www-data
group = www-data
listen = 0.0.0.0:9000
pm = static
pm.max_children = 50
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
request_slowlog_timeout = 0

pm.status_path = /status
ping.path = /ping

原来使用的是 dynamic 模式,响应慢,所以我换成了 static ,还是很慢。

sql 语句记录了慢日志,没有慢的 sql 语句。

我应该如何排查这个问题呢?主要是没有思路。请大牛们给一个思路啊?

当才华还支持不起理想时,就应该静下心来好好学习了。
qiuyuhome
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
qiuyuhome
最佳答案

上午找技术老大看了一下,他分析说是 swarm 网络的问题。让我去查查。

overlay 性能问题

这个人遇到的情况,和我一样。nginx 连接 php-fpm,光是连接就花费了 1s 多。在我发的第 3 个图中可以看到。upstream_connect_time。

swarm:Very poor performance for ingress network with lots of parallel requests

这个文章,有人做了大量测试。说的就是这样的问题。

2年前 评论
讨论数量: 31

我就不明白你,服务器有这配置,你给我整这么点?直接调大点,按这个搞试下先:

pm = static
pm.max_children = 400
pm.start_servers = 210
pm.min_spare_servers = 20
pm.max_spare_servers = 400
pm.max_requests = 1000

另外,可以开一下慢请求日志,分析下原因(路径写自己的,别光知道抄):

request_slowlog_timeout = 15s
slowlog = /php/slow.log
2年前 评论
leo 2年前
忆往昔弹指间 (作者) 2年前
lidongyoo 2年前
cvoid 2年前
L学习不停 2年前
crackfan 2年前
忆往昔弹指间 (作者) 2年前
crackfan 2年前
忆往昔弹指间 (作者) 2年前
crackfan 2年前
cvoid 2年前
no_sign 2年前
no_sign 2年前

我就不明白你,服务器有这配置,你给我整这么点?直接调大点,按这个搞试下先:

pm = static
pm.max_children = 400
pm.start_servers = 210
pm.min_spare_servers = 20
pm.max_spare_servers = 400
pm.max_requests = 1000

另外,可以开一下慢请求日志,分析下原因(路径写自己的,别光知道抄):

request_slowlog_timeout = 15s
slowlog = /php/slow.log
2年前 评论
leo 2年前
忆往昔弹指间 (作者) 2年前
lidongyoo 2年前
cvoid 2年前
L学习不停 2年前
crackfan 2年前
忆往昔弹指间 (作者) 2年前
crackfan 2年前
忆往昔弹指间 (作者) 2年前
crackfan 2年前
cvoid 2年前
no_sign 2年前
no_sign 2年前
qiuyuhome

上午找技术老大看了一下,他分析说是 swarm 网络的问题。让我去查查。

overlay 性能问题

这个人遇到的情况,和我一样。nginx 连接 php-fpm,光是连接就花费了 1s 多。在我发的第 3 个图中可以看到。upstream_connect_time。

swarm:Very poor performance for ingress network with lots of parallel requests

这个文章,有人做了大量测试。说的就是这样的问题。

2年前 评论
rovast

系统可观测性能力需要进一步建设。可观测性三大支柱:Logs、Traces、Metrics。目前你的 grafana 发的时序数据、kibana 看的 日志,已经进行了部分的建设。但是数据间缺乏关联度,导致问题排查的眼镜还是不够。

可以尝试引入APM系统,对系统的观测能力进一步提升,尤其是 Trace 链路的观测,观察每个 span 节点的耗时信息、操作信息

2年前 评论
qiuyuhome

@putyy 开了。

2年前 评论

你好这个监控服务看着不错,这个是咋做的?

2年前 评论
qiuyuhome (楼主) 2年前
circle

可以试试排除法:

  • telescope 看下是不是程序或者 SQL 的问题
  • 如不不是,看下是不是 docker 的问题,这个就得理一下项目的整体架构,看看请求是经过了哪些地方,逐一排查
2年前 评论

没有慢 sql ,代码也没有问题,那就应该合理怀疑一下是 fpm 的调优了,网络问题的概率我认为反而是更低的,网络再慢也不会慢到 1s,upstream_connect_time 长更可能是没有空闲的 fpm 进程可以响应,在阻塞等待。不想调 pm.max_children 那就多开两个副本,都是值得尝试的。

2年前 评论

这个时候 其实k8s的优势就出来了

2年前 评论

docker部署为什么不能拿到fpm慢日志?? 目录映射不出来不就好了么

2年前 评论

swoole tracker 或者其他性能分析工具分析一下

2年前 评论

我也出现过这种情况,没有SQL慢语句,FPM使用dynamic 模式后使用static(据说这个改动只是减少FPM启动新的和关闭空闲进程的消耗),程序运行好的时候平均50ms以内,慢时会出现慢日志。 我分析慢日志调用栈很多时候和框架启动的初始化有关,也和I/O有关。 如果有条件的话应该使用堆栈调用工具查看下具体的调用信息,不过docker集群很难追踪。

2年前 评论
哓东 2年前
Kristiano (作者) 2年前
陈先生

我没记错的话 fpm慢日志是很精准的

2年前 评论

既然你们可以买这么好的服务器,在慢日志无法开启的情况下,不如先租用一台相同配置的服务器,配置可以开启fpm慢日志的,然后通过压测还原线上情况,查看fpm慢日志情况再去进一步排查

2年前 评论

为什么低流量时没啥问题?
是否瓶颈是在服务器带宽上?或者租赁一个相同配置的服务器,内网压测一下?

2年前 评论
qiuyuhome

@忆往昔弹指间 我这个配置,是根据我的实际流量配置的。而且,我开了 2 个副本,所以应该不是这个原因的。

2年前 评论
qiuyuhome

@jiangjun 这个早就分析过了。最高的时候没超过 40 。

2年前 评论

需要分析一下php的代码了

2年前 评论
qiuyuhome

@忆往昔弹指间 已回复,上面了。

2年前 评论
qiuyuhome

说开启慢日志的,我也上面也提到了,因为是 docker 部署的,慢日志需要 docker api 1.4.1 以上版本,我的目前是 1.40 的版本,如果要开慢日志,那么就得升级 docker,网站服务就都需要停一下。所以没有这么做。

2年前 评论
qiuyuhome

统一回复一下,监控状态可以看到,巅峰的 running php-fpm 进程,没有超过 40 的时候,我这个服务器还运行着其他服务,目前所有的服务都在这一个服务器上,而且是多个 php-fpm 容器,运行多个网站。

2年前 评论
jiangjun

pm.status_path 看一下php-fpm状态,在慢请求时,是不是所有进程都是活跃状态,来判断是不是所有进程都被占了。 如果不是,再往其他方面看。

2年前 评论

@qiuyuhome 注意如果n p独立容器 记得使用 share_vol

2年前 评论

几百请求这样呵呵,感觉和配置关系不大 还是代码哪里有优化的空间!

2年前 评论

服务器居然买这么大....

2年前 评论

opcache开没?

2年前 评论
qiuyuhome

@whcoding 已经查过了,没有慢 sql 语句。因为是用 docker 部署的。php-fpm 慢查询需要 docker api 版本 1.4.1 以上,所以我使用不了。不能设置 php-fpm 慢日志。

2年前 评论

查一下 php mysql 慢查询

2年前 评论
qiuyuhome

@crackfan 低流量的时候,30 ms 左右的响应。

file

2年前 评论
  • 首先排查sql(大概率)
  • 其次要找到耗时php文件
2年前 评论
qiuyuhome

@tu6ge-php 代码我可以保证没问题。 目前的状况是,流量稍微大一点,就响应慢了,平时 php-fpm 的响应基本在 30 ms 左右。

file

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!