

APISIX运维优化之解决长尾请求(耗时抖动)问题
source link: https://zhang.ge/5161.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

APISIX运维优化之解决长尾请求(耗时抖动)问题
自从 APISIX 网关推广使用以来,在我们部门已经有很多生产业务接入使用。有一天被拉进了一个问题群,被告知 APISIX 网关性能有问题,整体表现还不如之前的 ZUUL 网关。纳尼?APISIX 性能再怎么不济也不至于比 ZUUL 差吧?
废话少说,直接上手弄了个串行请求对比测试了一下生产环境的 APISIX 网关和 ZUUL 网关,结果大跌眼镜!
正常情况下,APISIX 的耗时都优于 ZUUL 网关,但是 APISIX 偶尔会来一次很高的延迟,如下图所示:
很明显,APISIX 偶尔会出现明显大于正常延迟超过 10 倍的超高延迟!
先说下解决办法:
APISIX 开启了 prometheus 插件,在 prometheus 拉取 metric 数据的时候,会消耗 CPU 资源,导致卡顿。因此禁用 APISIX 的 prometheus 插件或停止 prometheus 对 APISIX 数据的周期性拉取。
以下是官方解释:
简单来说就是,exporter.collect 会消耗大量的 CPU 时间片来计算指标数据,然后新的请求要等待 exporter.collect 计算完了才有机会得到处理。除了 exporter.collect 之外,还有一些类似的操作应该也会导致这个现象,比如 routes 数量很大的情况下增加 route 导致重建 radixtree 等,这一块需要优化。
以下是部分分析过程,感兴趣的可以看看:
把我们自己开发的插件都关闭试了下,发现这个现象依然存在,于是我整理了一个可复现 case 提交到了 APISIX 官方:bug: The latency of request is not stable as expected · Issue #5604 · apache/apisix (github.com)
提交 issue 之后,APISIX 官方非常给力(效率爆赞),院生大佬亲自发邮件让我微信联系(相当亲民),然后当天就拉群沟通了:
第一时间,APISIX 开发同学拿我整理的 case 用例,发现确实有部分延迟不正常:
然后,通过 Nginx 试了下, 发现情况类似:
最终,结论认定在测试用例下未复现异常。然后,我自己也在测试环境对比测试了下,确实和 Nginx 表现接近,没有明显异常情况。但是请求现网就会明显的延迟飙升现象。于是在现网环境也部署了一套 Nginx 代理试了下, 来排除网络问题,发现完全没有任何问题。甚至直接在 APISIX 容器内部发起本地请求也会存在飙升问题,因此和网络应该没关系了。
注:这过程发现一个有意思的现象:虽然延迟飙升,但是 APISIX 的日志记录的 latency 却很低。
再后来几乎就没有什么新的想法了,官方建议装个 openresty-xray 分析下火焰图什么的,结果在腾讯 tlinux 系统里面还挺麻烦,没继续花时间折腾。
注:因篇幅有限,中间更多的折腾过程省略 1 万字...
最后,实在没办法了,凭着最后一点倔强,我在个人腾讯云公有云账号里面参考现网环境复刻了一套 APISIX(弹性集群),结果用 wrk2 测试后 APISIX 直接挂掉了,重启容器才能恢复,我去???
看来,接近真相了。简单分析了下,应该是在公有云里面 APISIX 里面有插件和内网不通,比如自研日志插件和服务发现插件,导致请求堆积了。进而,我试了下禁用日志插件,发现就没问题了。
根据这个提示,灵光一闪,尝试把以下配置全部注释试了下:
plugin_attr:
prometheus:
export_uri: /apisix/prometheus/metrics
enable_export_server: true
export_addr:
ip: 0.0.0.0
port: 9091
server-info:
report_interval: 60
report_ttl: 3600
zhiyan_log:
env: idc
topic: default
proto: udp
max_batch_number: 500
max_report_time: 2
discovery:
eureka:
host:
- http://xxxxx
prefix: "/eureka/"
fetch_interval: 5
weight: 100
timeout:
connect: 2000
send: 2000
read: 5000
polaris:
cache_size: 1000
update_time: 3
max_cache_time: 5
结果,延迟问题消失了?!消失了?!
好吧,这就简单了,把上述插件一项一项放开测试,最终发现是 prometheus 开启后导致延迟抖动,当然只是开启是没问题的,我停止 prometheus 的拉取,卡顿问题也立马消失了:
目前官方已经对prometheus 插件发起了优化讨论:[DISCUSS]: Improving the performance of the prometheus plugin · Issue #5755 · apache/apisix (github.com),我们就只能静待官方的优化版本了,只是这期间,我们的网关就只能先 L 奔了。
Recommend
-
51
最近发现lb上记录的request_time比upstream_response_time大的比较多,例如upstream_response_time记录是0.062,request_time记录的就
-
18
一、背景 大型C++工程项目,都会面临编译耗时较长的问题。不管是开发调试迭代、准入测试,亦或是持续集成阶段,编译行为无处不在,降低编译时间对提高研发效率来说具有非常重要意义。 美团搜索与NLP部为公司提供基础...
-
9
iOS 的 App 启动时长大概可以这样计算:t(App 总启动时间) = t1(main 调用之前的加载时间) + t2(main 调用之后的加载时间) t1 = 系统 dylib(动态链接库)和自身 App 可执行文...
-
10
C#代码优化:拯救你的CPU耗时 之前,我们已经对本地资源检测中和
-
10
Python性能分析优化及耗时异常自动化监控 2021年5月1日 | 最近更新于 下午6:47本文内容包括Python性能可视化分析,逻辑优化,及根据不同的模型动态计算安全阈值,实现各个函数耗时及程序总耗时的自动化监控预警。 在做Python性能分...
-
11
WEB应用APISIX高级路由之通过Body参数转发请求Jager · 10月28日 · 2021年APISIX ·
-
11
Jager · 11月14日 · 2021年APISIX · API网关 · nginx配置 55次已读 在这个...
-
10
How# 这个功能用到的是 curl 的 -w 选项,让我们来先看看 curl 的 man page: -w,...
-
6
分类页面怎么做SEO优化?SEO分类页面布局长尾关键词 https://www.chenweiliang.com/cwl-28293.html
-
5
为解决微信加群、拓群、搜索群功能,我耗时一月写了个小程序 toocf · 大约5...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK