问题
公司服务总是莫名其妙的cpu饱满排查了代码中的定时任务,排除之后仍经常出现类似问题。是时候debug了
排查过程
cpu劣化是一个过程,cpu持续增长到60%,然后突然服务雪崩不服务了。排查下来看sleep的物理线程和cpu增长的幅度一致
那么排查什么程序创建这么多线程就是key。
明确问题
公司打点不太可信,用一些linux命令确认下
pstree -p
可以明显看到 PID=254启动了大量线程 再wc -l
下看看有多少个和metrics打点一致
py-spy工具
参考这个文章:https://zhuanlan.zhihu.com/p/106115146
引用官方的介绍:
Py-Spy是Python程序的抽样分析器。
它允许您可视化查看Python程序在哪些地方花了更多时间,整个监控方式无需重新启动程序或以任何方式修改工程代码。
Py-Spy的开销非常低:它是用Rust编写的,速度与编译的Python程序不在同一个进程中运行。
这意味着Py-Spy可以安全地用于生成生产环境中的Python应用调优分析。
pip3 install py-spy
用这个工具主要是看下到底是哪个代码开了这么多线程!!注意dump命令只能调试运行中的程序
py-spy dump --pid 254
原形毕露!!天杀的pymongo 起这么多线程!!
解决
因为客户新报告的这个issue,之前一直没有问题,这次唯一区别是find返回的数据量比较 大,一千万条数据。所以怀疑跟数据量有关系,可能是pymongo的find返回大数据量时候 有bug,所以针对不能的数据量级别做如下测试【这块偷图了】来自:https://zhuanlan.zhihu.com/p/250669746
可以看出pymongodb的线程处理有bug,但find返回大数据量时候不能及时关闭线程。
建议客户使用Python3.8,临时修复这个问题。PyMongo在3.7版本当find返回大数据量(>5 million)时候线程管理存在bug,后续查看源代码并report issue给pymongo开发团队。