内核同步对性能的影响及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 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的安装和简单的使用相关推荐
- Perf的安装与简单使用
Linux Perf 的安装与使用 Ubuntu下安装Perf(Ubuntu18.04) 使用apt包工具安装和下载 # 下载linux-tools-common zouren@ubuntu:~$ s ...
- centos下性能分析工具perf的安装和简单使用
1.安装: cat /etc/redhat-release CentOS release 6.6 (Final) sudo yum install perf 2. 转载于:https://www.cn ...
- tcpdump抓包对性能的影响
from:http://blog.csdn.net/dog250/article/details/52502623?ref=myread 一直以来,提到这个话题,大家更多的关注的是tcpdump抓包本 ...
- zt:tcpdump抓包对性能的影响
https://blog.csdn.net/dog250/article/details/52502623 一直以来,提到这个话题,大家更多的关注的是tcpdump抓包本身的性能,比如能不能应付几十万 ...
- linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障
内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...
- Linux操作系统原理与应用07:内核同步
目录 1. 内核同步引入 1.1 并发执行的原因 1.2 临界区和竞争条件 1.2.1 临界区 1.2.2 竞争条件 1.3 确定保护对象 1.4 临界区保护思路 1.5 死锁 1.5.1 死锁的概念 ...
- Linux内核同步 - Read/Write spin lock
一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...
- mysql火焰图_【性能】如何使用perf和火焰图分析系统性能?
一.实验环境 二.实验案例分析 安装完成后,我们先在第一个终端,执行下面的命令运行案例,也就是一个最基本的 Nginx 应用: 运行 Nginx 服务并对外开放 80 端口 # docker run ...
- linux性能分析工具:perf入门一页纸
软件开发中程序运行一段时间出现2类问题最头疼: 1.突然崩溃(调试问题) Windows:可以用WinDbg分析core dump文件,使用应用程序验证器(appverif.exe)对程序进行全面检查 ...
最新文章
- 对业务系统的监控 No.118
- centos yum 安装配置
- c语言趣味教学题目及答案,C语言趣味程序设计-题目百例.doc
- 响应式网页之媒体查询
- 冰豹lua驱动设置_卡宴?卡宴!——冰豹ROCCAT Kain 120 AIMO开箱
- 杜绝0.1 + 0.2 =0.30000000000000004
- radio选中事件怎么绑定_Vue双向绑定
- Python必知必会:Classethod与Staticmethod方法
- sqlplus格式调整
- 【Python】torrentParser1.01
- ogg怎么转mp3格式,ogg转mp3方法
- 全面图解路由器接口及连接
- 大数据分析应用的九大领域
- 计算机mac网关,如何在Mac OS X中获取默认网关地址 | MOS86
- [NOI2002]贪吃的九头龙(树形dp)
- 基于STM32MP1的医疗应用——心电仪
- BZOJ - 3687
- 高质量程序设计指南C++学习总结二
- ubuntu 16.04 chrome flash player 插件更新(adobe flash player 不是最新版本)
- docker-jenkins将打包的镜像推送到镜像仓库
热门文章
- C#类方法中使用数组参数params关键字的作用
- 理解标准输出流方法:WriteLine和Write
- 北京站售票员内部大量出票无耻的售票员(转)
- Go 语言 XML处理
- 死磕 java集合之TreeMap源码分析(一)——红黑树全解析
- What are HANA's models of cloud computing, and which should I choose?
- 自学篇之-----纯css做的漂亮的单选框复选框样式
- FTP服务器之vsftp
- VC 读取文件夹里面的文件夹名
- (原创)datagrid数据导出到excel文件给客户端下载的几种方法