29丨案例:如何应对因网络参数导致的TPS呈锯齿状?
高楼
该思维导图由 AI 生成,仅供参考
在苍茫的性能分析道路上,不管你是一只多老的鸟,在经历了多个性能测试的项目之后,你都会发现对于性能问题而言,你仍然不敢说能全部解决。因为下一个问题可能真的是你完全没有见过的。
再加上技术的飞速发展,想跟得上技术的进步都是一件痛苦的事情,更别说要完全掌握并且融会贯通了。
我经常看到有些人在简历中动辄说自己做过上百个性能项目,以彰显自己有充足的经验。事实上,如果一个性能项目需要做两个星期的话,基本上做不到调优的层面,最多是弄个脚本压个报告。在我的经验中,基本上一个完整的架构级的性能项目从准备开始到写出测试报告、调优报告,需要 1.5 个月以上。你可以想像,这样的项目,就算一年不停地做,做 10 个都算是非常快的了,而要做上百个这样的项目,至少需要 10 年的时间。
并且不是每一个项目都能让你有分析性能瓶颈的机会,因为有很多问题都是重复的。
所以性能分析是一个需要不断总结出自己的分析逻辑的工作,有了这些分析逻辑,才能在新项目中无往不利。请注意我的描述,我强调的是要有自己分析的逻辑,而不是经历多少个性能问题。因为问题可能会遇到新的,但是分析逻辑却是可以复用的。
在今天的文章中,我仍然用一个之前项目中出现过的案例给你讲一讲性能分析的思路。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文以一个实际案例为例,介绍了如何应对因网络参数导致的TPS呈锯齿状的性能问题。作者通过详细描述了案例问题描述、分析过程和尝试优化的步骤,展现了解决性能问题的思路和方法。在分析过程中,作者通过观察压力工具给出的重要曲线,发现TPS在上升到一个量级时会掉下来,而响应时间也出现明显抖动。经过一系列的工作,包括查看操作系统资源、数据库、Tomcat、Nginx监控数据等,最终发现网络中存在大量的timewait,进而尝试了修改TCP参数、Nginx配置以及更换Nginx和服务器等优化方法。最终,作者发现问题出现在操作系统层面的防火墙,通过停掉防火墙解决了问题。整个案例展现了解决性能问题需要细致的分析和不断尝试的过程,为读者提供了宝贵的经验和思路。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《性能测试实战 30 讲》,新⼈⾸单¥59
《性能测试实战 30 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(15)
- 最新
- 精选
- 蔡森冉感觉学到了什么,又感觉好像都不懂,看完估计前面的也忘了差不多了。这真是要不断时间和经验的积累,总结方法。但是一点记住的就是全局--定向
作者回复: 记住了重点。
2020-03-269 - 每天晒白牙读完老师的文章,有下面几点疑惑 1. TCP 四次挥手中,主动断开链接的一方才会处于 TIME_WAIT 状态呢,老师在文中有说 客户端主动断开,服务端也会出现 TIME_WAIT 状态,这是什么情况呢? 2. nf_conntrack 模块对 TCP 链接进行追踪,然后 nf_conntrack 的表有限制,表满了就丢包,这个因导致了服务器出现大量的 TIME_WAIT 状态,但为什么反应到 TPS 是锯齿状呢?一会儿好,一会儿坏,就算是 nf_conntrack 表会释放,难道还会瞬时释放很多,这样 TPS 就上去了,然后又满了,TPS 又下降? 思考题 1.如何在分析一通后,最后定位到防火墙? 因为老师在经过对操作系统的 CPU、I\O、内存等资源还有数据库、Tomcat、Nginx 等监控数据没有发现什么问题,最后定位到网络连接状态有问题,即出现了大量的 timewait 状态的链接,然后老师想通过修改 TCP 相关的参数来达到复用处于 timewait 状态的链接(这些参数的本质是释放服务端的句柄和内存资源,但不能释放端口,而 源IP+源端口+目的IP+目的端口+协议号才是 TCP 五元组),修改完后没有解决问题 然后老师分析客户端主动断开时,服务端也会处于 timewait 状态(这块是我疑惑的,应该是主动断开链接的一方才会处于 timewait 状态),然后打开了 Nginx 的 proxy_ignore_client_abort 配置,即让 Nginx 忽略掉客户端主动断开时报的错,但问题还是没有解决,然后把 Nginx 和 Nginx 所在服务器也换了,问题没有解决。 开始考虑操作系统层面,网络收发数据那儿可以通过查看发送端和接收端的 Recv_Q 和 Send_Q 这四个队列是否有值,来判断瓶颈点,然后没有发现问题。 在最后才考虑防火墙了 2.为什么 timewait 的 TCP 链接只是问题的现象? 因为能引起链接处于 timewait 状态的原因还是有很多的,这就需要不断透过现象看本质,根据不断地排查锁定最根本的原因
作者回复: 问题1,由于客户端异常断开,未发送fin包。服务端并不知道。当服务端探测到客户不在时,只能自己主动断开,故而有timewait出现。 问题2,nf_conntrack表满了会被清理,而tcp会重连,这时响应时间会增加,所以tps掉下后会再上升。
2020-03-229 - Geek_6a9aeb 既然跟加入的nginx没有关系,那么第一次性能测的时候为啥没有发现有这种性能问题呢?
作者回复: 跟多加了一个操作系统有关系。
2021-01-144 - Geek6198现象: * 测试环境压测曲线正常,线上环境曲线杂乱 * “TPS 在上升到一个量级的时候就会掉下来,然后再上到同样的量级再掉下来,非常规律” * “响应时间,在第一次 TPS 掉下来之后,就变得乱七八糟了。响应时间不仅上升了,而且抖动也很明显” 检查过程: 1. 问题检查 * 看操作系统CPU/io/memory/net * 看数据库、tomcat/nginx 2. 第1阶段结论: 网络连接有问题 * 发现了大量timewait 3. 尝试优化 * timewait是发起断开后的一个状态,修改服务端TCP相关配置 1. timewait资源允许重用+快速回收 等 * 修改nginx,只做转发,去除其它逻辑 * 将nginx部署到另一台服务器上 * 上述都没发现问题===》防火墙还没看 * 关闭防火墙,服务TPS正常 4. 第2阶段结论:瓶颈在防火墙 5. 问题分析 * dmesg 查下系统日志 * 发现 nf_conntrack 数据满了 * 查文档,知道其是干什么的;怎么改 * 修改配置,重新打开防火墙==》服务正常 6. 结束:瓶颈处理完成
作者回复: 总结的不错。
2021-11-303 - Geek_6a9aeb老师,linux tcp连接的限制(最大不能超过65535) ,对吗? 既然nf-conntrack默认也是65535 对最大tcp连接对应的? 这边没有看到 系统究竟建立了多少tcp连接,如果是超过65535个,那么丢包是合理的吧?
作者回复: tcp连接可以超过65535,只要配置文件句柄即可。 nf-conntrack是另一个东西,逻辑上不是一回事。它和tcp连接不是同一个控制参数。
2021-01-172 - 凌空飞起的剪刀腿想起了自己以前处理iptables限制tcp syn次数的性能调优,
作者回复: 每次调优都应该记录下来。
2020-04-042 - tt说TIME_WAIT是现象,是因为它只是“果”,导致它的“因”有很多可能,就是本课里老师采取的多种尝试。 当然,从分析链路的角度来说,它是TPS不稳的一个中间“因”,但还不能作为全局——定向分析的最终定位,所以是“现象。”
作者回复: 理解的非常对。
2020-02-262 - 奕分析思路很重要,还有分析问题的时候不要着急
作者回复: 你已经掌握了最关键的精髓。
2021-01-241 - 浩祥如果用1.5个月做性能测试,那就不要做了,1.5个月一个全新的产品可以上线了,预期线下费时,从投入产出比看,不如灰度放量,让实际场景暴露问题
作者回复: 看是什么公司的什么产品。有些系统是不敢直接在上线暴露问题的,比如说银行。 出了一笔金额错误,那就得找很多地方。
2020-10-2021 - zwm看不大明白只感觉nb,要学习的太多了
作者回复: 性能分析本来就是工程级的难度。
2020-03-061
收起评论