编程新手该如何调优程序?程序员必备性能调优利器——火焰图( 三 )


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
FAQ使用 perf 或者 systemtap 的方式采集数据,会对后台服务有性能影响吗?
有,但是很小,可以基本忽略不计 。
它们使用系统的探针或者使用一些自定义的动态探针进行数据采集,第一对代码无侵入性,它既不需要停止服务,也不需要修改应用程序的代码;第二,它们是以内核模块/内核原生的方式跟踪用户态和内核态的所有事件,并通过一系列优化措施,进行采样统计,对目标服务性能影响极小,大概在5%左右或者更低的性能损耗 。相较于将进程运行在沙箱的 valgrind 工具或静态调试工具 gdb 来说,动态追踪 perf 或者 systemtap 或者 ebpf 的性能损耗基本可以忽略不计 。
目标进程重启后,systemtap 是否需要重新生成内核模块?
不需要 。甚至同一个 linux 内核版本下的同一个二进制进程(md5值一致),在安装 kernel 调试符号表后,便可以在生成采集指标的内核模块,并且可以多次使用 。
当 linux 内核版本不一致,符号表有变化,需要重新生成内核模块;当目标进程二进制文件重新编译后,也需要重新生成统计用的 systemtap 内核模块 。
 




推荐阅读