建设自己公司的网站,如何做网站软件,wordpress更新很慢,企石镇网站仿做1、 白话火焰图
让我们回想一下我们一般是如何调试程序的#xff0c;通常是在没有数据的情况下依靠主观臆断来瞎蒙#xff0c;而不是考虑问题到底是什么引起的#xff01;毫无疑问#xff0c;调优程序性能问题的时候#xff0c;同样需要对症下药。好消息是 Linux 内核调优…1、 白话火焰图
让我们回想一下我们一般是如何调试程序的通常是在没有数据的情况下依靠主观臆断来瞎蒙而不是考虑问题到底是什么引起的毫无疑问调优程序性能问题的时候同样需要对症下药。好消息是 Linux 内核调优大师发明了火焰图可以一针见血的指出程序的性能瓶颈可以快速、准确地识别出最频繁的代码路径但是很少人在使用火焰图。常见的火焰图类型有 On-CPUOff-CPU还有 MemoryHot/ColdDifferential 等等。 关于火焰图整个图形看起来就像一团跳动的火焰这也正是其名字的由来。燃烧在火苗尖部的就是 CPU 正在执行的操作不过需要说明的是颜色是随机的本身并没有特殊的含义纵向表示调用栈的深度横向表示采样的次数。因为调用栈在横向会按照字母排序并且同样的调用栈会做合并所以一个格子的宽度越大越说明其可能是瓶颈。综上所述主要就是看那些比较宽大的火苗特别留意那些类似平顶山的火苗。
2、火焰图的含义
以下是基于 perf perf是一款Linux性能分析工具 结果产生的 SVG 图片用来展示 CPU 的调用栈。
火焰图的地址 https://queue.acm.org/downloads/2016/Gregg4.svg y 轴表示调用栈每一层都是一个函数。调用栈越深火焰就越高顶部就是正在执行的函数下方都是它的父函数。 x 轴表示抽样数如果一个函数在 x 轴占据的宽度越宽就表示它被抽到的次数多即执行的时间长。注意x 轴不代表时间而是所有的调用栈合并后按字母顺序排列的。 火焰图就是看顶层的哪个函数占据的宽度最大。只要有平顶山就表示该函数可能存在性能问题。 颜色没有特殊含义因为火焰图表示的是 CPU 的繁忙程度所以一般选择暖色调。 火焰图是 SVG 图片可以与用户互动,火焰的每一层都会标注函数名鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比 在某一层点击火焰图会水平放大该层会占据所有宽度显示详细信息。
3、 生成火焰图
要生成火焰图必须要有一个顺手的 Tracer 工具如果操作系统是 Linux 的话那么选择通常是 perfsystemtap 中的一种。其中 perf 相对更常用而 systemtap 相对更强大不过缺点是你需要先学会它本身的编程语言如果你和我一样觉得麻烦那么我强烈推荐你使用春哥的 nginx-systemtap-toolkit乍一看名字你可能会误以为这个工具包是 nginx 专用的实际上这里面很多工具适用于任何 C/CPP 语言编写的程序 sample-bt用来生成 On-CPU 火焰图的采样数据 实例http://openresty.org/download/user-flamegraph.svg sample-bt-off-cpu用来生成 Off-CPU 火焰图的采样数据 实例http://agentzh.org/misc/flamegraph/off-cpu-lua-resty-mysql.svg 那么什么时候使用 On-CPU 火焰图什么时候使用 Off-CPU 火焰图呢取决于当前的瓶颈到底是什么如果是 CPU 则使用 On-CPU 火焰图如果是 IO 或锁 则使用 Off-CPU 火焰图。如果无法确定那么可以通过压测工具来确认通过压测工具看看能否让 CPU 使用率趋于饱和如果能那么使用 On-CPU 火焰图如果不管怎么压CPU 使用率始终上不来那么多半说明程序被 IO 或锁卡住了此时适合使用 Off-CPU 火焰图。如果还是确认不了那么不妨 On-CPU 火焰图和 Off-CPU 火焰图都搞搞正常情况下它们的差异会比较大如果两张火焰图长得差不多那么通常认为 CPU 被其它进程抢占了在采样数据的时候最好通过压测工具对程序持续施压以便采集到足够的样本。
例子1 通过 Off-CPU 火焰图可以发现有一个使用互斥锁的 HTTP Cache 检查代码让绝大部分的 Off-CPU 时间都花在了等待进程锁上 https://blog.huoding.com/upload/off-cpu-flame-graph-nginx-cache-1.svg例子2 在移除了那个引发互斥锁瓶颈的历史代码之后从图上我们可以清楚地看到 open() 系统调用是下一个最明显的性能瓶颈 https://blog.huoding.com/upload/off-cpu-flame-graph-nginx-cache-2.svg例子3 启用 nginx 的 open_file_cache 指令可以对打开的文件句柄进行缓存从而节约昂贵的 open() 系统调用。但是缓存容量并不是越大越好比如当达到 20000 个元素的容量时共享内存的锁就成了瓶颈 https://blog.huoding.com/upload/off-cpu-flame-graph-nginx-cache-3.svg
实际使用火焰图的时候因为 perf / systemtap 本身对系统性能影响较小所以我们可以在线上随时采样数据来分析性能我们甚至可以写一个脚本自动化定期绘制系统运行状况的火焰图如此一来即便发生性能故障时我们没有第一时间在现场也可以随时根据火焰图历史快照来确诊问题的根源。
4、Perf 命令
Perf 命令(performance的简写)是 Linux 系统原生提供的性能分析工具返回 CPU 正在执行的函数名以及调用栈(stack)。 通常它的执行频率是 99Hz每秒99次如果99次都返回同一个函数名那就说明 CPU 这一秒钟都在执行同一个函数可能存在性能问题。
5、Java 性能分析工具 async-profiler