linux性能优化-cpu使用率

news2024/11/28 16:48:58

文章目录

  • 1.CPU使用率
  • 2.节拍率的概念
    • 2.1.查看系统节拍率
    • 2.2.用户节拍率
    • 2.3.CPU使用率公式
  • 3.怎么查看CPU使用率
    • 3.1.top显示系统总体CPU使用情况
    • 3.2.pidstat分析每个进程CPU使用情况
  • 4.CPU使用率过高怎么办
    • 4.1.perf命令详解


1.CPU使用率

用什么指标来描述系统的CPU性能呢?不是平均负载,也不是CPU上下文切换,而是另一个更直观的指标CPU使用率,CPU使用率是单位时间内CPU使用情况的统计,以百分比的方式展示。

2.节拍率的概念

为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiwies记录了开机以来的节拍数。每发生一次时间中断,Jiwies的值就加 1。

2.1.查看系统节拍率

不同的系统可能设置不同数值,你可以通过查询 /boot/config 内核选项来查看它的配置值。

[root@centos7-2 ~]# grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=1000

2.2.用户节拍率

正因为节拍率 HZ 是内核选项,所以用户空间程序并不能直接访问。为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒。这样用户空间程序并不需要关心内核中 HZ被设置成了多少,因为它看到的总是固定值USER_HZ。

USER_HZ=100

为了方便用户控件程序,内核还提供了一个用户控件的节拍率,它总是固定为100,也就是1/100秒,这样用户控件程序并需要关系内核中HZ被设置成了多少

2.3.CPU使用率公式

CPU使用率,就是除了空闲时间外的其他时间占总CPU时间的百分比,用公式来表示就是
image.png
根据这个公式,我们就可以从 /proc/stat 中的数据,很容易地计算出CPU使用率。当然,也可以用每一个场景的CPU 时间,除以总的 CPU 时间,计算出每个场景的CPU使用率。
为了计算机CPU使用率,性能能工具一般都会间隔一段时间(比如 3 秒)的两次值做差后,再计算出这段时间的平均CPU使用率。
image.png
性能分析工具给出的都是间隔一段时间的平均CPU使用率,所以要注意间隔时间的设置,特别是用多个工具对比分析时,你一定要保证他们用的是相同的间隔时间。

3.怎么查看CPU使用率

  • top显示了系统总体的 CPU和内存使用情况,以及各个进程的资源使用情况;
  • ps 则只显示了每个进程的资源使用情况;
  • pidstat分析每个进程CPU使用情况

3.1.top显示系统总体CPU使用情况

top显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况

#查看cpu整体负载
top

top - 14:25:10 up  1:30,  2 users,  load average: 0.18, 0.21, 0.25
Tasks: 235 total,   1 running, 234 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us,  0.5 sy,  0.0 ni, 98.1 id,  0.1 wa,  0.0 hi,  0.1 si,  0.0 st
MiB Mem :   7915.7 total,   2686.9 free,   3559.6 used,   1670.1 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   4127.0 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1084 root      20   0  977416  82904  43556 S   2.3   1.0   0:10.82 systemd
 1243 alice     20   0 1710980 395384  40816 S   1.7   4.9   0:08.73 gnome-shell
 1912 bob       20   0  665208  73144  54936 S   1.0   0.9   0:03.44 chrome
  925 root      20   0       0      0      0 I   0.7   0.0   0:02.30 kworker/0:2-events
 3051 alice     20   0  835956  64388  44480 S   0.3   0.8   0:01.27 gnome-terminal-

#解释示例输出:

- `top - 14:25:10 up 1:30, 2 users, load average: 0.18, 0.21, 0.25`:
显示当前系统时间、系统已运行时间、当前登录用户数以及系统的平均负载情况。

- `Tasks: 235 total, 1 running, 234 sleeping, 0 stopped, 0 zombie`:
显示当前系统任务的统计信息,包括总任务数、正在运行的任务数、睡眠中的任务数、停止的任务数和僵尸进程数。

