专栏文章 性能课堂-TPS 瓶颈精准定位

飞天小子的性能课堂 · 2020年07月06日 · 最后由 Mr.CHEN 回复于 2021年07月30日 · 11863 次阅读
本帖已被设为精华帖!

《高级性能测试实战宝典》

问题反馈

这是一个性能培训学员反馈的 TPS 问题
100 并发用户下的负载测试,TPS 最大升到 570 左右,然后跌到 400,并且长期保持。加线程也不能让 tps 再有所增加。

从监听到的服务器指标来看,cpu 利用率一直处于低迷的状态,大约只有 40% 左右。

问题定位

执行 vmstat 1 10

可以观察到,运行队列不是很长,iowait 不高,没有 swap 切换,但是上下文切换和中断似乎有点偏高

执行mpstat -P ALL 1

可以很明显的观察到软中断有点偏高,用户空间的 cpu 利用率大约是系统空间的两倍。

接下来 执行 watch -d cat /proc/interrupts
分析一下是什么导致的软中断过高

可以发现中断频率最高的两个网卡和 vmw 服务。有可能是网络出现了故障,但是 vmw 是什么暂时未知

执行 *netstat -n | awk '/tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' *,查看一下 timewait 有多少

4900 多 timewait,但是这似乎也不能说明什么问题。

接下来重头戏,需要拦截一下系统进程,看一下系统内部到底在做什么导致的切换和中断过高
执行 ** strace -o strace.log -tt -p 29779**
这条命令生成了一个进程日志,从日志里面可以看出一些问题
1:系统内部写日志的时候没有权限,出现了反复读写的死循环

2:tcp 连接超时了

现在问题大致明白了。因为系统反复写日志不成功,导致内核频繁的上下文切换;因为 tcp 连接故障导致的系统频繁中断

解决问题

1:调整了 tcp 的 keepalive 时间,从 1200 加到了 3000
2:增加了 tcp 缓冲和内存共享
3:日志问题开发暂时不想解决

结果

tcp 调整之后,最大 tps 增加到了 650 左右,但是还是会掉到 420。因为那个上下文切换过快导致了 cpu 无法正常工作,所以 tps 无法从根本上提升

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 15 条回复 时间 点赞

赞,又学到新知识了

纸上得来终觉浅,绝知此事要躬行。笔者事必躬亲的钻研态度值得我辈学习!

分析很到位,学习了

有点不明白的地方,频繁的上下文切换和中断,按理说会消耗大量的 CPU,但是从 CPU 曲线上反应没反应出来呀

还有鱼 回复

频繁上下文切换,会导致 cpu 不能正常工作,利用率降低,而不是利用率增加。cpu 只有在正常调度进程的时候才能算入利用率

陈恒捷 将本帖设为了精华贴 07月07日 23:27

想请教下 这里的 strace -o strace.log -tt -p 29779 29779 进程号是怎么确定下来的呢

百度一下,你就知道

一步一步认真排查问题,查看日志,学习了

日志权限不能把写日志目录的权限改一下解决吗?权限问题还通过代码解决?

仅楼主可见

厉害了~😀

资源没有出现瓶颈的情况下,会出现增加线程 tps 不增加的场景?服务不限流的话,应该不会吧

如果 cpu 利用率不高,不需要分析上下文切换吧?我感觉分析方向不太对,cpu,内存,io 都不高,是不是应该检查下 tcp 连接数是不是打满了?打满的话,后面的应该会出现分析中的超时

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册