理解CPU使用率和CPU上下文切换

2023-05-16

1、CPU使用率

1.1 CPU使用率查看

当发现服务或机器卡的时候,我们都是先通过top命令查看服务器CPU使用率

#默认每3秒刷新一次
top
top - 18:10:58 up 1216 days, 7:38, 4 users, load average: 23.06, 24.54, 23.72
Tasks: 839 total, 15 running, 824 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.2 us, 0.7 sy, 0.0 ni, 94.7 id, 0.3 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 26390464+total, 3420264 free, 44052232 used, 21643214+buff/cache
KiB Swap: 7812092 total, 7812092 free, 0 used. 11175941+avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15135 postgres 20 0 98.579g 2.376g 2.375g R 52.9 0.9 131:00.20 postgres

18147 postgres 20 0 98.628g 29640 25648 R 52.9 0.0 0:00.09 postgres

15438 postgres 20 0 98.628g 136444 128192 S 41.2 0.1 0:01.02 postgres

18244 postgres 20 0 98.628g 18608 15440 S 29.4 0.0 0:00.05 postgres

18276 postgres 20 0 98.628g 18848 15564 S 17.6 0.0 0:00.03 postgres

输出结果字段解释如下:

  • user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
  • nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
  • system(通常缩写为 sys),代表内核态 CPU 时间。
  • idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
  • iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
  • irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
  • softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
  • steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
  • guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
  • guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。

空格之后是进程的实时信息,每个进程都有一个%CPU列,表示进程的CPU使用率。它是用户态和内核态CPU使用率的总和,包括进程用户使用的CPU、通过系统调用执行的内核空间CPU、以及在就绪队列允许的CPU。但是该命令没有屈服进程的用户态CPU和内核态CPU。需要怎么查看每个进程的详细情况就需要pidstat命令了。

#每隔1秒输出一组数据,共5组
$ pidstat 1 5

Linux 3.10.0-327.36.3.el7.x86_64 (map-traffic-dataprocess00.gz01) 06/06/2020 x86_64 (48 CPU)

06:26:56 PM UID PID %usr %system %guest %CPU CPU Command

06:26:57 PM 0 58 0.00 0.96 0.00 0.96 22 rcu_sched

06:26:58 PM 26 22926 1.00 1.00 0.00 2.00 6 postgres

06:26:58 PM 26 22943 1.00 0.00 0.00 1.00 8 postgres

Average: UID PID %usr %system %guest %CPU CPU Command

Average: 0 58 0.00 0.98 0.00 0.98 - rcu_sched

Average: 26 22943 0.49 0.00 0.00 0.49 - postgres

Average: 26 22950 0.49 0.00 0.00 0.49 - postgres

输出数据的字段解释如下:

  • 用户态 CPU 使用率 (%usr);
  • 内核态 CPU 使用率(%system);
  • 运行虚拟机 CPU 使用率(%guest);
  • 等待 CPU 使用率(%wait);
  • 以及总的 CPU 使用率(%CPU)。

1.2 如何分析CPU使用率高的进程

经常使用perf分析CPU性能问题,常用方法是使用perf top ,类似于top,能够实时显示占用CPU时钟最多的函数或者指令,因此可以用来查找热点函数

$ perf top

Samples: 314K of event ‘cycles’, Event count (approx.): 128422426035

Overhead Shared Object Symbol

24.60% libc-2.17.so [.] __strcoll_l

18.70% libc-2.17.so [.] get_next_seq

4.90% postgres [.] XLogInsert

3.98% postgres [.] _bt_compare

输出结果中,第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。
再往下看是一个表格式样的数据,每一行包含四列,分别是:

  • 第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
  • 第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
  • 第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
  • 最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。

2、系统上下文切换

CPU上下文切换按照场景分为:进程上下文切换、线程上下文切换和中断上下文切换。下面重点介绍如何分析CPU上下文切换问题:
vmstat是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析CPU上下文切换和中断的次数。

#每隔5秒输出一组数据
$ vmstat 5

procs -----------memory---------- —swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st

8 3 0 3620412 13352 202348336 0 0 765 126 0 0 4 1 95 0 0

60 0 0 2957900 13372 203044688 0 0 340577 50 170121 307445 14 2 81 2 0

60 3 0 3517864 13380 202474976 0 0 326373 37 175463 315599 18 2 77 2 0

分析这个结果,需要特别关注4列内容:

  1. cs (context switch) 每秒上下文切换次数
  2. in (interrupt) 每秒中断的次数
  3. r (Running or Runnable) 就绪队列的长度,等于正在运行和等待CPU的进程数
  4. b (Blocked) 处于不可中断睡眠状态的进程数

