【鲲鹏经典直播征文】使用鲲鹏性能分析工具,实现可视精准调优,突破性能瓶颈
一、工具简介
系统性能的提升,需要综合考虑计算机硬件、操作系统、应用程序等多方面的因素,这些因素是互相影响的,要不断的调试、分析、调整相关参数,才能最终达到最优的系统性能。这一过程比较漫长,对人员的技术要求也比较高,很多情况下,调优人员在特定系统上花费了大量的时间,但是最终也不一定能达到性能的有效提升。不但如此,在系统出现故障或者异常时,要定位问题位置、找到触发的原因也是一件很繁琐困难的事情,为了协助开发者和调优人员在鲲鹏系统上有效调优、诊断异常,华为推出了鲲鹏性能分析工具,支持鲲鹏平台上的系统性能分析、Java性能分析和诊断调试,提供系统全景及常见应用场景下的性能采集和分析功能,同时基于调优专家系统给出优化建议。
当然,业界现在已经有丰富的性能分析工具了,华为又推出自己的工具,是不是有重复造轮子的嫌疑呢?其实,不是的,鲲鹏性能分析工具除了提供业界现有能力之外,还有下面四点考虑:
- 基于鲲鹏处理器,提供软硬件结合分析能力,采集和分析硬件性能指标,以及硬件性能在软件层的表现,让用户更加全面的了解整个系统的运行状况。
- 系统化的分析建立各层指标之间的关联关系、并以用户视角呈现这些指标和关系,方便用户更易于发现问题。
- 结合华为在鲲鹏处理器上的性能优化经验,给出优化思路和建议,帮助客户快速的定位和修复间题。
- 实现分析过程的管理,包括优化结果的对比,优化效果的标记,优化过程的记录等。
1.工具的功能
鲲鹏性能分析工具的功能如下图所示(本文的介绍不包括Java性能分析工具):
2.工具的目标用户
系统性能分析工具为软件开发人员、系统管理员/POC人员提供两种维度的性能分析视角,其中软件运行分析主要面向软件开发人员,以软件的行为为起点,从上往下分析,分析对象主要是热点函数、并发、锁与等待分析;系统资源分析主要是系统管理/POC人员使用,以系统资源为起点,自下向上分析,分析对象主要是系统配置、系统资源使用率/饱和度/错误、资源调度、NUMA访问等等。
二、软件架构
工具从逻辑上分为两个相对独立的模块,一个是Analysis Server,另一个是Agent。其中Analysis Server模块主要用来实现性能数据分析及分析结果呈现;Agent模块主要实现性能数据采集。
把工具分成两个部分,主要考虑的是尽可能减少分析工具对原系统的性能影响,因为Agent功能比较单一,对资源占用也少,在原系统上只部署Agent模块进行数据采集,采集成功后的数据发送给Analysis Server模块,在Analysis Server模块上对数据进行分析和呈现。
基于工具的这种逻辑架构,在实际部署时有两种部署方式,分别是单机部署方式和混合部署方式:
单机部署方式就是把Analysis Server和Agent部署在同一台服务器上;混合部署方式可以在一台服务器上Analysis Server和Agent,也可以在需要分析的机器上只部署Agent,这些Agent共享同一个Analysis Server,把采集的数据发送给Analysis Server进行分析和呈现。
工具可以部署在如下的硬件环境上:
- 基于鲲鹏916的服务器
- 基于鲲鹏920的服务器
- 基于上述服务器的虚拟机
- 基于上述服务器的Docker容器
操作系统要求是CentOS、EulerOS、openEuler、中标麒麟、麒麟V10、SUSE、Debian、UOS 20、凝思、Ubuntu等,详细的版本要求见鲲鹏开发套件兼容性查询助手。
三、功能原理
1、全景分析
全景分析通过采集系统的CPU、内存、存储IO、网络IO资源的运行情况,获得它们的使用率、饱和度、错误次数等指标,以此识别系统瓶颈。针对部分系统指标项,根据当前已有的基准值和优化经验提供优化建议。针对大数据、分布式存储和数据库场景的硬件配置、系统配置和组件配置进行检查,显示不是最优的配置项,同时分析给出典型硬件配置及软件版本信息。
全景分析的原理是基于USE(utilization、saturation、errors)性能分析方法,获得系统资源(CPU、内存、I/0等)的使用率、饱和度、错误等指标,以此识别系统瓶颈。
- 使用率:在规定的时间间隔内,资源用于服务工作的时间百分比。虽然资源繁忙,但是资源还有能力接受更多的工作,不能接受更多工作的程度被视为饱和度。
- 饱和度:资源不能在服务更多额外工作的程度,通常有等待队列。
- 错误:错误事件的个数。
USE分析流程如下:
全景分析可以分析多个指标,这些指标在分析结果页面上有详细的解读,这里就不再赘述。
2.进程/线程性能分析
进程/线程性能分析借鉴业界的USE方法,采集进程/线程对CPU、内存、存储IO等资源的消耗情况,获得对应的使用率、饱和度、错误次数等指标,以此识别性能瓶颈。针对部分指标项,根据当前已有的基准值和优化经验提供优化建议。支持分析单个进程的系统调用情况。
3.热点函数分析
支持分析C/C++程序代码识别性能瓶颈,给出对应的热点函数以及源码和汇编指令的关联详情。通过冷/热火焰图展示函数的调用关系,发现优化路径。
对于Top的热点函数,工具会给出优化建议,如果优化点适配鲲鹏加速库功能的话,会给出替换、使用这个加速库的建议。工具同时会指出是哪一行代码或者哪一条汇编指令消耗资源是最高的,给出优化的方向。工具会抓出热点函数所有的调用栈,经过规整后形成调用栈火焰图,可以方便直观的看出哪些函数需要去优化。
火焰图的含义:
- y轴表示调用栈,每层一个函数。调用栈越深,火焰越高,顶部是正在执行的函数,下方是它的父函数。
- x轴表示采样数。函数在x轴占据的宽度越宽,表示它的采样次数越多,即执行的时间越长。注意,x轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图能够直观展示函数调用关系和执行时间情况,帮助发现热点函数及其优化路径。冷火焰图用于定位CPU不能充分使用的情况,一般选择冷色调。
鼠标悬停于函数块时,会出现悬浮框,若出现“查看函数详情”可点击查看。
- 热点函数是基于CPU Cycles事件的数据进行分析的:
热点函数和热点指令是基于CPUCycle事件中断时的调用栈信息标识的。在一段时间内,某个函数的某个指令被采集的越多,就认为越热; - 以调用栈信息反映调用关系,绘制火焰图;
- 反汇编目标文件获取汇编指令;
- 通过符号表和IDEBUG信息关联源码;
4.微架构分析
微架构分析基于ARM PMU(Performance Monitor Unit)事件,建立鲲鹏处理器的Top-Down模型,获得指令在CPU流水线上的运行情况,帮助用户快速定位当前应用在CPU上的性能瓶颈。用户可以有针对性地修改自己的程序,以充分利用当前的硬件资源。
对于Top-Down模型,可以选择的分析指标如下:
- Bad Speculation:该指标能够反映出由于错误的指令预测操作导致的流水线资源浪费情况。
- Front-End Bound:该指标代表了处理器处理机制的前置部分,在该部分,指令获取单元负责指令的获取并转化为微指令提供给后置部分的流水线执行。该指标能够反映出处理器前置部分没有被充分利用的比例情况。
- Back-End Bound->Resource Bound:(只适用于Kunpeng 920处理器)Back-End是处理器处理机制的后置部分,它负责微指令的乱序分发和执行,并返回最终结果。Resource Bound是Back-End Bound的子类,该指标能够反映出由于缺乏资源把微指令分发给乱序执行调度器,从而导致的流水线阻塞情况。
- Back-End Bound->Core Bound:Back-End是处理器处理机制的后置部分,它负责微指令的乱序分发和执行,并返回最终结果。Core Bound是Back-End Bound的子类,该指标能够反映出由于处理器执行单元资源不足导致性能瓶颈的比例情况。
- Back-End Bound->Memory Bound:Back-End是处理器处理机制的后置部分,它负责微指令的乱序分发和执行,并返回最终结果。Memory Bound是Back-End Bound的子类,该指标能够反映出由于等待数据读/写导致的流水线阻塞。
5.访存分析
鲲鹏处理器是NUMA架构,并存在三级Cache机制,CPU核访问数据时,存在本地、跨片、跨带访问Cache和内存的情况。不同的访问路径,在时延和带宽上都相差很大,并严重影响系统和程序性能。工具基于CPU访问缓存和内存的事件,分析访存过程中可能的性能瓶颈,给出造成这些性能问题的可能原因及优化建议,具体包括三个功能:访存统计分析、Miss事件分析、伪共享分析。
- 访存统计分析基于CPU访问缓存和内存的PMU事件,分析存储的访问次数、命中率、带宽等情况。
- Miss事件分析基于ARM SPE(Statistical Profiling Extension)的能力实现。SPE针对指令进行采样,同时记录一些触发事件的信息,包括精确的PC指针信息。利用SPE能力可以对业务进行LLC Miss,TLB Miss,Remote Access,Long Latency Load等Miss类事件分析,并精确的关联到造成该事件的代码。用户可以有针对性地修改自己的程序,降低Miss事件发生的几率,提高程序处理性能。
- 伪共享分析基于ARM SPE(Statistical Profiling Extension)的能力实现。SPE针对指令进行采样,同时记录一些触发事件的信息,包括精确的PC指针信息。利用SPE能力进行伪共享分析,可以得到发生伪共享的次数和比例、指令地址和代码行号、NUMA节点等信息。基于这些信息,用户可以有针对性地修改自己的程序,降低发生伪共享的几率,提高程序处理性能。
6.IO分析
I/O分析以存储块设备为分析对象,分析得出块设备的I/O操作次数、I/O数据大小、I/O队列深度、I/O操作时延等性能数据,并关联到造成这些I/O性能数据的具体I/O操作事件、进程/线程、调用栈、应用层I/O APIs等信息。根据I/O性能数据分析可以给出优化建议。系统内核需要支持ftrace采集。
IO分析的原理为:
- 在块设备层,通过ftrace工具跟踪内核的tracepoint事件,得到每个I/0操作的全部信息。
- 通过关联这些tracepoint事件,分析得到操作数据大小、操作时延等信息。针对一段时间内的I/0操作进行统计分析,进一步得到数据块分布、操作时延分布、数据大小分布等等信息。
- tracepoint事件只能反映到内核针对I/0的处理,而无法反映应用层的处理(非direct方式)。所以通过获取应用层I/0 API调用信息,形成内核层与应用层处理的简单映射,指导应用层的优化,例如通过某个段时间的数据块分布是连续还是随机,优化对应应用层的I/0请求。
- 支持获取自研盘内部性能数据。
7.资源调度分析
资源调度分析基于CPU调度事件分析系统资源调度情况。
资源调度分析原理:
采集内核CPU调度事件数据,从进程/线程的角度排列各个事件,计算出各个事件之间的时间差,并标记对应的状态。
采集内核CPU调度事件数据,从CPU核的角度排列各个事件,计算出各个事件之间的时间差,并标记对应的状态。
8.锁与等待分析
锁与等待分析基于Linux perf工具的采样数据,对glibc和开源软件(如MySQL、Open MP)的锁与等待函数(包括sleep、usleep、mutex、cond、spinlock、rwlock、semaphore等)进行分析,关联到其归属的进程和调用点,并根据当前已有的优化经验给出优化建议。
9.内存诊断
- 内存泄漏诊断
内存泄漏诊断主要分析应用程序存在的内存泄漏点(包括内存未释放和异常释放),得出具体的泄漏信息,并支持关联出调用栈信息和源码;分析后得出结果信息主要为Call Tree信息、源码信息、内存消耗信息、OOM信息。
- 内存异常访问诊断
内存异常访问主要分析应用程序的内存异常访问点,给出异常访问类型和内存访问信息,并支持关联出调用栈和源码。
内存诊断原理:
采用hook技术实现获取内存中请和释放信息,通时内存地址匹配申请点和释放点,判断是否泄漏或异常释放。其中,针对拉起进程的场景,采用preload加载用于hook函数的动态库;针对附着进程的场景,采用ptrace加载用于hook函数的动态库,并替换GOT PLT表。
内存越界是通过集成Google AddressSanitizer实现。AddressSanitizer在编译时插桩,对每块内存空间(8字节)增加shadowmemory。对所有的memory access都去检查该内存所对应的shadowmemory的状态。
详细的鲲鹏性能分析工具介绍见官网:https://www.hikunpeng.com/developer/devkit/hyper-tuner?data=web
可从如下地址免费获取鲲鹏开发套件专属远程云环境:https://ic-openlabs.huawei.com/devkit-env/#/home?lang=zh-cn
- 点赞
- 收藏
- 关注作者
评论(0)