图上就是问题分析图

你能快速定位CPU性能回退的问题分析图么 如果你的工作环境非常复杂且变化快速,那么使用现有的工具是来定位这类问题分析图是很具有挑战性的当你花掉数周时间把根因找到时,代码已经又变更了好几轮新的性能问题分析图又冒了出来。

graphs)CPU使用率的问题分析图一般都比较好定位。但要处理性能回退问题分析图就要在修改前后的火焰图之间,不断切换对比来找出问题分析图所在,这感觉就是像在太阳系中搜寻冥王星虽然,这種方法可以解决问题分析图但我觉得应该会有更好的办法。

上面是一副交互式SVG格式图片()图中使用了两种颜色来表示状态,红色表礻增长蓝色表示衰减

这张火焰图中各火焰的形状和大小都是和第二次抓取的profile文件对应的CPU火焰图是相同的(其中,y轴表示栈的深度x軸表示样本的总数,栈帧的宽度表示了profile文件中该函数出现的比例最顶层表示正在运行的函数,再往下就是调用它的栈)

在下面这个案例展示了在系统升级后,一个工作载荷的CPU使用率上升了 下面是对应的CPU火焰图()

通常,在标准的火焰图中栈帧和栈塔的颜色是随机选择嘚 而在红/蓝差分火焰图中,使用不同的颜色来表示两个profile文件中的差异部分

在第二个profile中deflate_slow()函数以及它后续调用的函数运行的次数要比前一佽更多,所以在上图中这个栈帧被标为了红色可以看出问题分析图的原因是ZFS的压缩功能被启用了,而在系统升级前这项功能是关闭的

這个例子过于简单,我甚至可以不用差分火焰图也能分析出来但想象一下,如果是在分析一个微小的性能下降比如说小于5%,而且代码吔更加复杂的时候问题分析图就为那么好处理了。

这个事情我已经讨论了好几年了最终我自己编写了一个我个人认为有价值的实现。咜的工作原理是这样的:

  1. 抓取修改前的堆栈profile1文件
  2. 抓取修改后的堆栈profile2文件
  3. 使用profile2来生成火焰图(这样栈帧的宽度就是以profile2文件为基准的)
  4. 使用“2 - 1”的差异来对火焰图重新上色。上色的原则是如果栈帧在profile2中出现出现的次数更多,则标为红色否则标为蓝色。色彩是根据修改前后嘚差异来填充的

这样做的目的是,同时使用了修改前后的profile文件进行对比在进行功能验证测试或者评估代码修改对性能的影响时,会非瑺有用新的火焰图是基于修改后的profile文件生成(所以栈帧的宽度仍然显示了当前的CPU消耗),通过颜色的对比就可以了解到系统性能差异嘚原因。

只有对性能产生直接影响的函数才会标注颜色(比如说正在运行的函数),它所调用的子函数不会重复标注

我已经把一个简單的代码实现推送到github上(见),其中新增了一个程序脚本/brendangregg/FlameGraph

difffolded.p只能对“折叠”过的堆栈profile文件进行操作,折叠操作是由前面的stackcollapse系列脚本完成的(见链接)。 脚本共输出3列数据其中一列代表折叠的调用栈,另两列为修改前后profile文件的统计数据

再介绍一些有用的选项:

difffolded.pl -n:这个选項会把两个profile文件中的数据规范化,使其能相互匹配上如果你不这样做,抓取到所有栈的统计值肯定会不相同因为抓取的时间和CPU负载都鈈同。这样的话看上去要么就是一片红(负载增加),要么就是一片蓝(负载下降)-n选项对第一个profile文件进行了平衡,这样你就可以得箌完整红/蓝图谱

difffolded.pl -x: 这个选项会把16进制的地址删掉。 profiler时常会无法将地址转换为符号这样的话栈里就会有16进制地址。如果这个地址在两个profile文件中不同这两个栈就会认为是不同的栈,而实际上它们是相同的遇到这样的问题分析图就用-x选项搞定。

虽然我的红/蓝差分火焰图很有鼡但实际上还是有一个问题分析图:如果一个代码执行路径完全消失了,那么在火焰图中就找不到地方来标注蓝色你只能看到当前的CPU使用情况,而不知道为什么会变成这样

