内核同步对性能的影响及perf的安装和简单的使用

更多文章目录:点击这里
GitHub地址:https://github.com/ljrkernel

内核同步对性能的影响及perf的安装和简单的使用

看了一篇关于多线程应用程序性能分析的外文,结合之前学过的内核同步的相关内容,分享一下内核同步对性能的影响及性能分析工具perf的安装和使用。

1、几个重要的概念

进程:应用程序的执行实例,每个进程由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,即进程是操作系统进行资源分配的最小单元。进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。

线程:进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,将程序的启动点提供给操作系统。主执行线程终止了,进程也就随之终止。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。

单核处理器:一颗芯片里集成了一个CPU运算核心,在工作期间只能执行某一个程序,处理多个程序时,只能分时处理。

多核处理器:一颗芯片里集成了多个CPU运算核心,相当于多个单核CPU同时工作,CPU之间通过处理器内部总线进行通讯。因此,多核处理器可以同时处理多个程序,而不用等上一个程序完成。

多处理器:指简单的多个CPU工作在同一个系统上,多个CPU之间的通讯是通过主板上的总线进行的。

并发:在一个时间段内发生若干事件。使用单核处理器,多个工作任务是以并发方式运行的,因为只有一个CPU,各个任务分别占用一段时间,再切换到其他任务,等到下一次具有CPU使用权时再接着执行未完成的任务。

并行:在同一时刻发生若干事件。使用多核CPU时,可以将任务分配到不同的核同时运行,实现并行。

同步:并发或并行的各个任务不是独自运行的,任务之间有一定的顺序,下一个任务需要等上一个任务的结果后才会运行。

异步:并发或并行的各个任务是相互独立的,一个任务不受另一个任务的影响。

2、内核同步对性能的影响

锁争用:指锁正在被占用时,有其他线程试图获得该锁。一个锁处于高度争用状态,就是指有多个其他线程在等待获取该锁。由于锁的作用是使线程以串行方式对资源进行访问,所以使用锁无疑会降低系统性能。

扩展性:是对系统可扩展性的一个量度。对于操作系统,处理器,内存等可以被计量的计算机组件都可以涉及可扩展性。锁粒度太粗,很容易造成系统性能瓶颈。

理论上,处理器数量加倍,会使得系统处理性能翻倍,但实际上不是,主要是因为同步造成的开销。比如内核同步措施中的自旋锁,我们知道自旋锁同一时刻只能被一个内核任务持有,一个内核任务试图获得一个自旋锁,如果该锁没有被其它内核任务争用,那么它就可以马上获得这个自旋锁,如果该锁被其他内核任务争用,那么该任务就一直在忙等待(自旋等待,占用CPU时间),直到另一个内核任务释放该自旋锁。这就使得有时多核处理器看起来一直在忙,其实并不是每个核都在进行有效的工作,它们只是在自旋等待,但占用了系统资源。

设计更加细粒度的锁会缓解锁的争用,但是过多的锁会加大系统开销,造成很大的浪费。在低配机器上,锁粒度太粗,很容易造成系统性能瓶颈;一般来说,提高可扩展性是好事,因为可以提高Linux在更大型、处理能力更强大的系统上的性能,但是一味提高可扩展性,却会导致Linux在小型SMP和UP机器上的性能降低。因为小型机器可能用不到特别精细的锁,锁得过细致会增加复杂度,并加大开销。当锁争用严重时,加锁太粗会降低可扩展性;而锁争用不明显时,加锁过细会加大系统开销,带来浪费,这两种情况都会造成系统性能下降。设计初期加锁方案应该力求简单,仅当需要时再进一步细化加锁方案,精髓在于力求简单。

也曾设想过使用机器学习的方法判断锁争用情况,动态调整加锁方式,提高系统性能。Linux系统配置选项中,有关于锁的配置选项,可以根据实际情况进行权衡,如低配置机器,可以配置系统选项,关闭多余的锁,提高系统性能。

