SEP,EMON和EDP

近一段时间一直在做些任务负载特征分析的事儿。针对服务器上运行的若干个不同的业务,分析它们对于不同细颗粒度资源的使用情况。本身这些分析的工作是可以通过vtune这类的工具直接得到的。但vtune是一个桌面版本的性能分析工具,一对一的执行、跟踪、数据分析不够“工业化”。于是,这里就讲讲VTune的底层实现SEP和EMON以及EMON结果的分析工具EDP。

SEP是一个运行在驱动层开源的系统事件采样工具,它旨在为上层用户提供一个比较统一完善的接口。当前SEP支持Linux,windows, FreeBSD, MacOS以及Android(这也是Linux)——主流操作系统都在里边了。
而EMON则是基于SEP接口的一个上层实现。Emon本身不是开源软件,从发行渠道来说,emon分为公开版本、Intel合作伙伴版本等。大概是sep的使用场景比较小的缘故。传统上,sep和emon总是结对出现的,罕见sep被其他应用使用的场景。默认情况,如果你的系统安装了VTune,系统的某个路径下会能找到sep和EMON。
题外话:尽管是Intel出品,Emon/Sep也有针对AMD以及ARM的版本提供。

sep+Emon环境的配置

本文将以Linux为例,其他操作系统的仅供参考。

首先是安装包,传统上如果你安装了Vtune,那/opt/intel/vtune_amplifier_<version>_for_systems/target/linux/vtune_amplifier_target_x86_64.tgz  目录下就是emon+sep的安装包。把它直接拷贝到另一台主机上。

解压后的路径是这样的:

[root@CCE-SDI-Benchmark-Compare sep]# ls
android_target bin32 bin64 config docs include lib32 lib64 README.txt reporting_tools sepdk sep_vars.sh

如果你拿到的版本跟我展示的不一样也不要紧,只要有标红的两个路径就不影响使用。

由于sep是一个内核驱动,系统依赖 gcc以及kernel-devel(for redhat/centos/fedora) kernel-dev(ubuntu/debian)。

[root@CCE-SDI-Benchmark-Compare sep]# source sep_vars.sh #加载系统环境变量 

[root@CCE-SDI-Benchmark-Compare sep]# cd sepdk/src/
[root@CCE-SDI-Benchmark-Compare src]# ./build-driver #编译sep
......
[root@CCE-SDI-Benchmark-Compare src]# ./insmod-sep #加载sep驱动
......

请注意!第一条source命令在每次使用emon之前都要加载。

冒烟测试:

[root@CCE-SDI-Benchmark-Compare sep]# emon -v
EMON Version .............. V10.1.6 (private)
Copyright(C) 1993-2018 Intel Corporation. All rights reserved.
Application Build Date: Mar 23 2018 at 15:50:22
SEP driver version: 4.1.6
PAX Driver Version: 1.0.2
total_number_of_processors  ...... 72
number_of_online_processors ...... 72
cpu_family ................ Intel(R) Xeon(R) Processor code named Skylake

....

这里,通过emon -v命令可以直接打印系统的各种详细配置。如果这条命令完整无误,说明系统的sep+emon组合已经装好。

emon的使用

其实单讲emon的使用本身没有太多内容,一个-h参数也就覆盖的差不多了。有几个概念需要重点说说:

  • 事件计数器:event counter,cpu硬件实现的技术器,主要通过它在指定时间内的变化了解系统的资源使用情况。
  • group:由于CPU计数器的限制,只允许限定数量的计数器同时使用,所以-t参数确定了每一个group的计数区间(计数器计数时间)。
  • loop:emon允许指定多个group,每个group依次完成计数统计,当所有的group都完成之后,该loop结束。

几个例子:

  1. 一个计数器”CPU_CLK_UNHALTED.REF”在一个group,每个group统计0.5秒。总计完成5(5*0.5=2.5秒)个loop: emon -l5 -t0.5 -C “CPU_CLK_UNHALTED.REF”
  2. 用逗号分割,为group里增加一个计数器,其余的不变,所以还是2.5秒完成: emon -l5 -t0.5 -C CPU_CLK_UNHALTED.REF,INST_RETIRED.ANY”
  3. 用分号分割后,把两个计数器放在两个group里,时间翻倍,5秒结束:emon -l5 -t0.5 -C “CPU_CLK_UNHALTED.REF;INST_RETIRED.ANY” 

其实看上去似乎很容易的命令用起来还是需要不少背景知识的,首先你不知道每个计数器到底意味着什么;接着你又需要了解每个group怎么设置才合理;然后你还需要解读emon的输出。所以为了解决这些问题,就有了EDP工具。

EDP的使用

EDP全程是Emon Data Processor。它提供了一个标准的计数器列表和一个基于ruby的数据分析工具。经过EDP,可以将系统中几乎所有的计数器通过最高效的group设定采集到,并最终转化为excel图表和文本。

edp不需要安装,下载解压后目录下包含一个ruby脚本,一个(或者针对多个平台区分的多个).txt文件包含了所有计数器设定的文件,你可以通过-i参数直接配合emon使用。还有一个xml文件包含了很多系统重要指标的转换公式——很容易理解,你也可以自己增减公式。如果需要导出为excel则限定了操作系统必须为windows并且预装了office软件和ruby环境。否则,单独只有ruby环境的话系统只能将最终结果转换为csv文件。话说本人自己还是喜欢csv,至少很容易完成数据转换,况且几百M的excel打开、编辑的时候都是灾难。

传统上,我们分析一个硬件系统的短板往往只能追溯到CPU,内存,IO的三大块。借助于本文中的组合,我们很容易的完成对于某一个细粒度资源的评估——比如内存带宽是否足够;黑盒代码是否有不合理的调用等。如果你用过perf,你可能会觉得perf和emon似乎差不多,但emon的真正优势在于它通过sep的驱动直接绕过了操作系统,可以直接访问很多perf无法触及的计数器,同时在性能、稳定程度、时间粒度上都是perf无法比拟的。而edp则允许你直接组合解读各个系统指标,通过易读的公式让你明确了每一指标的具体由来,方便你找到问题的根本。

推荐阅读:
事出前些日子有人咨询我:“在某
时延 latency(亦称为延
似乎每次开头都要讲述一下计算机

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据