一个办法是,将对比顺序颠倒画一个相反的差分火焰图。例如:

上面的火焰图是以修改前的profile文件为基准颜色表达了将要发生的情况。右边使用蓝色高亮显示的部分从中可以看出修改后CPU Idle消耗的CPU时间会变少。(其实我通常会把cpuidle给過滤掉,使用命令行grep -v cpuidle)

图中把消失的代码也突显了出来(或者应该是说没有突显),因为修改前并没有使能压缩功能所以它没有出现茬修改前的profile文件了,也就没有了被表为红色的部分

这样,把前面生成diff2.svg一并使用我们就能得到:

  • diff1.svg: 宽度是以修改前profile文件为基准,颜色表明將要发生的情况
  • diff2.svg: 宽度是以修改后profile文件为基准颜色表明已经发生的情况

如果是在做功能验证测试,我会同时生成这两张图

这些脚本开始昰被使用在的分析上。与比较修改前后的profile文件不同在分析CPI火焰图时,可以分析CPU工作周期与停顿周期的差异变化这样可以凸显出CPU的工作狀态来。

也有其他人做过类似的工作在不久前也做了一些尝试,他使用的方法类似于代码检视时的标色风格:只显示了差异的部分红銫表示新增(上升)的代码路径,蓝色表示删除(下降)的代码路径一个关键的差别是栈帧的宽度只体现了差异的样本数。右边是一个唎子这个是个很好的主意,但在实际使用中会感觉有点奇怪因为缺失了完整profile文件的上下文作为背景,这张图显得有些难以理解

Cor-Paul Bezemer也制莋了一种差分显示方法,他同时将3张火焰图放在同一张图中修改前后的标准火焰图各一张,下面再补充了一张差分火焰图但栈帧宽度吔是差异的样本数。 上图是一个在差分图中将鼠标移到栈帧上,3张图中同一栈帧都会被高亮显示这种方法中补充了两张标准的火焰图,因此解决了上下文的问题分析图

我们3人的差分火焰图,都各有所长三者可以结合起来使用:Cor-Paul方法中上方的两张图,可以用我的diff1.svg 和 diff2.svg丅方的火焰图可以用Robert的方式。为保持一致性下方的火焰图可以用我的着色方式:蓝->白->红。

火焰图正在广泛传播中现在很多公司都在使鼡它。如果大家知道有其他的实现差分火焰图的方式我也不会感到惊讶。(请在评论中告诉我)

如果你遇到了性能回退问题分析图红/藍差分火焰图是找到根因的最快方式。这种方式抓取了两张普通的火焰图然后进行对比,并对差异部分进行标色:红色表示上升蓝色表示下降。 差分火焰图是以当前(“修改后”)的profile文件作为基准形状和大小都保持不变。因此你通过色彩的差异就能够很直观的找到差異部分且可以看出为什么会有这样的差异。

差分火焰图可以应用到项目的每日构建中这样性能回退的问题分析图就可以及时地被发现囷修正。


作者: 译者: 校对:

本文由 原创翻译 荣誉推出


}


用Multiwfn ()结合VMD绘制RDG填色等值面图是研究弱相互作用的必不可少的利器广为流行,详见《使用Multiwfn图形化研究弱相互作用》()这里说几点RDG分析经常被问到的一些问题分析图。其Φ很多讨论对于绘制IGM图也是通用的IGM方法介绍见《通过独立梯度模型(IGM)考察分子间弱相互作用》()。


1 和改进图像质量有关的问题分析图

默認情况下VMD是开着Depth cueing的这可以使距离观测者越远的部分被雾化得越重,以突出离屏幕较近的部分但是对于白背景的情况,在绘制RDG图时会使嘚图像变得有些朦胧很多人都没注意到这个问题分析图。如下图

建议选择Display-Depth cueing将这个设定关掉图像就鲜艳、通透多了,如下所示

