更多文章目录:点击这里
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 codearchive         Create archive with object files with build-ids found in perf.data filebench           General framework for benchmark suitesbuildid-cache   Manage build-id cache.buildid-list    List the buildids in a perf.data filec2c             Shared Data C2C/HITM Analyzer.config          Get and set variables in a configuration file.data            Data file related processingdiff            Read perf.data files and display the differential profileevlist          List the event names in a perf.data fileftrace          simple wrapper for kernel's ftrace functionalityinject          Filter to augment the events stream with additional informationkallsyms        Searches running kernel for symbolskmem            Tool to trace/measure kernel memory propertieskvm             Tool to trace/measure kvm guest oslist            List all symbolic event typeslock            Analyze lock eventsmem             Profile memory accessesrecord          Run a command and record its profile into perf.datareport          Read perf.data (created by perf record) and display the profilesched           Tool to trace/measure scheduler properties (latencies)script          Read perf.data (created by perf record) and display trace outputstat            Run a command and gather performance counter statisticstest            Runs sanity tests.timechart       Tool to visualize total system behavior during a workloadtop             System profiling tool.probe           Define new dynamic tracepointstrace           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创建的数据文件,并给出热点分析结果。


智慧人生,与你相伴

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

  1. Perf的安装与简单使用

    Linux Perf 的安装与使用 Ubuntu下安装Perf(Ubuntu18.04) 使用apt包工具安装和下载 # 下载linux-tools-common zouren@ubuntu:~$ s ...

  2. centos下性能分析工具perf的安装和简单使用

    1.安装: cat /etc/redhat-release CentOS release 6.6 (Final) sudo yum install perf 2. 转载于:https://www.cn ...

  3. tcpdump抓包对性能的影响

    from:http://blog.csdn.net/dog250/article/details/52502623?ref=myread 一直以来,提到这个话题,大家更多的关注的是tcpdump抓包本 ...

  4. zt:tcpdump抓包对性能的影响

    https://blog.csdn.net/dog250/article/details/52502623 一直以来,提到这个话题,大家更多的关注的是tcpdump抓包本身的性能,比如能不能应付几十万 ...

  5. linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障

    内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...

  6. Linux操作系统原理与应用07:内核同步

    目录 1. 内核同步引入 1.1 并发执行的原因 1.2 临界区和竞争条件 1.2.1 临界区 1.2.2 竞争条件 1.3 确定保护对象 1.4 临界区保护思路 1.5 死锁 1.5.1 死锁的概念 ...

  7. Linux内核同步 - Read/Write spin lock

    一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...

  8. mysql火焰图_【性能】如何使用perf和火焰图分析系统性能?

    一.实验环境 二.实验案例分析 安装完成后,我们先在第一个终端,执行下面的命令运行案例,也就是一个最基本的 Nginx 应用: 运行 Nginx 服务并对外开放 80 端口 # docker run ...

  9. linux性能分析工具:perf入门一页纸

    软件开发中程序运行一段时间出现2类问题最头疼: 1.突然崩溃(调试问题) Windows:可以用WinDbg分析core dump文件,使用应用程序验证器(appverif.exe)对程序进行全面检查 ...

最新文章

  1. 对业务系统的监控 No.118
  2. centos yum 安装配置
  3. c语言趣味教学题目及答案,C语言趣味程序设计-题目百例.doc
  4. 响应式网页之媒体查询
  5. 冰豹lua驱动设置_卡宴?卡宴!——冰豹ROCCAT Kain 120 AIMO开箱
  6. 杜绝0.1 + 0.2 =0.30000000000000004
  7. radio选中事件怎么绑定_Vue双向绑定
  8. Python必知必会:Classethod与Staticmethod方法
  9. sqlplus格式调整
  10. 【Python】torrentParser1.01
  11. ogg怎么转mp3格式,ogg转mp3方法
  12. 全面图解路由器接口及连接
  13. 大数据分析应用的九大领域
  14. 计算机mac网关,如何在Mac OS X中获取默认网关地址 | MOS86
  15. [NOI2002]贪吃的九头龙(树形dp)
  16. 基于STM32MP1的医疗应用——心电仪
  17. BZOJ - 3687
  18. 高质量程序设计指南C++学习总结二
  19. ubuntu 16.04 chrome flash player 插件更新(adobe flash player 不是最新版本)
  20. docker-jenkins将打包的镜像推送到镜像仓库

热门文章

  1. C#类方法中使用数组参数params关键字的作用
  2. 理解标准输出流方法:WriteLine和Write
  3. 北京站售票员内部大量出票无耻的售票员(转)
  4. Go 语言 XML处理
  5. 死磕 java集合之TreeMap源码分析(一)——红黑树全解析
  6. What are HANA's models of cloud computing, and which should I choose?
  7. 自学篇之-----纯css做的漂亮的单选框复选框样式
  8. FTP服务器之vsftp
  9. VC 读取文件夹里面的文件夹名
  10. (原创)datagrid数据导出到excel文件给客户端下载的几种方法