linux性能优化-cpu使用率

文章目录

  • 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.mfbz.cn/a/255135.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习——AlexNet

论文信息 论文名称:ImageNet Classification with Deep Convolutional Neural Networks 论文别名:AlexNet 发表期刊:NIPS 论文地址: https://www.cin.ufpe.br/~rmd2/ImageNet%20classification%20wth%20deep%20convolutional%20neural%20net…

蚂蚁SEO强引蜘蛛是什么

强引蜘蛛在网页中是指一些特殊类型的网页,这些网页具有极高的吸引力和价值,能够吸引搜索引擎蜘蛛(Spider)的强烈关注和抓取。强引蜘蛛的网页通常具有以下特点: 如何联系蚂蚁seo? baidu搜索:如…

Python开发GUI常用库PyQt6和PySide6介绍之一:概述

Python开发GUI常用库PyQt6和PySide6介绍之一:概述 Python开发GUI有许多选择,下面是常见的选择: Tkinter:Tkinter是Python标准库中的一个GUI工具包,易于学习和使用。它提供了丰富的组件和布局选项,适用于简…

后端相关随机题目记录(1)

目录 后端相关随机题目记录(1) 后端相关随机题目记录(1)Bean的类型以及作用域Bean的生命周期Mysql的底层数据结构RedisHttp和Https区别AOP在项目的应用 自定义注解?请求在spring中的一个流程Nacos与zk的区别SpringMV…

那些年项目中踩的那些坑(二)

目录 一、硬件资源与软件需求不匹配1.1 背景1.2教训 一、硬件资源与软件需求不匹配 1.1 背景 在项目中期需要添加XCP到TDA4的main域中,但是发现所有的八路can中已经有七路can被占用,剩下一路因为没有TJA1045驱动无法使用。 1.2教训 1.软件架构缺失&am…

FPGA时序分析与时序约束(二)——时钟约束

目录 一、时序约束的步骤 二、时序网表和路径 2.1 时序网表 2.2 时序路径 三、时序约束的方式 三、时钟约束 3.1 主时钟约束 3.2 虚拟时钟约束 3.3 衍生时钟约束 3.4 时钟组约束 3.5 时钟特性约束 3.6 时钟延时约束 一、时序约束的步骤 上一章了解了时序分析和约束…

高级桌面编程(一)

前言 学习心得:C# 入门经典第8版书中的第15章《高级桌面编程》 创建控件并设置样式 1 样式 Style WPF 当中我们可以对每一个控件进行完全的自定义。我们可以随意更改控件外观和功能。提供我们能完成这样的效果与控件的样式(Style)有着不可分…

如何实现TensorFlow自定义算子?

在上一篇文章中 Embedding压缩之基于二进制码的Hash Embedding,提供了二进制码的tensorflow算子源码,那就顺便来讲下tensorflow自定义算子的完整实现过程。 前言 制作过程基于tensorflow官方的custom-op仓库以及官网教程,并且在Ubuntu和Mac…

第8次实验:UDP

目的: 来看一下UDP(用户数据报协议)的细节。UDP是整个互联网上使用的一种传输协议。在不需要可靠性的情况下,作为TCP的替代品在互联网上使用。它在你的课文的第6.4节中有所涉及。在做这个实验之前,先复习一下这一部分 …

【精选】计算机网络教程(第7章网络安全)

目录 前言 第7章网络安全 1、公钥 2、私钥 3、数字签名 前言 总结计算机网络教程课程期末必记知识点。 第7章网络安全 1、公私密钥和对称密钥 公私密钥(或非对称密钥)和对称密钥是在密码学中用于加密和解密数据的两种不同的密钥类型。 公私密钥…

MySQL主从复制详解

目录 1. 主从复制的工作原理 1.1. 主从复制的角色 1.2. 主从复制的流程 2. 配置MySQL主从复制 2.1. 确保主服务器开启二进制日志 2.2. 设置从服务器 2.3. 连接主从服务器 2.4. 启动复制 3. 主从复制的优化与注意事项 3.1. 优化复制性能 3.2. 注意复制延迟 3.3. 处理…

Leetcode 376 摆动序列

题意理解: 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 如果是摆动序列,前后差值呈正负交替出现 为保证摆动序列尽可能的长,我们可以尽可能的保留峰值,,删除上下坡的中间值&…

2023.12.17 关于 Redis 的特性和应用场景

目录 引言 Redis 特性 内存中存储数据 可编程性 可扩展性 持久化 支持集群 高可用性 Redis 优势 Redis 用作数据库 Redis 相较于 MySQL 优势 Redis 相较于 MySQL 劣势 Redis 用作缓存 典型场景 Redis 存储 session 信息 Redis 用作消息队列 初心 消息队列的…

redis之五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存,并且所有的key都是字符串,所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是:String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型,v…

175. 电路维修(BFS,双端队列)

175. 电路维修 - AcWing题库 达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上。 翰翰的家里有一辆飞行车。 有一天飞行车的电路板突然出现了故障,导致无法启动。 电路板的整体…

保姆级 Keras 实现 YOLO v3 二

保姆级 Keras 实现 YOLO v3 二 一. 数据准备二. 从 xml 或者 json 文件中读出标注信息三. K-Means 计算 anchor box 聚类尺寸读出所有标注框尺寸K-Means 聚类 四. 代码下载 上一篇 文章中, 我们完成了 YOLO v3 的网络定义, 相当于完成了前向计算功能, 但此时网络中的参数处于随…

MySQL数据库 函数

目录 函数概述 字符串函数 数值函数 日期函数 流程函数 函数概述 函数是指一段可以直接被另一段程序调用的程序或代码。也就意味着,这一段程序或代码在MysQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即…

前后端传参中遇见的问题

前后端传参经常容易出错,本文记录开发springBootMybatis-plusvuecli项目中出现的传参问题及解决办法 1.前后端没有跨域配置,报错 解决方法:后端进行跨域配置,拷贝CorsConfig类 package com.example.xxxx.config;import org.spr…

k8s-ingress 8

ExternalName类型 当集群外的资源往集群内迁移时,地址并不稳定,访问域名或者访问方式等会产生变化; 使用svc的方式来做可以保证不会改变:内部直接访问svc;外部会在dns上加上解析,以确保访问到外部地址。 …

2024年软件测试入坑指南,新人必看系列

本科非计算机专业,在深圳做了四年软件测试工作,从之前的一脸懵的点点点,到现在会点自动化测试,说一点点非计算机专业人员从事软件测试的心得体会,仅供参考交流。 如果你是非计算机专业,毕业不久&#xff0…
最新文章