off-cpu 火焰图nginx 互斥锁问题

文章插图
这是一张 nginx 的 off-cpu 火焰图,我们可以很快锁定到
ngx_common_set_cache_fs_size -> ngx_shmtx_lock -> sem_wait 这段逻辑使用到了互斥锁,它让 nginx 进程绝大部分阻塞等待时间花费在获取该锁 。
agent 监控上报断点问题

文章插图
这是一张 agent 的 off-cpu 火焰图,它是一个多线程异步事件模型,主线程处理各个消息,多个线程分别负责配置下发或者监控上报的职责 。当前问题出现在监控上报性能差,无法在周期(一分钟)内完成监控数据上报,导致监控断点,通过 off-cpu 火焰图我们可以分析出,该上报线程花费了大量的时间使用 curl_easy_perform 接口收发 http 监控数据消息中 。
依据火焰图将发送 http 消息的逻辑改为异步非阻塞后,该问题解决 。
附录进阶阅读
- 谷歌搜索演讲:Blazing Performance with Flame Graphs
- 演讲 ppt:https://www.slideshare.net/brendangregg/blazing-performance-with-flame-graphs
- 《SystemTap新手指南》:https://spacewander.gitbooks.io/systemtapbeginnersguide_zh/content/index.html
有,但是很小,可以基本忽略不计 。
它们使用系统的探针或者使用一些自定义的动态探针进行数据采集,第一对代码无侵入性,它既不需要停止服务,也不需要修改应用程序的代码;第二,它们是以内核模块/内核原生的方式跟踪用户态和内核态的所有事件,并通过一系列优化措施,进行采样统计,对目标服务性能影响极小,大概在5%左右或者更低的性能损耗 。相较于将进程运行在沙箱的 valgrind 工具或静态调试工具 gdb 来说,动态追踪 perf 或者 systemtap 或者 ebpf 的性能损耗基本可以忽略不计 。
目标进程重启后,systemtap 是否需要重新生成内核模块?
不需要 。甚至同一个 linux 内核版本下的同一个二进制进程(md5值一致),在安装 kernel 调试符号表后,便可以在生成采集指标的内核模块,并且可以多次使用 。
当 linux 内核版本不一致,符号表有变化,需要重新生成内核模块;当目标进程二进制文件重新编译后,也需要重新生成统计用的 systemtap 内核模块 。
推荐阅读
- 新手开淘宝店应该注意些什么 淘宝开店分类如何选择
- 淘宝新手开店需要注意什么 开淘宝店的注意事项
- 汽车门把手的3个隐藏功能,新手学会后,有效提高驾驶技术和安全
- 初入户外,应该购买哪些装备?
- 情感pua到底是什么意思?
- 3种花新手还是放弃吧,买了就等于浪费钱,很难养活
- 小个子女生冬季应该怎么穿?跟着时尚达人们一起学,显高又时尚
- 想开网店怎么学 怎么开网店新手入门
- 淘宝怎么做一件代发代销货源 新手开网店怎么找代销货源
- 大学生应该开网店吗 大学生开网店的利与弊