可以看到上述例子中上下文切换次数CS都大于10W次,而系统中断次数in也都大于10W次,就绪队列长度r为10,不可中断状态的进程数是0.

查看系统CPU 个数为48个

$ grep ‘model name’ /proc/cpuinfo | wc -l

48

结合vmstat的结果看,r列的值为60,大于系统CPU 个数,所以肯定会有大量的CPU竞争
in列中断次数大于10W次,说明中断处理也是个潜在的问题。

vmstat给出了系统总体的上下文切换情况,要想查看每个进程的详细情况,就需要使用pidstat命令。给它加上-w选项,可以查看每个进程上下文切换的情况。

#每隔 5 秒输出 1 组数据
pidstat -w 5
Linux 3.10.0-327.36.3.el7.x86_64 (xxxxxxxxxxxx) 06/05/2020 x86_64 (48 CPU)

06:25:04 PM UID PID cswch/s nvcswch/s Command

06:25:09 PM 0 58 376.34 0.00 rcu_sched

06:25:09 PM 26 42818 80.91 0.00 postgres

Average: UID PID cswch/s nvcswch/s Command

Average: 0 1555 0.20 0.00 odin-log-agent

Average: 0 1878 0.99 0.00 supervisord

Average: 0 2689 0.40 0.00 kworker/5:0H

Average: 26 4370 12433.72 0.00 postgres

这个结果中有两列内容是我们重点关注的对象:cswch(voluntary context switches)和nvscwch(non voluntary context switches)。cswch表示每秒自愿上下文切换的次数,nvcswch描述每秒非自愿上下文切换的次数。
自愿上下文切换是指进程无法获取所需资源,导致的上下文切换,比如I/O、内存等系统资源不足时发生的切换
非自愿上下文切换是指由于进程时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如大量进程都在争抢CPU时,就容易发生非自愿上下文切换。
从pidstat输出结果可以看出,上下文切换则是来自postgres进程,

中断类型定位

中断类型定位需要从/proc/interrupts文件中读取。/proc是Linux的一个虚拟文件系统,用于内核空间与用户空间直接的通信。/proc/interrutps就是这种通信机制的一部分,提供了一个只读的中断使用情况。
在这里插入图片描述

总结

每秒上下文切换多少次才算正常呢?这个数值其实取决于系统本身的CPU性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内都应该算是正常的。单当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现了性能问题。

这时还需要根据上下文切换的类型,再做具体分析:

  • 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了I/O等其他问题;
  • 非自愿上下文切换变多了,说明进程都在被强制调度,说明都在争抢CPU,CPU成了瓶颈
  • 中断次数变多了,说明CPU被中断处理程序占用,还需要通过查看/proc/interrupts文件来分析具体的中断类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解CPU使用率和CPU上下文切换 的相关文章

  • Unity5-ABSystem(五):AssetBundle内存

    AssetBundle内存占用 建议 实测 www加载实测LoadFromFile加载实测 建议 AssetBundle内存占用 先上图 xff0c Don t panic 我们从AssetBundle中加载资源一般会经过三个步骤 xff1

