PHP 项目架构性能瓶颈问题请教

2020-12-30 15:40:23 +08:00
 yuandj

环境:

服务器

问题描述

  1. 目前项目在 qps 较高时遇到了响应时间延长的问题,新增了一台 api 服务器,并没有多大改善(原本是 3 台)
  2. 大概看了一下高并发时服务器的负载,并没有达到上限
  3. 平时 qps 可以支撑 1000 左右(3 台服务器),响应延迟保持在 450ms 左右。这两天请求增多 qps 达到 1300 左右,每个小时有十几分钟响应延迟会增加(多的时候响应会达到 3 、4 秒)(下面会附图),前 2 条大概排除了服务器的问题,现在考虑代码问题。下面附图把代码流程加了 time debug,并附带上比较耗时的代码段,麻烦各位大佬帮忙看看代码有没有性能瓶颈问题。

ps: 之前有段时间也遇到响应延迟问题,当时 time debug 定位到 redis get 操作耗时比较多(当时是 2 秒左右),但并没有在这方面做修复,后面通过减少了 swoole 的进程数解决了。

请求延迟监控图

每个小时的开始,请求会比较集中

请求流程时间拆分图

发现 qps 相关的代码段执行时间比较长,下面附上相关代码段

QPS 相关代码段

5602 次点击
所在节点    PHP
40 条回复
mitu9527
2020-12-30 15:54:31 +08:00
这么多台服务器,一般不能才 1000 多 qps 。

感觉你这问题不是很难的样子,看看硬件资源消耗,再多看看各种日志,应该就能找到问题所在。
Jeyfang
2020-12-30 16:04:09 +08:00
尝试下排除法咯,注释下各耗时严重的地方,然后单独去排查。期待这问题解决的后续
imhui
2020-12-30 16:09:34 +08:00
有项目用了 hyperf,关注一波
imgbed
2020-12-30 16:11:56 +08:00
mysql 数据量大吗?
yuandj
2020-12-30 16:16:00 +08:00
@imgbed mysql 数据量不大,是有缓存层的,缓存是永久有效,之前排查到 Redis get 操作耗时 2 秒,会不会是和缓存相关的问题呢,但当时在排查了 redis 慢日志,并没有耗时较久的命令
wangbenjun5
2020-12-30 16:21:05 +08:00
你们 QPS 居然用代码去统计,难道不能用 nginx 访问日志去统计么
yuandj
2020-12-30 16:40:51 +08:00
@wangbenjun5 不是做统计,是用来做请求限制
awanganddong
2020-12-30 16:44:50 +08:00
这个是 adx 平台,还是 dsp 平台。


是不是 redis 缓存击穿了
liuxu
2020-12-30 16:49:16 +08:00
性能分析靠猜测三言两语说不清,最起码一个系统资源消耗和 xhprof 日志得给出来
lbp0200
2020-12-30 16:51:33 +08:00
QPS1000 多,也是大站了
z5864703
2020-12-30 17:06:12 +08:00
redis 的 qps 多少,有时并不是 redis 执行慢,而是 qps 高,本身单线程排队执行下来就延迟高了。
针对这种情况批量操作 redis 可以用管道和 lua 脚本,减少网络交互延迟
nowgoo
2020-12-30 17:12:39 +08:00
可能 redis 的网卡打满了?缓存的数据不宜太大
wangritian
2020-12-30 17:13:56 +08:00
你能做的事情还有很多,确认业务机器、redis 、mysql 的负载和带宽,单独编写接口做压力测试,尽可能多收集信息,再做思考
keller
2020-12-30 17:16:06 +08:00
QPS 统计改成异步吧
不要实时计算,异步计算好结果,下次请求的时候直接从缓存拿上次结算好的数据做限制
yuandj
2020-12-30 17:19:14 +08:00
@z5864703 @wangritian 由于没运维,机器负载和带宽大概排查了一下,没大波动,初步怀疑就是 redis 这里有问题(上面更新了 redis 慢日志),后面试试减少 redis io,提高 redis 配置尝试一下
GGGG430
2020-12-30 17:22:40 +08:00
直接线上短时间 strace -T -tt -p 123 -o log 看看某个 swoole 的 worker 在干啥, 然后找找里面耗时高的系统调用在干啥, 精准定位问题
HanMeiM
2020-12-30 17:27:07 +08:00
mysql 和 redis 这种还是直接上云吧。。。如果真有问题,你们没运维也搞不定啊
opengps
2020-12-30 17:29:07 +08:00
1000 的 qps,一台数据库,关注下数据库这台机器的硬盘 io 是不是瓶颈
ahsjs
2020-12-30 17:50:04 +08:00
@yuandj 缓存 qps 数据?每隔多少时间更新一次,超也就超一点点
chengfeng
2020-12-30 17:51:05 +08:00
既然觉得是 redis 的问题,直接租个高配版 redis 切换过去看看效果呗

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

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

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

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

© 2021 V2EX