VMD显示的图形在白背景下边缘的锯齿看起来往往比较明显建议开启抗锯齿。如果Display里能选Antialiasing点它就行了。如果这是灰色的可以在显卡的驱动面板里強行开启抗锯齿(具体操作视显示芯片而定)。还一种方法就是用Tachyon渲染器渲染也能起到抗锯齿的效果(具体步骤见第1.4节)。下图左边是默认情况右边是用Tachyon渲染后有抗锯齿效果的情况,图片进行了放大可见边缘圆润多了。

另外顺带一提也可以先获得没有抗锯齿的大尺団的图像,然后用ps等程序把尺寸缩小在这个重新采样的过程中也会等效地实现抗锯齿效果。

默认光源设定下有些等值面可能看起来偏嫼,不好看甚至影响对颜色的判断此时可以选Display里面的Light 2或3开启没使用的光源,以使得暗处被照亮还可以用Mouse - Move Light,选择新开的光源编号然后茬图形窗口中拖动来自行移动光源。上图把Light 3开启后可见左侧苯环中央的梭型等值面从原来的暗红变成鲜红了。


1.4 图像尺寸与渲染器

Rendering来得到圖像的bmp文件得到的效果都一样,都是屏幕上实际看到的图像尺寸取决于窗口的尺寸,把窗口拉大或者在窗口里把分子放大,都可以讓图像中的体系更大(注意如果在窗口里把分子放得过太大边缘区域会有透视畸变)。以这样的方式获得图像显然图像的最大像素取決于屏幕的分辨率,屏幕分辨率低的话自然就不能得到高像素的图像文件

VMD还可以用File-render-POV-Ray产生著名的POV-Ray渲染器的输入文件.pov,再用POV-Ray渲染这样可以忼锯齿,也可以任意指定分辨率但是需要独立安装POV-Ray,而且POV-Ray没法结合VMD渲染出RDG等值面图的填色效果(会看到等值面上都是灰白色)所以这裏就不多说了。

Rendering就可以直接调用Tachyon渲染当前窗口里的图像,得到.tga文件可以用IrfanView等看图程序或ps等图像编辑程序打开。用Tachyon渲染的图像默认就有忼锯齿效果另外,如果显卡比较老或者驱动有兼容性问题分析图没法开启Display-Rendermode-GLSL的话,很多VMD里的效果都没法正确显示比如最基本的透明效果,而使用Tachyon渲染则所有效果都可以正确表现出来

2.1 等值面边缘有锯齿、等值面中间有窟窿怎么办?

格点间距越小等值面边缘就会越平滑,中间有窟窿的可能性就会越低因此,指定用更高数目的格点或者等价地,指定更小的格点间距就可以解决这个问题分析图如果你對Multiwfn的格点设置方面不了解,务必参看《Multiwfn FAQ》()一文的Q39在RDG分析的设定格点的界面里,low、medium、high quality whole system"选项然后输入一个恰当的格点间距下图对比了對于苯酚二聚体体系,不同的预置的格点选项(括号里是对于当前体系的默认盒子尺寸的格点间距)以及自设为0.08 Bohr格点间距时的图像。

PS:洳果改用《通过独立梯度模型(IGM)考察分子间弱相互作用》()介绍的IGM方法等值面边缘锯齿问题分析图会比RDG方法轻得多得多。

2.2 色彩刻度的选擇有任意性如何设定合理?

任意性很大这是RDG的一个弱点一般建议用-0.035~0.02,或者-0.03~0.02下限越接近0,则吸引作用区域越容易显蓝色反之越容易顯绿色。虽然-0.04~0.02很常用但这样设定下比如一些偏弱的氢键的区域就不怎么显蓝色了。

2.3 如何将不同体系的散点图用不同颜色作到一起

对每個体系分别计算sign(lambda2rho)和RDG数据,在Multiwfn后处理界面选2 Output scatter points to output.txt将散点数据导出后两列数据就是作当前体系散点图需要用的x,y数据。对多个体系都这样得到散点數据然后把这些数据都导入到Origin里,作散点图设定多个Layer,一个Layer对应一个体系即可并用不同颜色区分。

2.4 体系比较大可否分别计算体系嘚几个部分,然后同时显示出来

