盘点内核中常见的CPU性能卡点

news2024/11/9 10:11:29

我们的应用程序都是运行在各种语言的运行时、操作系统内核、以及 CPU 等硬件之上的。大家平时一般都是使用Go、Java等语言进行开发。但这些语言的下面是由运行时、内核、硬件等多层支撑起来的。

我们的程序在运行的时候,很多时候性能卡点可能并不一定是自己的应用代码导致的。也有可能是下层的软件的运行状况不佳造成的。性能卡点有可能出现在硬件上。我们了解了CPU硬件影响程序运行性能的关键指标,分别是平均每条指令的时钟周期个数 CPI 和缓存命中率。性能卡点也有可能出现在内核软件上。今天我们就来看下在内核中存在的可能会影响我们程序性能的几个关键指标。

其实,内核开发者们也都知道内核运行的过程中,哪些开销会比较高。所以老早就给我们提供了一种名为软件性能事件的支持。以方便我们应用的开发者来观测这些事件发生的次数,以及发生时所触发的函数调用链。

 

一、软件性能事件列表

通过 perf 的 list 子命令可以查看到当前系统都支持哪些软件性能事件。

# perf list sw
List of pre-defined events (to be used in -e):
  alignment-faults                                   [Software event]
  context-switches OR cs                             [Software event]
  cpu-migrations OR migrations                       [Software event]
  emulation-faults                                   [Software event]
  major-faults                                       [Software event]
  minor-faults                                       [Software event]
  page-faults OR faults                              [Software event]
  task-clock                                         [Software event]

其中上面命令中的 sw 是 software 的简称,其实指的就是内核。下面的列表列明了一些影响性能的事件,我们挨个来解释。

alignment-faults

这个指的是对齐异常。简单来说,当CPU访问内存地址时,如果发现访问的地址是不对齐的,那内核向内存请求数据的时候可能一次 IO 不够,还得再触发一次 IO 才能把数据给读取回来。对齐异常会增加本来不需要的内存 IO,必然会拖累程序运行性能。

如果你还没理解的话,可以看下图。在下图中 0-63 和 64-127 地址的数据都可以由一次内存 IO 完成。但如果你的应用程序非得从 40 位置开始要个长为 64 的数据。那就是不对齐的。

context-switches

进程上下文切换。平均每次切换都得 3-5 us。这对于运行的飞快的操作系统来说,已经是一个非常长的时间了,而更为关键的是,对于用户程序来说,这段时间完完全全就是浪费的。频繁的上下文切换还会进一步导致 CPU 缓存命中率变差,拉高 CPI。

cpu-migrations

进程如果每次调度的时候都能够在同一个CPU核上执行,那大概率这个核的L1、L2、L3等缓存里存储的数据还能用的上,缓存命中率高可以避免对数据的访问穿透到过慢的内存中。所以内核在调度器的实现上开发了wake_affine机制来使得调度尽可能地使用上一次用过的核。

但如果进程在调度器唤醒的时候发现上一次使用过的核被别的进程占了,那该怎么办。总不至于不让这个进程唤醒,硬等上一次用过的这个CPU核吧。给它分配一个别的核让进程可以及时获得CPU也许更好。但这时就会导致进程执行时在CPU之间跳来跳去,这种现象就叫做任务迁移。

显然任务迁移是对CPU缓存不太友好的。如果迁移次数过多必然会导致进程运行性能的下降。

emulation-faults

emulation-faults 错误是在 QEMU 虚拟机中运行 x86 应用程序时出现的一种错误类型。x86 程序需要在 x86 架构的计算机上运行,并且依赖于该计算机的硬件架构和指令集。QEMU 作为一款模拟器,可以模拟 x86 硬件架构和指令集,但是由于模拟器与真实硬件之间存在差异,因此在运行 x86 应用程序时可能会产生 emulation-faults 错误。

page-faults

