生产服务器 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

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

5个月前 评论
讨论数量: 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
5个月前 评论
leo 5个月前
忆往昔弹指间 (作者) 5个月前
lidongyoo 5个月前
cvoid 5个月前
L学习不停 5个月前
crackfan 5个月前
忆往昔弹指间 (作者) 5个月前
crackfan 5个月前
忆往昔弹指间 (作者) 5个月前
crackfan 5个月前
cvoid 5个月前
no_sign 5个月前
no_sign 5个月前

需要分析一下php的代码了

5个月前 评论
qiuyuhome

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

file

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

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

file

5个月前 评论

查一下 php mysql 慢查询

5个月前 评论
qiuyuhome

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

5个月前 评论

opcache开没?

5个月前 评论

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

5个月前 评论

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

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
5个月前 评论
leo 5个月前
忆往昔弹指间 (作者) 5个月前
lidongyoo 5个月前
cvoid 5个月前
L学习不停 5个月前
crackfan 5个月前
忆往昔弹指间 (作者) 5个月前
crackfan 5个月前
忆往昔弹指间 (作者) 5个月前
crackfan 5个月前
cvoid 5个月前
no_sign 5个月前
no_sign 5个月前

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

5个月前 评论

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

5个月前 评论
jiangjun

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

5个月前 评论
qiuyuhome

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

5个月前 评论
qiuyuhome

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

5个月前 评论
qiuyuhome

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

5个月前 评论
qiuyuhome

@putyy 开了。

5个月前 评论
qiuyuhome

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

5个月前 评论
qiuyuhome

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

5个月前 评论

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

5个月前 评论

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

5个月前 评论

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

5个月前 评论

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

5个月前 评论
哓东 5个月前
Kristiano (作者) 5个月前
qiuyuhome

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

overlay 性能问题

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

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

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

5个月前 评论

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

5个月前 评论

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

5个月前 评论

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

5个月前 评论

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

5个月前 评论
circle

可以试试排除法:

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

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

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

5个月前 评论

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

4个月前 评论
qiuyuhome (楼主) 4个月前

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