04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
怎么查看系统的上下文切换情况
# 每隔 5 秒输出 1 组数据
$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st0 0 0 7005360 91564 818900 0 0 0 0 25 33 0 0 100 0 0
- cs(context switch)是每秒上下文切换的次数。
- in(interrupt)则是每秒中断的次数。
- r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
- b(Blocked)则是处于不可中断睡眠状态的进程数。
# 每隔 5 秒输出 1 组数据
$ pidstat -w 5
Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU)08:18:26 UID PID cswch/s nvcswch/s Command
08:18:31 0 1 0.20 0.00 systemd
08:18:31 0 8 5.40 0.00 rcu_sched
...
- 所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
- 而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
案例分析
你的准备
# 间隔 1 秒后输出 1 组数据
$ vmstat 1 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st0 0 0 6984064 92668 830896 0 0 2 19 19 35 1 0 99 0 0
操作和分析
# 以 10 个线程运行 5 分钟的基准测试,模拟多线程切换的问题
$ sysbench --threads=10 --max-time=300 threads run
接着,在第二个终端运行 vmstat ,观察上下文切换情况:# 每隔 1 秒输出 1 组数据(需要 Ctrl+C 才结束)
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st6 0 0 6487428 118240 1292772 0 0 0 0 9019 1398830 16 84 0 0 08 0 0 6487428 118240 1292772 0 0 0 0 10191 1392312 16 84 0 0 0
- r 列:就绪队列的长度已经到了 8,远远超过了系统 CPU 的个数 2,所以肯定会有大量的 CPU 竞争。
- us(user)和 sy(system)列:这两列的 CPU 使用率加起来上升到了 100%,其中系统 CPU 使用率,也就是 sy 列高达 84%,说明 CPU 主要是被内核占用了。
- in 列:中断次数也上升到了 1 万左右,说明中断处理也是个潜在的问题。
# 每隔 1 秒输出 1 组数据(需要 Ctrl+C 才结束)
# -w 参数表示输出进程切换指标,而 -u 参数则表示输出 CPU 使用指标
$ pidstat -w -u 1
08:06:33 UID PID %usr %system %guest %wait %CPU CPU Command
08:06:34 0 10488 30.00 100.00 0.00 0.00 100.00 0 sysbench
08:06:34 0 26326 0.00 1.00 0.00 0.00 1.00 0 kworker/u4:208:06:33 UID PID cswch/s nvcswch/s Command
08:06:34 0 8 11.00 0.00 rcu_sched
08:06:34 0 16 1.00 0.00 ksoftirqd/1
08:06:34 0 471 1.00 0.00 hv_balloon
08:06:34 0 1230 1.00 0.00 iscsid
08:06:34 0 4089 1.00 0.00 kworker/1:5
08:06:34 0 4333 1.00 0.00 kworker/0:3
08:06:34 0 10499 1.00 224.00 pidstat
08:06:34 0 26326 236.00 0.00 kworker/u4:2
08:06:34 1000 26784 223.00 0.00 sshd
# 每隔 1 秒输出一组数据(需要 Ctrl+C 才结束)
# -wt 参数表示输出线程的上下文切换指标
$ pidstat -wt 1
08:14:05 UID TGID TID cswch/s nvcswch/s Command
...
08:14:05 0 10551 - 6.00 0.00 sysbench
08:14:05 0 - 10551 6.00 0.00 |__sysbench
08:14:05 0 - 10552 18911.00 103740.00 |__sysbench
08:14:05 0 - 10553 18915.00 100955.00 |__sysbench
08:14:05 0 - 10554 18827.00 103954.00 |__sysbench
...
# -d 参数表示高亮显示变化的区域
$ watch -d cat /proc/interruptsCPU0 CPU1
...
RES: 2450431 5279697 Rescheduling interrupts
...
- 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
- 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
- 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
小结
思考
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)相关推荐
- java基础篇_java基础篇1
JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...
- 03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)
上一节,我给你讲了要怎么理解平均负载( Load Average),并用三个案例展示了不同场景下平均负载升高的分析方法.这其中,多个进程竞争 CPU 就是一个经常被我们忽视的问题. 我想你一定很好奇, ...
- 【Linux 性能优化系列】Linux 性能优化 -- CPU 性能篇(一) 平均负载、上下文切换、CPU 使用率
[Linux 性能优化系列]Linux 性能优化 -- CPU 性能篇(一) 平均负载.上下文切换.CPU 使用率 [1]相关概念 [1.1]平均负载 平均负载是指单位时间内,系统处于可运行状态和不可 ...
- python语言面试基础_Python面试宝典之基础篇-04
Python面试宝典之基础篇-04 发布时间:2020-08-19 02:59:03 来源:ITPUB博客 阅读:101 接着更新Python常见的面试题! 题目016:写一个函数,给定矩阵的阶数n, ...
- 鸟哥的Linux私房菜(基础篇)- Red Hat 6.x旧文件
Red Hat 6.x旧文件 最近更新日期:2001/11/04 这里的文章是在 1999~2001 年之间写成的,基本上都是鸟哥不成熟的一些操作经验而已,有问题的地方可能不少啊!有兴趣者,请前往Li ...
- 鸟哥的Linux私房菜(基础篇)- 第十八章、认识系统服务 (daemons)
第十八章.认识系统服务 (daemons) 最近升级日期:2009/09/14 在 Unix-Like 的系统中,你会常常听到 daemon 这个字眼!那么什么是传说中的 daemon呢?这些 dae ...
- 鸟哥的Linux私房菜(基础篇)- 第十六章、例行性工作排程 (crontab)
第十六章.例行性工作排程 (crontab) 最近升级日期:2009/09/11 学习了基础篇也一阵子了,你会发现到为什么系统常常会主动的进行一些任务?这些任务到底是谁在配置工作的?如果你想要让自己设 ...
- 鸟哥的Linux私房菜(基础篇)- 第八章、Linux 磁盘与文件系统管理
第八章.Linux磁盘与文件系统管理 最近升级日期:2009/08/30 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分割槽不可太大也不能太小,太大会造成磁盘容量的浪费,太小则会产生文 ...
- 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建
V1.1 于2022年7月15日第二次修改:添加了比较多的解释图,解读了各类库的CMakelist.txt文件 目录 第一部分 基础篇(Basics) 1.0 本部分主要学什么(Intro) 1.1 ...
最新文章
- switch case
- 2018春季德国第八届工业4.0考察之旅正式启航
- git---gui使用
- gdb coredump
- Android应用程序消息处理机制(Looper、Handler)分析(1)
- pycharm git gitee 如何将红色文件推送到repository?(将工作区内容添加到暂存区)(git add)
- boost::safe_numerics模块相关的测试程序
- ad域同步其他ldap账号_域渗透——普通用户权限获得DNS记录
- Oracle SqlLoader使用
- Extjs基础入门视频教程
- python爬淘宝评论源代码_一篇文章教会你用Python爬取淘宝评论数据(写在记事本)...
- FineBI 项目资源迁移
- 最新 Transformer 预训练模型综述!
- 1KB文件夹快捷方式病毒清除(转)
- Python版的BS期权定价模型和希腊值分析
- python输入名字配对情侣网名_输入名字自动取情侣网名,输入名字自动取网名
- (三)基于PHP——复杂的WSDL的创建(WSDL篇)
- 4939-大整数排序 ZCMU
- 服务器维护 灵魂兽,魔兽世界7.0新灵魂兽麋鹿捕捉方法
- Pytorch 小白记事本 1
热门文章
- es filter过滤器_Elasticsearch 之 Filter 与 Query 有啥不同?
- java 正则 尖括号_使用JS正则表达式替换括号,尖括号等
- mybatis sql打印输出位置
- struts2模型驱动和令牌拦截器
- javax.naming.NameNotFoundException:
- 谷歌吃苹果:新系统让Macbook秒变Chromebook
- 太恐怖了,Linux服务器感染了kerberods病毒...
- 你们需要的数据集,都给准备好了!
- 漫画:IT人的大阅兵,十分精彩!
- 地图容器自适应浏览器是什么意思_Web移动端实现自适应缩放界面的方法汇总