这是我们常说的缺页中断。用户进程中在申请内存的时候,其实申请到的只是一个vm_area_struct而已,仅仅只是一段地址范围。物理内存并不会立即就分配,具体的分配等到实际访问的时候。当进程在运行的过程中在栈上开始分配和访问变量的时候,如果物理页还没有分配,会触发缺页中断。在缺页中断种来真正地分配物理内存。

其中缺页中断又分为两种,分别是 major-faults 和 minor-faults。这两种错误的区别在于 major-faults 会导致磁盘 IO 的发生,所以对程序运行的影响更大。

二、软件性能事件的计数统计

了解了内核中可能会影响程序运行性能的几种事件后,我们的一种需求就是看看系统中实际发生了多少次这样的事件。这个使用 perf stat 子命令就可以办到。

# perf stat -e alignment-faults,context-switches,cpu-migrations,emulation-faults,page-faults,major-faults,minor-faults sleep 5
 Performance counter stats for 'sleep 5':
     0      alignment-faults:u
     0      context-switches:u
     0      cpu-migrations:u
     0      emulation-faults:u
    56      page-faults:u
     0      major-faults:u
    56      minor-faults:u

由于上述命令我是在我手头的一台开发机上操作的,所以很多指标都为 0 ,只发生了 56 次不太严重的 minor-faults。这个命令是统计的整个系统的情况。

如果只想查看指定的程序或进程,那就在后面跟上程序名,或者通过 -p 指定进程 pid

# perf stat <可执行程序>   // 统计指定程序
# perf stat -p <pid>     // 统计指定进程

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

三、软件性能事件的函数栈跟踪

很有可能在你知道你的系统某中指标发生的太多的话,你还想看看到底是那些函数调用链导致的的。这时候 perf record 命令可以帮助你进行栈的采样。

例如,如果你想看一下 context-switches 都是如何发生的,那就来采个样。

# perf record -a -g -e context-switches sleep 30

在上面的命令中,其中 -a 指的是要查看所有的栈,包括用户栈,也包括内核栈。-g 指的是不仅仅采样时要记录当前在运行的函数名,还要记录整个调用链。-e 指的是只采样 context-switches 事件。sleep 指的是采集 30 秒。命令执行完后,当前目录下会输出一个 perf.data 文件。

默认情况下,perf stat 是一秒要采集 4000 次。这会导致采集出来的 perf.data 文件过大,而且也会影响程序性能。你可以通过 -F 参数来控制采集频率。

# perf record -F 100 ...

使用 perf script 可以查看该perf.data文件中的内容。

# perf script

也可以使用 perf report 命令进行一个简单的统计

# perf report

最好的办法是用 Brendan Gregg 大神的FlameGraph项目,把采样获得的 perf.data 渲染成非常直观的火焰图。

生成方式非常的简单,只需要把 FlameGraph 项目下载下来,再分别使用 stackcollapse-perf.pl 和 flamegraph.pl 两个脚本进行处理即可。

# git clone https://github.com/brendangregg/FlameGraph.git
# perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > out.svg

其中 stackcollapse-perf.pl 脚本作用是将调用栈处理为一行。行前面表示的是调用栈,后面输出的是采样到该函数在运行的次数。比如下面这个处理结果表示采样时发现 main;funcA;funcD;funcE;caculate 这个函数调用链路正在执行的次数为 554118432 次,main;funcB;caculate 这个函数调用链路正在执行的次数是 338716787。

main;funcA;funcD;funcE;caculate 554118432
main;funcB;caculate 338716787

flamegraph.pl 脚本工作原理是将 stackcollapse-perf.pl 绘制成 svg 图片。

使用火焰图对 context-switches 内核软件事件采样结果 perf.data 进行渲染后,这样能清楚地看到哪个链路上的上下文切换发生的最为频发。

通过对火焰图的观测,就可以分析发现是哪些原因导致了最多的进程上下文切换的开销了。其它内核软件事件,例如缺页中断、CPU迁移等分析原理也一样。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win系统下同时访问公司内网及公网设置