随机推荐

  • Java中String字符串长度

    String类是Java中最为常用的类 xff0c 我们知道String是个final类 xff0c 不能修改内容 但是String类型是否有长度限制呢 xff0c 下面来一探究竟 想要搞清楚这个问题 xff0c 首先我们需要翻阅一下Str
  • 安装BBR时出现Error: Install elrepo failed, please check it.

    安装BBR时出现Error Install elrepo failed please check it Press any key to start or Press Ctrl 43 C to cancel curl 35 SSL conn
  • mac卸载mysql教程(按照步骤可完全卸载)

    Mac下卸载mysql的方法 xff1a 大部分卸载是因为版本高 1 关闭mysql 查看mysql是否启动 xff1a ps ef grep mysql 2 输入 xff1a kill 9 然后回车 xff0c 关闭mysql 3 卸载
  • 全网最简单Win10桌面美化教程,只需4步!!

    时间过得真滴快呀 xff01 咋眼就10月了 不知道国庆期间 小伙伴们是外出旅游 还是宅在家里哪里也没去 或者更悲催一点 还在国庆加班抑或因为疫情正在隔离 无论大家处于任何状态 小七都要在这里祝大家 xff1a 国庆节快乐 吉祥话说完了 下
  • Pycharm配置Jupyter Notebook实现本地开发与调试

    Pycharm专业版中集成了Jupyter Notebook xff0c 方便用户编辑 xff0c 执行和调试Notebook代码 xff0c 并检查执行输出 个人感觉 xff0c 相比于Jupyter提供的网页编辑器 xff0c Pych
  • Zookeeper选举机制介绍

    ZooKeeper是一个高可用的分布式协调服务 xff0c 它的核心功能之一就是选举机制 当ZooKeeper集群中的一个节点宕机时 xff0c 需要通过选举机制来选出一个新的leader节点 xff0c 确保集群的正常运行 下面是ZooK
  • redis实现布隆过滤器

    Redis是一种基于内存的数据存储系统 xff0c 具有高性能 高可用性 高扩展性等特点 xff0c 因此被广泛用于实现布隆过滤器 以下是一种基于Redis实现布隆过滤器的方案 xff1a 创建一个长度为m的位数组 xff08 bit ar
  • 解决shiro的登录成功后跳转到自定义error.html的问题

    解决shiro的登录成功后跳转到error html 1 先说一下问题现象 xff1a saas项目中 xff0c 登录成功之后 xff0c 跳转了error html xff0c 停顿一会儿后进入主页面 2 说一下我处理这个问题的步骤 x
  • 喜茶皇茶茶叶带您走上致富之路

    我国是茶文化的发源地 xff0c 尤其是南方各类品种的茶层出不穷 xff0c 茶韵茶香引人入胜 消费者生活水平大幅提高 xff0c 饮茶几乎已经成为一种时尚 xff0c 皇茶 在市场上受到大家的认可与喜爱 xff0c 短短时间内迅速发展壮大
  • 处理Spire.Pdf 生成书签有 Evaluation Warning : The document was created with Spire.PDF for .NET.字样的问题

    处理spire Pdf生成时的警告信息 这俩天在使用spire Pdf生成书签的时候总是会有Evaluation Warning The document was created with Spire PDF for NET 的警告字样 x
  • Android Drawable Preview插件适配Android Studio4.1版发布

    Android Drawable Preview是一个在安卓开发中非常有用的AS IDEA插件 可以将drawable资源文件的icon替换成内容的预览图 达到不需要打开资源文件 快速预览内容的功能 实在是非常的方便快捷 让开发工作更加的愉
  • 变频器的逆变、变频原理

    变频器的逆变 变频原理 YJZhang 从事制造业质量管理 xff0c 做过PCBA 线束 电话机 变频器行业 90 人赞同了该文章 变频器将直流电转变为交流电的这个过程叫 逆变 xff08 inverting 先讲逆变过程 xff0c 分
  • ubuntu20.04设置自动文字模式登录

    文字模式登录后取得的程序称为 Shell xff08 壳 xff09 xff0c Linux 的壳程序是bash xff08 Bourne Shell的增强版本 xff09 设置文字模式登录 xff1a 第一步 xff1a 进入grub文件
  • 从高考到程序员

    记得当年进入考场的时候也是志气满满 xff0c 心里念叨着一定要考上自己理想的大学 xff0c 光宗耀祖 当时坐在学校安排的bus上向考场的方向行进 xff0c 看到路边的交警叔叔 xff0c 情不自禁的喊了一声 xff0c 交警大哥辛苦了
  • Android内存优化(二)之如何分析native heap

    如何获取native heap请阅读上篇文章 xff0c 本篇文章将主要介绍如何分析一个native heap文件 xff0c 以及我们的native memory leak问题如何发现并定位 首先先来看一下实际中我们看到的native h
  • 基于springboot的薪资管理系统设计

    一 系统介绍 项目源码 xff1a https gitee com oklongmm code 这是一个界面简洁的薪资管理系统 xff0c 虽然界面简单 xff0c 但其工资项配置 xff0c 与考勤挂钩 xff0c 自动核算功能强大 xf
  • Dijkstra算法详解

    1 dijkstra算法简介 Dijkstra算法是由E W Dijkstra于1959年提出 xff0c 又叫迪杰斯特拉算法 xff0c 它应用了贪心算法模式 xff0c 是目前公认的最好的求解最短路径的方法 算法解决的是有向图中单个源点
  • C++建立动态二维数组

    C 43 43 建立动态二维数组主要有两种方法 xff1a 1 使用数组指针 xff0c 分配一个指针数组 xff0c 将其首地址保存在b中 xff0c 然后再为指针数组的每个元素分配一个数组 int b 61 new int row 分配
  • 理解负载均衡

    什么是平均负载 xff1f 单位时间内 xff0c 系统处于可运行状态和不可中断状态的平均进程数 xff0c 也就是平均活跃进程数 xff0c 它和CPU使用率并没有直接关系 所谓可运行状态的进程 xff0c 是指正在使用CPU或者等待CP
  • 理解CPU使用率和CPU上下文切换

    1 CPU使用率 1 1 CPU使用率查看 当发现服务或机器卡的时候 xff0c 我们都是先通过top命令查看服务器CPU使用率 默认每3秒刷新一次 top top 18 10 58 up 1216 days 7 38 4 users lo