今天项目遇到一个比较棘手的问题,我们做的接口平台,提供了一个给用户自己编辑关键字的逻辑,发现对应服务的cpu基本都满了,并且通过扩容的方式也没有好转,也同样被打满。
找了测试的同学了解了下,发现他们使用测试计划的形式,定时每隔一分钟跑一次。看了下nginx的情况,请求并发量确实上来了很多,
那具体的问题到底是出在哪suo
py-spy
Py-Spy是Python程序的抽样分析器。 它允许您可视化查看Python程序在哪些地方花了更多时间,整个监控方式无需重新启动程序或以任何方式修改工程代码。 Py-Spy的开销非常低:它是用Rust编写的,速度与编译的Python程序不在同一个进程中运行。 这意味着Py-Spy可以安全地用于生成生产环境中的Python应用调优分析。
安装
pip install py-spy
性能采集
py-spy从命令行工作,并获取要从中采样的程序的PID或要运行的python程序的命令行。py-spy具有三个子命令record, top和dump:
- record生成火焰图
- top实时查看每个函数运行时间并统计
- dump显示每个python线程的当前调用堆栈
py-spy record -o profile.svg --pid pid
我们看下采集后的火焰图是如何的
我们可以发现 基本上大部分的性能消耗都集中在了storeAsyncCallback的方法上。 所以我们看看这个方法主要做了什么
看了逻辑,基本就是每隔5s的时间去请求一次接口,然后做一些判断,最多执行60s, 但是这里有个很严重的问题,用了一个while True
。 并且中间没有任何的sleep
的 操作,这个就会导致这个脚本会一直占用cpu的时间片直到执行完成,一旦并发上来的时候,所有的脚本都会等待这个脚本执行完了才轮到自己。
所以我们更新了下脚本,重新看下性能的火焰图的情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iDbDflmP-1673795073924)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/566ccb58-38d2-4b5b-9d7b-382f1d475a63/Untitled.png)]
如此问题得到了解决,不过针对用户自定义的脚本,还是需要有一定的监控手段,才能够提前知道一些问题才行。