一、修改系统配置 修改系统配置&#xff0c;使公网默认不走VPN路由&#xff1b; 连接VPN&#xff0c;并查看路由表&#xff1b; route print可以看到&#xff0c;多了些路由信息&#xff0c;此时测试公网能否正常访问&#xff0c;如能正常访问&#xff0c;则继续往下。 二、…

入职字节两个月,实在卷不动,还是离职了

对自己收入不满意&#xff0c;就看下自己每天做了什么&#xff0c;把每天记录下来&#xff0c;看下自己的时间都用在哪里了。 对自己的时间分配搞清楚了&#xff0c;就可以着手去改进&#xff0c;如果一直糊涂的过&#xff0c;时间到了报复就来了。 时间管理很简单&#xff0c…

零代码、一键生成、低成本,深兰科技硅基大脑SaaS平台国内首发

在6月20日举行的2023中国(苏州)独角兽企业大会上&#xff0c;深兰科技创始人、董事长陈海波在主旨演讲中宣布&#xff0c;深兰科技推出“深兰科技硅基大脑SaaS平台”&#xff0c;旨在为个人和企业提供更便捷、更全面的大语言模型智能化应用。 AI大模型驱动“智慧涌现”&#xf…

Redis实战篇(一)

Redis实战篇基于哔哩哔哩中黑马程序员的黑马点评项目 一.缓存 1.1 缓存概述 1.什么是缓存 缓存&#xff0c;就是数据交换的缓冲区&#xff0c;俗称的缓存就是缓冲区内的数据&#xff0c;一般从数据库中获取&#xff0c;存储于本地代码 2.为什么要使用缓存 缓存数据存储于…

