自编教材分享:第三章—程序性能的分析和测量(三)



本期分享程序性能测量的工具:剖析类工具和监视类工具。
函数剖析工具gprof
Gprof工具是GNU编译器工具包提供的性能分析工具。使用代码抽样和插入技术,收集函数剖析信息和调用图文件,从而给出函数调用关系、调用次数、执行时间等信息。此外还会列出各个函数的耗时比例。
Gprof使用代码抽样和插入技术,收集函数剖析信息和调用图文件,从而给出函数调用关系、调用次数、执行时间等信息。Gprof是通过在编译时插入代码来分析程序,因此在一些情况下,其给出的结果会有不准确的地方。
Gprof通常和GCC、LLVM等编译器配合使用,在使用GCC或LLVM编译链接程序时,添加选项-pg,表示产生的程序可以使用gprof分析。程序运行结束后,会在程序退出的路径下生成一个gmon.out文件。gmo.out文件是记录并保存下来的监控数据,可以通过命令行方式操作或图形化工具Kprof来解读这些数据并对程序的性能进行分析,便可得到优化人员可阅读的信息。

Gprof输出结果主要包含两部分,剖析文件Flat profile和调用图Call graph。
Flat profile中每一行代表一个函数,各列参数含义为,%time:函数独立运行时间,不包含被该函数调用的其它函数的运行时间,占总运行时间的百分比; Cumulative seconds: 所有函数的累积运行时间,包括自身; Self seconds: 函数的独立运行时间,单位为秒; Calls:函数被调用的次数; Selfs/call: 函数每次调用的平均独立运行时间,单位为秒; Totals/call: 函数每次调用的平均整体运行时间,包括被它调用的其它函数的运行时间,单位为秒。

调用图的每一部分代表一个函数,最左边显示了该函数的运行索引。位于该索引之上的是调用当前函数的函数,之下的是被当前函数调用的函数。%time对应函数运行时间,包括被调用函数的运行时间,占总运行时间的百分比。Self对应函数的独立运行时间,Children对应函数的整体运行时间减去独立运行时间,Called对应函数的调用次数。

可视化软件性能分析工具oneAPI
Intel推出的oneAPI 2022工具是基于 Intel oneAPI 这一编程模型开发的产品之一,包含编译器、函数库、预先优化框架以及先进的分析调试工具等组件。Intel oneAPI toolkits中的VTune是一个用于分析和优化程序性能的工具,可以通过从系统中收集性能数据、从系统到源代码不同的层次以及形式上组织和展示数据、发现潜在的性能问题并提出改进措施这三个方面,帮助优化人员找到性能不理想的原因并针对性的对程序进行优化。

Intel®Advisor由一组工具或视角组成,Intel Advisor能够从向量化、CPU/GPU /内存性能上限、卸载建模以及线程角度分析代码,可以帮助优化人员分析程序中影响大、优化不足的循环优化瓶颈,还可以根据硬件施加的性能上限可视化实际性能,给出下一步的优化步骤建议等,从而帮助Fortran、C、C++等多种语言构建的应用程序达到较好的性能。

性能分析工具perf
Perf工具是基于用户空间数据上的命令行性能分析工具,支持软硬件计数器,并可以像strace工具一样跟踪内核调用。借助perf工具,应用程序可以使用性能监控单元(performance monitoring unit,PMU)、tracepoint和内核中的特殊计数器来进行性能统计。
在进行Perf输出结果分析时首先要找到程序中最耗时的代码片段即程序热点,再判断是否能够提升热点代码的执行效率。参数含义为,Task-clock-msecs:CPU利用率,若该值较高则说明程序的多数时间花费在CPU计算上而非 IO;Context-switches:进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是需要避免的。

CUDA程序性能分析工具nvprof
Nvprof工具是NVIDIA开发的用于分析CUDA程序性能的工具,可以统计各个内核和CUDA函数的运行效率,还可以给出硬件计数器的值。和CUDA函数的运行效率,还可以给出硬件计数器的值。比如某个计算单元上一共发出了多少指令,核心一共发射和执行了多少条指令等。
使用nvprof非常简单,通常只需要在CUDA程序前面加上nvprof。例:

监视类工具
系统活动情况报告工具sar
Sar工具是Linux系统上最为全面的系统性能测量工具之一,可以从多方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存利用率、进程活动及网络流量等。
Sar命令常用格式及使用方法为:
简单示例:
这个命令表示每间隔1秒钟统计一次,总共统计三次。参数含义为,%user用户空间的CPU使用;%nice改变过优先级的进程的CPU使用率;%system内核空间的CPU使用率;%iowaitCPU等待IO的百分比;%steal管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。

要判断系统瓶颈问题,有时需要几个sar命令选项结合起来。
如果怀疑CPU存在瓶颈,可用sar -u和sar -q等来查看。
如果怀疑内存存在瓶颈,可用sar -B、sar -r和sar -W等来查看。
如果怀疑I/O存在瓶颈,可用sar -b、sar -u和sar -d等来查看。
指标性能分析技巧:
若%iowait的值过高,表示硬盘存在I/O瓶颈;
若%idle 的值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量;
若%idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是CPU。
监控网络工具netstat
Netstat工具是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息,也可以显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于查询本机各端口的网络连接情况。
Netstat命令常用格式及使用方法为:
使用netstat命令时,系统会把性能统计信息以概要形式呈现,路由信息等以快照形式呈现。参数含义为,Protoco:协议的简称,可以是 TCP 或 UDP; Recv-Q:接收队列,数字一般都应该是0,如果不是,则表示软件包正在队列中堆积; Send-Q:发送队列;Local Address:本机的 IP 和端口号; Foreign Address:所要连接的主机名称和服务;State:指现在连接的状态,LISTEN 等待接收连接, ESTABLISHED 一个处于活跃状态的连接;TIME_WAIT 一个刚被终止的连接,它只持续1至2分钟,然后就会变成 LISTEN 状态。

监控硬盘工具iotop
Iotop用来监控硬盘 I/O的使用情况,其界面和top类似,包括 PID、用户、IO、进程等相关信息。Linux下系统自带的I/O统计工具如iostat等大多数是只能统计到单碟设备的读写情况,如果想知道每个进程是如何使用I/O的就比较麻烦,使用iotop命令可以很方便的查看,命令iotop -h可以查看使用帮助,最简单的方法就是直接使用iotop命令。
通过输出结果,可以清楚地知道磁盘 I/O 的使用状况。其中,Total DISK READ与Total DISK WRITE一方面表示了进程和内核线程之间总的读写带宽,另一方面也表示内核块设备子系统的情况;Actual DISK READ与Actual DISK WRITE表示在内核块设备子系统和硬件对应的实际磁盘I/O带宽;TID表示线程号或进程号;PRIO表示线程运行时的I/O优先级;USER表示进程所属用户;DISK READ表示刷新时间间隔内读取数据量;DISK WRITE表示刷新时间间隔内写入数据量;SWAPIN表示每个进程的交换使用率;IO表示每个进程的 I/O 利用率,包含磁盘和交换;COMMAND表示进程名。

实时系统监控工具mpstat
Mpstat是实时系统监控工具,用于报告CPU相关的一些统计信息,这些信息存放在/proc/stat文件中。在多CPU系统中,其不但能查看所有CPU的平均状态信息,而且能够查看特定CPU的信息。例如命令表示每2秒对所有处理器统计数据报告,采集三次信息并输出。