- `%Cpu(s): 1.2 us, 0.5 sy, 0.0 ni, 98.1 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st`:
显示CPU使用情况的统计信息,包括用户空间占用率、系统空间占用率、Nice优先级任务占用率、空闲率、等待IO的任务占用率、硬中断占用率、软中断占用率和虚拟化占用率。
- `MiB Mem: 7915.7 total, 2686.9 free, 3559.6 used

3.2.pidstat分析每个进程CPU使用情况

top并没有细分进程的用户态CPU和内核态CPU,那要怎么查看每个进程的详细情况呢?

[root@centos7-2 ~]# pidstat 1 5
Linux 3.10.0-693.el7.x86_64 (centos7-2) 2023年12月17日 _x86_64_ (2 CPU)
20时54分33秒 UID PID %usr %system %guest %wait %CPU CPU Command
20时54分34秒 0 24002 0.98 0.98 0.00 0.00 1.96 0 pidstat
20时54分34秒 UID PID %usr %system %guest %wait %CPU CPU Command
20时54分35秒 27 1112 0.00 0.99 0.00 0.00 0.99 0 mysqld
20时54分35秒 0 24002 0.00 1.98 0.00 0.00 1.98 0 pidstat
20时54分35秒 UID PID %usr %system %guest %wait %CPU CPU Command
20时54分36秒 0 24002 1.00 1.00 0.00 0.00 2.00 0 pidstat
20时54分36秒 UID PID %usr %system %guest %wait %CPU CPU Command
20时54分37秒 0 24002 1.00 1.00 0.00 0.00 2.00 0 pidstat
20时54分37秒 UID PID %usr %system %guest %wait %CPU CPU Command
20时54分38秒 0 24002 0.00 1.00 0.00 0.00 1.00 0 pidstat
平均时间: UID PID %usr %system %guest %wait %CPU CPU Command
平均时间: 27 1112 0.00 0.20 0.00 0.00 0.20 - mysqld
平均时间: 0 24002 0.60 1.19 0.00 0.00 1.79 - pidstat

参数详细说明:

  • 用户ID (UID): 进程所有者的用户ID。
  • 进程ID (PID): 进程的唯一标识符。
  • %usr (User CPU %): 用户空间的 CPU 使用率。
  • %system (System CPU %): 内核空间的 CPU 使用率。
  • %guest (Guest CPU %): 虚拟机(guest)的 CPU 使用率。
  • %wait (IO Wait %): 进程等待 I/O 操作的时间比例。
  • %CPU (CPU %): 进程的总 CPU 使用率(%usr + %system)。
  • CPU: 指示在哪个 CPU 上运行的进程。
  • Command: 进程的命令名。

4.CPU使用率过高怎么办

**分析思路 **

  1. 如何轻松找到CPU使用率过高的进程

通过toppspidstat等工具

  1. 占用CPU高的到底是代码里的那个函数?

perfGDB
GDB(The GNU Project Debugger),这个功能强大的程序调试利器,GDB调试程序的过程会中断程序运行,这在线上环境往往是不允许的;
perf 是 Linux 2.6.31 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题 ,使用 perf 分析 CPU 性能问题,我来说两种用法:
第一种常见用法是 perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数,使用界面如下所示:

[root@centos7-2 ~]# perf top
Samples: 724 of event 'cpu-clock', Event count (approx.): 125711088
Overhead Shared Object Symbol
45.11% [kernel] [k] generic_exec_single

image.png
输出结果中,第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。比如这个例子中,perf 总共采集了1000个 CPU 时钟事件,而总事件数则为 271937500。 采样数需要我们特别注意,如果采样数过少(比如只有十几个),那下面的排序和百分比就没什么实际参考价值了。
第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。

4.1.perf命令详解

image.png
第二种常见用法,也就是 perf recordperf reportperf top 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或者后续的分析。而 perf record 则提供了保存数据的功能,保存后的数据,需要你用perf report 解析展示

perf record # 按 Ctrl+C 终止采样
[root@centos7-2 ~]# perf report
Samples: 5K of event 'cpu-clock', Event count (approx.): 1332500000
Overhead Command Shared Object Symbol
97.15% swapper [kernel.kallsyms] [k] native_safe_halt
0.49% swapper [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.36% vmtoolsd libvmtools.so.0.0.0 [.] Backdoor_InOut
0.34% swapper [kernel.kallsyms] [k] __do_softirq
0.17% swapper [kernel.kallsyms] [k] tick_nohz_idle_exit
0.13% swapper [kernel.kallsyms] [k] tick_nohz_idle_enter
0.13% vmtoolsd [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.11% kworker/0:1 [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.11% vmtoolsd libvmtools.so.0.0.0 [.] BackdoorHbOut
0.08% dockerd [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.08% vmtoolsd [kernel.kallsyms] [k] __do_softirq
0.06% kworker/1:2 [kernel.kallsyms] [k] queue_delayed_work_on
0.06% vmtoolsd [kernel.kallsyms] [k] format_decode
0.04% irqbalance [kernel.kallsyms] [k] cap_mmap_file
0.04% kworker/0:0 [kernel.kallsyms] [k] ata_sff_pio_task
0.04% kworker/1:2 [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.04% mysqld mysqld [.] fts_optimize_words
0.04% swapper [kernel.kallsyms] [k] rcu_idle_exit
0.04% vmtoolsd libvmtools.so.0.0.0 [.] BackdoorHbIn
0.02% dockerd [kernel.kallsyms] [k] __do_softirq
0.02% in:imjournal rsyslogd [.] 0x0000000000016f90
0.02% irqbalance [kernel.kallsyms] [k] __fsnotify_parent
0.02% irqbalance [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
0.02% irqbalance [kernel.kallsyms] [k] copy_user_generic_unrolled
0.02% irqbalance [kernel.kallsyms] [k] native_flush_tlb_single
0.02% irqbalance [kernel.kallsyms] [k] unmap_page_range
Tip: For tracepoint events, try: perf report -s trace_fields

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

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

相关文章

SpringData JPA 整合Springboot

1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…

Oracle 透明网关安装

Oracle 11g透明网关连接Sqlserver oracle 透明网关是oracle连接异构数据库提供的一种技术。通过Gateway&#xff0c;可以在Oracle里透明的访问其他不同的数据库&#xff0c;如SQL Server, DB2, Sybase等等&#xff0c;就像远程Oracle数据库一样。配置后的sql查询的处理流程&…

架构设计系列之基础设施能力建设

周末聊两句&#xff1a; 今天将的基础设施能力建设部分&#xff0c;一般的架构书籍中都不存在的部分&#xff0c;这是我在实践过程中的经验和能力总结部分&#xff0c;希望和大家有一个很好的交流自从在 WeChat 中开了订阅号的两周半的时间&#xff0c;非常感谢大家的支持&…

Spring Boot 3 整合 Hutool 验证码实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

中通单号查询,中通快递物流查询,对需要的单号进行备注

批量查询中通快递单号的物流信息&#xff0c;对需要的单号进行备注。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的“…

vite原理

一、依赖预构建 1、为什么需要依赖预构建 CommonJS和UMD兼容性 在开发阶段中&#xff0c;vite的开发服务器将所有的代码视为原生ES模块。因此&#xff0c;vite必须先将作为CommonJS或者UMD发布的依赖项转换为ESM。 这是vite的一个特色&#xff0c;也是为什么会相对于webpack比…

ffmpeg6.0-ffplay.c源码分析(二)之整体框架大流程分析

文章目录 main()函数解读stream_open()函数解析event_loop函数解析关注公众号看全文: 想分析任何一个可执行程序,肯定从main()函数下手是比较合适的,ffplay的源代码也是如此。 main()函数解读 /* Called from the main */ int main(int argc, char **argv)

训练属于自己的大模型LM Studio使用记录

LM Studio 支持本地运营大模型 下载地址: https://lmstudio.ai/ 一 搜索下载管理 安装之后打开, 搜索对应大模型, 下载, 举例: baichuan 点击左侧菜单栏文件夹图标进行管理 二 聊天 点击左侧菜单栏聊天图标, 新建聊天, 输入框输入内容 可能对回答的结果并不满意, 我们可以…

实战经验:如何利用房产小程序提升客户满意度?

在当今的数字化时代&#xff0c;房产中介公司需要不断地适应市场变化&#xff0c;提供更加便捷、高效的服务。小程序作为一种轻量级的应用程序&#xff0c;具有无需下载、易于分享、随时可用等优点&#xff0c;可以为房产中介公司提供一个新的销售渠道。本文将介绍如何使用乔拓…

教师如何维护学生的自尊心

作为教师&#xff0c;我们不仅要传授知识&#xff0c;更要关心学生的身心健康&#xff0c;特别是他们的自尊心。自尊心是个人自我价值的重要体现&#xff0c;对学生的学习、生活和未来的发展都有深远的影响。因此&#xff0c;维护学生的自尊心是教师的重要责任。 教师要尊重每…

usart串口以及通信基本概念

文章目录 通讯的基本概念串行通信与并行通讯串行通信并行通信两种通信方式的比较 全双工、半双工及单工通讯概念**模型图** 同步通讯与异步通讯模型图同步通讯模型图异步通讯模型图 通讯速率比特率 (Bitrate) &#xff1a;波特率”(Baudrate)&#xff1a; USART——串口通讯串口…

CMA、CNAS软件检测公司分享:压力测试应关注的指标和面临的问题

软件压力测试是容易被传统企业忽视的测试点&#xff0c;用户人数一旦超过预期&#xff0c;极易造成软件产品卡顿、崩溃的情况&#xff0c;不利于用户正常使用&#xff0c;严重影响企业公信力和盈利水平。今天卓码软件测评小编来聊聊压力测试过程中应该关注的指标和会面临的问题…

k8s - container

1、容器的生命周期&#xff1a; (1) 简介&#xff1a; Kubernetes 会跟踪 Pod 中每个容器的状态&#xff0c;就像它跟踪 Pod 总体上的阶段一样。 可以使用容器生命周期回调&#xff0c;在容器生命周期中的特定状态点触发事件。 ● 容器生命周期回调&#xff1a; 在容器的生…

HTML5+CSS3+JS小实例:可拖拽排序的人物列表

实例:可拖拽排序的人物列表 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

设计模式详解---单例模式

1. 设计模式详解 单例模式是一种创建对象的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点以获取该实例。 在单例模式中&#xff0c;类负责创建自己的唯一实例&#xff0c;并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有…

力扣刷题-二叉树-路径总和

112 路径总和 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 返回 true, 因为…

2024中国国际大数据产业博览会年度主题征集公告

2024中国国际大数据产业博览会年度主题征集公告 中国国际大数据产业博览会&#xff08;以下简称数博会&#xff09;&#xff0c;是全球首个以大数据为主题的国家级博览会&#xff0c;由国家发展和改革委员会、工业和信息化部、国家互联网信息办公室和贵州省人民政府共同主办&am…

Android Studio好用的插件推荐

目录 一、插件推荐 二、如何下载 1.点击File—>Settings ​2.点击Plugins然后进行搜索下载 三、Android Studio 模板 一、插件推荐 这个插件可以为您自动生成Parcelable代码。Parcelable是一种用于在Android组件之间传递自定义对象的机制&#xff0c;但手动编写Parcela…

ffmpeg6.0-ffplay.c源码分析(一)之结构体、变量、宏详细解读

ffplay.c在全局定义的结构体、变量、宏就有300多行,去掉空格也有接近300行。 本文从程序相关变量、宏、结构体、全局变量四个方面来解读。 文章目录 程序相关变量宏结构体全局变量关注公众号看全文: 程序相关变量 和程序相关的变量只有两个: const char program_name[]…

常用模块之(time/datetime)

【 一 】时间模块&#xff08;time/datetime&#xff09; 【 二 】 表示时间的三种方式 *时间戳&#xff08;Timestamp&#xff09;是指1970年1月1日00:00:00开始计算的偏移量。可以使用time模块中的time()函数获取当前时间的时间戳&#xff0c;也可以使用datetime模块中的tim…