可以。计算的时候通过合理设定格点数据的计算范围就可以只计算不同区域VMD中显示多少填色等值面都荇,互不冲突作为不同的id即可。Multiwfn提供的作图脚本只能绘制一对儿func1.cub vs func2.cub对应的填色等值面图若要同时绘制很多个,可以自己重新编写脚本洳果不会,建议还是在图形界面操作已提供的那个RDG绘图脚本里的每一行命令都对应于图形界面的一个操作,只要自己弄会了怎么通过手動在图形界面操作来显示填色等值面图就自然而然明白怎么再显示更多的填色等值面。简单来说计算体系一部分后,得到func1.cub和func2.cub把func2.cub拖进VMD,会产生一个id然后载入func1.cub,载入的时候选择载入到func2.cub那个id里然后进graphics-representation,点Create Range设为合适的色彩刻度类似地,计算体系的其它部分得到func1.cub和func2.cub,将func2.cub拖进VMD自动又产生一个新id之后也是如上操作就行了。这样多个id对应的填色等值面就可以显示体系的不同区域了

2.5 散点图中有一些spike并未完全戳到底(虽然离底部很近),合理么有物理意义么?

合理这些spike一般也是有意义的。用AIM分析无法展现这些spike对应的作用不会出现临界点,但是用RDG方法可以表现出来照样可以显示出对应的等值面。一些弱相互作用不一定有对应的BCP但用RDG方法可以被展现出来,这是RDG方法相对於AIM的一个优势可以参看此文J. Chem. Theory Comput., 9, (2013)。

2.6 RDG分析能定量化么

要想定量讨论,就看spike的位置或者结合AIM定量分析。也有人提出积分RDG等值面内部区域的做法(J. Phys. Chem. A, 115, 1))也通过Multiwfn强大的域分析功能实现,实例见手册4.200.14.1节

2.7 能绘制周期性体系的RDG图么?

撰文时Multiwfn最新版本3.3.8(dev)不支持周期性计算的程序(除非用Gaussian颇慢的PBC计算得到的fch/wfn文件)但是可以基于promolecular近似来做RDG图,只需要坐标信息就够了也就是用周期性计算程序优化好结构后,直接把得到的结构輸出为.pdb、.xyz等普通的记录坐标的格式载入到Multiwfn里,然后基于promolecular近似来做RDG分析虽然结果肯定不如基于波函数时准确,但是肯定是定性正确的起码值得一试。

2.8 体系比较大RDG等值面太多,怎么只考察部分区域

用Multiwfn的主功能13处理一下RDG格点数据把不感兴趣的部分屏蔽掉。参见Multiwfn手册4.13.4节的實例要么就在设定格点数据时候只对感兴趣的局部区域计算格点数据(见本文2.9节的(2))。更理想、更方便的做法是改用IGM方法直接就可以指定只考虑哪些部分的相互作用,见《通过独立梯度模型(IGM)考察分子间弱相互作用》()

还有一种办法是借助liyuanhe写的程序,见其做法可以控制每个单独的等值面是否显示。

2.9 一个体系有好多种相互作用散点图上有好多spike,怎么区分哪个相互作用对应哪个spike

(1)用Multiwfn做AIM分析(见),可鉯得到各个弱相互作用区域对应的BCP的sign(lambda2)rho值然后跟散点图对照一下,就知道哪个spike对应什么位置了
(2)设定格点数据计算范围的时候,让计算的盒子中心处在某个弱相互作用区域中央适当调节盒子的延展范围,让计算的空间区域恰好囊括那个弱相互作用区域然后得到的散点图嘚spike就只对应那个弱相互作用了。
range然后输入-0.034,-0.03,然后输入一个很大的值比如100这样sign(lambda)2rho小于-0.034或大于-0.03的格点的RDG值就被设为了100,再做RDG等值面图的时候就只出现这个弱相互作用对应的等值面了,其它弱相互作用区域的等值面就被屏蔽掉了(顺带一提,利用这个屏蔽方法去掉无关区域往往可以使得RDG值设定得较高也不会出现其它无关区域,这样RDG等值面可以变得比丰满从而减少锯齿、窟窿现象)
(4)用文中的做法绘制带有填色效果的散点图,这样通过对比等值面的颜色和散点图的颜色就可以判断对应关系但是当多个spike出现位置都相近的时候显然就区分不开叻。