性能测试-压测问题分析,生产环境性能压测优化(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 项目背景&#xf…

从0到1精通自动化测试,pytest自动化测试框架,allure2生成html报告(史上最详细)(九)

一、前言 allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架&#xff0c;也可以集成到Jenkins上展示高大上的报告界面。 环境准备&#xff1a; python3.6windows环境pycharmpytest-allure-adaptorallure2.7.0java1.8 二、pytest-allu…

在 Blender 和 3DCoat 中创建风格化的幻想屋

今天云渲染小编给大家带来的是CG艺术家Brian Nguyen 最近的项目“一个风格化的幻想屋”幕后制作&#xff0c;讨论了 Blender 中的建模过程和 3DCoat 中的纹理过程&#xff0c;并详细介绍了如何设置灯光和K动画。 介绍 我是 Brian Nguyen&#xff0c;程式化的 3D 艺术家&#…

阿里云EMAS超级App助力Agmo电动车超级应用程序发布

近日&#xff0c;阿里云宣布与马来西亚本土数字方案专家Agmo控股&#xff08;Agmo Holdings Berhad&#xff0c;简称Agmo&#xff09;展开合作&#xff0c;签署谅解备忘录&#xff0c;联手推出马来西亚首个Agmo电动车超级应用程序。此次合作也标志着阿里云在中国以外的市场首次…

电商营销小程序优势有哪些?电商营销小程序功能推荐

随着流量成本越来越高、流量逐渐被平台所垄断&#xff0c;因此转化公域流量至私域成为越来越多企业的选择&#xff0c;对于电商营销而言&#xff0c;电商营销小程序也是一种较为轻便的私域沉淀工具。与传统的电商模式相比&#xff0c;电商营销小程序具有以下几大优势&#xff1…

【嵌入式】MIMXRT685SFVKB 32位微控制器、5CGXFC4C7F27C8N FPGA现场可编程门阵列

MIMXRT685SFVKB i.MX RT600交叉MCU是双核微控制器&#xff0c;设有32位Cortex-M33和Xtensa HiFi4音频DSP CPU。i.MX RT600 MCU是NXP EdgeVerse™边缘计算平台的一部分。Cortex-M33 CPU配有两个硬件协处理器&#xff0c;为一系列复杂算法提供增强性能。 核心处理器&#xff1a;A…

【博客671】prometheus如何选择数据点以及处理counter跳变

prometheus如何选择数据点以及处理counter跳变 1、prometheus如何选择数据点 时间是怎么进来的&#xff1f;范围和即时查询&#xff01; 您可能已经注意到&#xff0c;PromQL 查询中对时间的唯一引用是相对引用&#xff08;例如[5m]&#xff0c;回顾 5 分钟&#xff09;。那…

嵌入式界面神器 littleVGL

​1、littleVGL 介绍 littleVGL 是近几年开始流行的一个小型开源嵌入式 GUI 库,具有界面精美,消耗资源小,可移植度高,响应式布局等特点,全库采用纯 c 语言开发,而且 littleVGL 库的更新速度非常快,随着 littleVGL 的认知度越来越大,官方资料也逐渐丰富起来。 相比 emWin&…

kali安装Nessus并更新插件包的详细步骤

1. 下载 https://www.tenable.com/downloads/nessus 2. 安装 dpkg -i Nessus-10.5.2-debian10_amd64.deb3. 开启nessus服务 sudo systemctl start nessusd.service4. 浏览器访问Nessus服务 访问 https://$ip:8834选择Managed Scanner,点击Continue选择Tenable.sc,点击Con…

Linux Perf

文章目录 一、简介二、使用方法1、子命令2、Tips 三、perf-list1、事件类型2、事件修饰符 四、perf-top1、输出结果2、选项3、交互命令4、示例 五、perf-stat1、选项2、示例 六、perf-record1、选项2、示例 七、perf-report1、选项2、示例 八、perf-script1、选项2、示例3、火焰…

SpringBoot(一)使用itelliJ社区版创建SpringBoot项目

工欲善其事&#xff0c;必先利其器。目前市面上有很多优秀的开发工具&#xff0c;例如 IntelliJ IDEA、Visual Studio Code 和 Eclipse 等&#xff0c;那么我们该如何选择呢&#xff1f;最好的选择是使用IntelliJ IDEA的Ultimate版本&#xff0c;但Ultimate版本试用期只有30天&…

【JavaWeb基础】RestController的使用

一、学习笔记 RestControllerControllerResponseBody 其中&#xff0c;ResponseBody将方法返回值直接响应&#xff0c;如果返回值类型是实体对象/集合&#xff0c;将会转换为Json格式响应。 二、代码展示 创建两个类 代码如下&#xff1a; package com.example.controller…

高效视频解码,使用MediaCodec解析H.265

MediaCodec是什么 MediaCodec是Android平台上的一个类&#xff0c;用于实现多媒体数据的编解码操作。它提供了对底层硬件编解码器的访问和控制&#xff0c;可以实现高效的音视频编解码处理&#xff0c;包括解码和编码功能。 通过使用MediaCodec&#xff0c;开发人员可以利用硬…

在多台服务器上运行相同命令

文章目录 PSSH安装使用(1)、定义一个文件&#xff0c;写入需要操作的机器&#xff0c;如pssh-hosts(2)、pssh执行命令(3)、参数含义(4)、pscp从96.54拷贝文件到其他机器(5)、pslurp从其它机器下载文件到本地(6)、pnuke 杀死远程主机上的进程 ansible安装使用(1)、安装完后&…

兼容性测试如何提高网站的性能?

随着互联网的持续发展&#xff0c;越来越多的公司和组织都开始关注网站的性能问题。一个高效的网站不仅可以提高用户满意度&#xff0c;促进业务的发展&#xff0c;还可以提高搜索引擎的排名&#xff0c;为公司带来更多的流量和收益。而兼容性测试是提高网站性能的关键之一&…

SECS协议学习

1.SECS介绍 SEMI(国际半导体协会&#xff09;为了方便工厂系统与设备沟通而建立的一种通信标准 2.SECS常用功能 2.1.设备向工厂系统报告设备状态&#xff08;自动、暂停、初始化、报警&#xff0c;特殊事件&#xff1a;如门开启等&#xff09; 2.2.远程控制设备&#xff0…