Linux系统运行过程中经常会发生性能问题,我们必须去跟踪和发现该性能问题的根因什么。影响系统性能的因为有可能出现在硬件上,也有可能出现在软件上,这就包括内核软件和用户态软件。内核开发者们知道内核运行的过程中哪些因素会影响系统开销。所以为我们提供了一种名为软件性能事件的支持。以方便我们应用的开发者来观测这些事件发生的次数,以及发生时所触发的函数调用链。本来主要讲述Perf工具的使用如何发现软件性能事件的影响。
一、软件性能事件介绍
Linux系统中是perf list命令可以列出它所支持的很多影响性能的软件事件,如下图1所示。从图中我们看到内核支持了很多影响性能的软件事件,本
图1
文只摘取其中常见且重要的几个重要的内核事件进行讲解。
alignment-faults:处理器体系结构确定它从内存读取数据不是一个字节一个字节的读取,而是按照某一个边界对齐,一个数据块一个数据块进行读取。数据块大小根据不同的处理器不同,可能是4字节,可能是8字节。如果程序员提供给处理读取的数据没有按边界对齐,那处理会消耗时钟周期多读数据并且进行数据的整理,影响系统性能。
context-switches OR cs: 进程上下文切换次数统计事件,Linux系统上内核每一次进程调度切换都会消耗处理器的时钟周期,一般是US级别,所以系统上频繁的进行进行切换会影响系统性能。
cpu-migrations OR migrations:在多处理器上运行时,进程可能会被调度到Core上运行,不同的Core有自己的缓存(如L1、L2)。处理的缓存对系统性能有很大影响,一个进程如果被不断的调到不同的处理器,势必会影响其性能。
page-faults OR faults: 这个就是我们经常听说的缺页中断,用户进程中在申请内存的时候,其实申请到的只是一个vm_area_struct而已,仅仅只是一段地址范围。物理内存并不会立即就分配,具体的分配等到实际访问的时候。当进程在运行的过程中在栈上开始分配和访问变量的时候,如果物理页还没有分配,会触发缺页中断。缺页中断本身就消耗处理器时钟周期,如果缺页还引发了swap机制,影响更是急速下降。
二、系统软件性能事件分析实践
首先可以使用“perf stat -e [事件】 -sleep [采集时间]”在采集时间内统计感兴趣事件的数据,如图2所示。如图所示5秒内系统一共发生2次进程上
图2
下文切换,69次缺页中断。 若需要保存系统采集的数据结果,可以使用perf record 命令,该命令的作用类似perf stat,但是会把数据采集结果保存到perf.data文件中,如图3所示。数据保存后可以使用perf script查看数据,如图4所示。
图3
图4
三、单进程软件性能事件跟踪
为了跟踪某一个进程的内核调用栈,我们写一个简单的C程序,间隔5秒反复打印一个字符串,如图5所示。使用"perf record -e [事件] -p [进程号]“
就可以跟踪某一个进程的具体软件性能事件。图6显示针对进程1756采集上述常见的4个软件性能事件,并通过”perf report“可以看到引起该进程进行了4次切换,引起切换的原因是调用了内核函数do_nanosleep。这和我们的测试程序行为一致,因为我们一共采集了20秒,测试进程每5秒睡眠一次,一次睡眠调用导致进程进行了一次切换,所以一共进行了4次切换。
图5
图6
图7
四、总结
Perf跟踪系统性能事件还可以做更多事,可以跟踪具体函数调用的耗时、函数栈、系统时钟周期等。Perf本身运行的性能就比较好,对被监控对象无代码侵入,采用定时采样的机制采集相关数据。