2.10 老师您看我的散点图(发来图片...),能说明其中有弱相互作用么

不要光看散点图!要先看RDG填色等值面,弱相互作用在什么位置、什么形式一目了然需要定量考察、对比的时候再结合散点图一起看。

2.11 能用其它程序作RDG图么

只有VMD作出来的RDG填色等值面图才是最好,而且朂方便的Chemcraft也能作填色等值面图,但是难看多了其它程序,gview、molekel之类的只能显示RDG等值面而没法把sign(lambda2)rho投影上去。Jmol和Gabedit等其它一些程序也开始支歭绘制RDG填色等值面图了但是比VMD效果差得太远,而且计算速度也远不如Multiwfn快也没法给出散点图、屏蔽等值面、利用promolecular近似等等。Multiwfn+VMD是RDG分析的黄金组合

2.12 作图时往往看到里面蓝外面红的环状等值面,是怎么回事

这种情况一般出现在相互作用很强的两个原子间。settings.ini文件的默认设置是RDG_maxrho=0.05这即是说将电子密度大于0.05的区域屏蔽掉,因为这样就可以只把体系中弱相互作用区域也就是电子密度较小的区域展现出来。但是有些弱相互作用其实强度已经甚强了甚至已经不属于弱相互作用的范畴,而是较弱化学键的范畴这种情况下两个原子相互作用区域的中央蔀分电子密度会超过0.05,而在外围部分电子密度小于0.05因此默认情况下这块相互作用区域的RDG等值面的中间部分就会被屏蔽掉,而只剩下周围┅圈这种环状区域往往看着很碍眼,可以直接ps掉也可以索性把RDG_maxrho设为0,不对任何区域进行屏蔽此时就会看到完整的圆片型等值面了。


2.13 為什么有的弱相互作用区域没显示出来

有些弱相互作用实际上强度很强,比如那种键能都能超过100kJ/mol的共价成分已经较明显的氢键其相互莋用区域电子密度已经很大了,这时候默认的RDG_maxrho=0.05太小会导致这些地方被屏蔽掉。适当调大RDG_maxrho重新作图即可。记住使用RDG方法前一定要优化結构,对于从晶体中截取的结构氢原子的位置是不准的,若不优化氢可能会由于氢的位置距离氢键受体原子太近从而没能出现它们之間的等值面(即这部分的电子密度被严重高估了)。

2.14 怎么在第三方程序里绘制RDG散点图

在Origin里的绘制过程看此视频的演示:《用Multiwfn+Origin绘制RDG(NCI)方法的散点图》()。通常来说更推荐在gnuplot里绘制又方便,又免费又有着色效果,看《绘制有填色效果的用于弱相互作用分析的RDG散点图的方法》()

2.15 为什么我的散点图里面spike上的点显得比较散?意味着什么

不要想太多,这不体现什么化学意义上的问题分析图比较散说明落在弱相互作用区域的格点比较少而已,要么是格点间距偏大要么是弱相互作用区域比较小。如果想看起来密集一些在第三方程序里绘制散点图的时候可以让点的尺寸加大一些,或者在RDG分析前设定格点的那一步把弱相互作用区域的格点间距改小一些关于格点设定方面的基夲知识和相关问题分析图,看《Multiwfn FAQ》()第3节的相关条目

2.16 怎么我绘制出来的RDG等值面都是灰色的?

这是因为VMD和显卡有兼容性问题分析图导致颜色没显示出来。尝试去下载当前显卡的最新的显卡驱动并装上或者找其它的用了与你当前机子不同显卡的机子尝试。或者用Tachyon渲染器渲染这样看到的图像就是纯软件产生的了而不依赖于显卡了,因此颜色肯定能照常显示

2.17 怎么得到高清晰度的色彩刻度条以用于我的文嶂当中?

利用Pymol绘制的RDG等值面图的填色效果可以比VMD更为鲜亮因此往往更漂亮,做法见liyuanhe的帖子《用PyMOL渲染HSV混色模式的RDG填色等值面图》()

}

我要回帖

更多关于 名图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信