问题
线上mongodb主库经常出现以5分钟为周期性的慢查问。在排除业务代码bug,机器cpu/io/memory资源限度后。最终发现是mongodb的bug,因为这是一个十分典型的加锁导致的性能不佳问题。故做一下记录。
过程
局部业务呈现超时报错
局部业务呈现超时报错后,开始定位:
- 这个超时报错是周期性的,距离是5分钟。
- mongodb链接数量呈周期性回升。
- 局部申请的rtt在同一个工夫点显著回升。
- 所有高rtt慢查问都呈现在主库,并且集中在一秒内。
排除了业务出错的可能性
排除业务问题的起因如下:
- 所有的申请都会呈现慢查问,而这些查问在平时应该在0.5MS左右返回,比方主键齐全命中,collection规模很小,且返回doc不大。
- 在呈现慢查问前后,mongodb业务无变动。
因没有秒级监控数据,未在机器层面发现其它异样
- cpu 的使用率,上下文切换,中断都无异样。
- disk/network io 无异样。max磁盘使用率在%20以下,等待时间和队列都很低。
- 内存异样变动。
减少了专门的告警,抓到秒级的mongotop日志
ns total read write 20XX-XX-XXTXX:XX:06+08:00 XXXXXXXXXXX 432784ms 427448ms 5336ms XXXXXXXXXXX.XXXXXXXXXXX 156077ms 156077ms 0ms XXXXXXXXXXX.XXXXXXXXXXX 123833ms 92224ms 31608ms XXXXXXXXXXX.XXXXXXXXXXX 94543ms 93360ms 1182ms XXXXXXXXXXX.XXXXXXXXXXX 87778ms 83832ms 3945ms XXXXXXXXXXX.XXXXXXXXXXX 48675ms 48635ms 40ms XXXXXXXXXXX.XXXXXXXXXXX 44022ms 44022ms 0ms XXXXXXXXXXX.XXXXXXXXXXX 29715ms 29715ms 0ms XXXXXXXXXXX.XXXXXXXXXXX 20737ms 5445ms 15291ms XXXXXXXXXXX.XXXXXXXXXXX 13962ms 13939ms 22ms
mongodb bug
在提交工单给阿里云的专家后,正好有人遇到过相似问题,是mongodb的bug。
https://github.com/mongodb/mo...
很遗憾,因为没有在现场再次查看cpu的秒级中断,上下文切换数据,我未能本人找到这个bug。
如果应用vmstat来观测,出问题的那一秒,上下文切换和中断会忽然飙到上一秒的1.8倍左右。和mongotop的异样工夫点齐全吻合。
总结
- 一瞬间的性能问题,须要更高精度的监控数据来定位。
- 留神使用率的陷阱,使用率高不代表肯定过载,使用率低也不代表肯定闲暇。
按分钟计算,磁盘使用率为%20,能够是前10秒使用率为%100。后50秒简直齐全闲暇。这个不能阐明磁盘未过载。当然这种状况下的await和读写队列并不会特地低。