3、性能分析工具perf的安装和使用

Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。常用于性能瓶颈的查找与热点代码的定位。

系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。

  • 性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。
  • 代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。

4.18.0-15版Ubuntu安装perf命令如下:

sudo apt install linux-tools-common
sudo apt install linux-tools-4.18.0-15-generic

perf工具用法如下:

   
   annotate        Read perf.data (created by perf record) and display annotated code
   archive         Create archive with object files with build-ids found in perf.data file
   bench           General framework for benchmark suites
   buildid-cache   Manage build-id cache.
   buildid-list    List the buildids in a perf.data file
   c2c             Shared Data C2C/HITM Analyzer.
   config          Get and set variables in a configuration file.
   data            Data file related processing
   diff            Read perf.data files and display the differential profile
   evlist          List the event names in a perf.data file
   ftrace          simple wrapper for kernel's ftrace functionality
   inject          Filter to augment the events stream with additional information
   kallsyms        Searches running kernel for symbols
   kmem            Tool to trace/measure kernel memory properties
   kvm             Tool to trace/measure kvm guest os
   list            List all symbolic event types
   lock            Analyze lock events
   mem             Profile memory accesses
   record          Run a command and record its profile into perf.data
   report          Read perf.data (created by perf record) and display the profile
   sched           Tool to trace/measure scheduler properties (latencies)
   script          Read perf.data (created by perf record) and display trace output
   stat            Run a command and gather performance counter statistics
   test            Runs sanity tests.
   timechart       Tool to visualize total system behavior during a workload
   top             System profiling tool.
   probe           Define new dynamic tracepoints
   trace           strace inspired tool

先介绍一下常用的5种

(1) perf list

使用 perf list 可以查看perf能监控哪些性能指标。

CPU周期(cpu-cycles)是默认的性能事件,CPU周期是指CPU所能识别的最小时间单元,通常为亿分之几秒,是CPU执行最简单的指令时所需要的时间,例如读取寄存器中的内容,也叫做clock tick。

在这里插入图片描述

(2) perf stat

使用perf stat可以进行整体监测代码性能,该工具主要是从全局上监控,可以看到程序导致性能瓶颈主要是什么原因。因为不同的程序导致其性能瓶颈的原因不同,如有些程序慢是由于计算量大,而有些程序是由于频繁的I/O导致性能瓶颈,他们的优化方式不同。perf stat通过概括精简的方式提供被调试程序运行的整体情况和汇总数据。

在这里插入图片描述

信息 解释
Task-clock(msecs) CPU 利用率,该值高,说明程序的多数时间花费在 CPU 计算上而非 IO
Context-switches 进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的
CPU-migrations 表示进程运行过程中发生了多少次 CPU 迁移,即被调度器从一个 CPU 转移到另外一个 CPU 上运行
page-faults 是指程序发生的页错误次数
instructions 执行了多少条指令(IPC为平均每个cpu cycle执行了多少条指令)
branches 遇到的分支指令数
branch-misses 预测错误的分支指令数

通过指定 -e 选项,可以改变 perf stat 的缺省事件 ( 事件可以通过 perf list 来查看 )。

(3) perf top

使用perf top可以实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数、模块函数与内核函数,甚至能够定位到热点指令。默认的性能事件为cpu cycles。
在这里插入图片描述
第一列:符号引发的性能事件的比例,默认指占用的cpu周期比例。
第二列:符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、模块。
第三列:DSO的类型。[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库)。[k]表述此符号属于内核或模块。
第四列:符号名。有些符号不能解析为函数名,只能用地址表示。

(4) perf record

使用 perf-record 可以收集采样信息,并将其记录在数据文件中。随后可以通过其它工具(perf-report)对数据文件进行分析,结果类似于perf-top。
在这里插入图片描述

(5) perf report

使用perf report可以读取perf record创建的数据文件,并给出热点分析结果。
在这里插入图片描述


智慧人生,与你相伴
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34258344/article/details/104309361
今日推荐