一、怎么查看系统上下文切换情况

通过前面学习我么你知道,过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和回复上,缩短进程
真正运行的时间,成了系统性能大幅下降的一个元凶

既然上下文切换对系统性能影响那么大,你肯定迫不及待想知道,道题怎么查看上下文切换

1、系统总的上下文切换情况

[root@nfs ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st1  0  45668 1600548      0 341196   27  109   131   112  239  280  4 17 79  0  00  0  45668 1600556      0 341196    0    0     0     0   33   44  0  0 100  0  01  0  45668 1600556      0 341196    0    0     0     0   31   39  0  0 100  0  00  0  45668 1600556      0 341196    0    0     0     0   50   48  1  1 99  0  00  0  45668 1600556      0 341196    0    0     0     0   31   42  0  0 100  0  00  0  45668 1600556      0 341196    0    0     0     0   32   41  0  1 100  0  00  0  45668 1600556      0 341196    0    0     0     0   32   38  0  0 100  0  00  0  45668 1600556      0 341196    0    0     0     0   29   37  0  0 100  0  00  0  45668 1600556      0 341196    0    0     0     0   29   38  0  0 100  0  0

2、每个进程的上下文切换情况

可以看到这个例子中的上下文切换cs是280次,而系统中断次数in则是239次,而就绪队列长度r和不可中断状态是1进程数b都是0

只给出了系统总的上下文切换情况,要想查看每个进程的上下文切换的情况了?

$ 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:2UID       PID   cswch/s nvcswch/s  Command0         8     11.00      0.00  rcu_sched0        16      1.00      0.00  ksoftirqd/10       471      1.00      0.00  hv_balloon0      1230      1.00      0.00  iscsid0      4089      1.00      0.00  kworker/1:50      4333      1.00      0.00  kworker/0:30     10499      1.00    224.00  pidstat0     26326    236.00      0.00  kworker/u4:2
1000     26784    223.00      0.00  ssh

 

3、什么是自愿上下文切换

所谓自愿上下文切换,是指进程无法获取所需自愿,导致的上下文奇幻。比如比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切...是

4、什么是非自愿上下文切换

而非自愿上下文奇幻,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文奇幻,比如大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换

二、案例分析

1、分析环境

机器配置:2 CPU,4GB 内存

预先安装 sysbench

cnetos 7.2

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
yum -y install sysbench  

三、分析操作

终端一

# 以 10 个线程运行 5 分钟的基准测试,模拟多线程切换的问题
$ sysbench --threads=10 --max-time=300 threads run

终端二

# 每隔 1 秒输出 1 组数据(需要 Ctrl+C 才结束)
[root@nfs ~]# 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  45412 1585156      0 351460   10   38    46    39  118   10  2  8 90  0  08  0  45412 1585156      0 351468    0    0     0     0 2023 2208584 17 83  0  0  07  0  45412 1585156      0 351468    0    0     0     0 2008 2183632 18 82  1  0  08  0  45412 1585156      0 351468    0    0     0     0 2013 2278429 17 83  0  0  08  0  45412 1585156      0 351468    0    0     0     0 2008 2251628 18 82  0  0  06  0  45412 1585156      0 351468    0    0     0     0 2014 2236468 19 81  0  0  07  0  45412 1585156      0 351468    0    0     0     0 2004 2255035 17 83  0  0  06  0  45412 1585156      0 351468    0    0     0     0 2020 2212782 18 82  1  0  07  0  45412 1585156      0 351468    0    0     0     0 2013 2194160 19 81  0  0  0

你应该可以发现,cs列的上下文切换次数从之前的10骤然上升了220万,同时,注意观察其他几个指标

r 列:就绪队列的长度已经到了 8,远远超过了系统 CPU的个数2,所以肯定会有大量的CPU竞争

us(user)和 sy(system)列:这两列的 CPU使用率加起来上升到了 100%,其中系统CPU使用率,也就是sy列高达90%说明CPU主要被内核占用了

in 列:中断次数也上升到了 1 万左右,说明中断处理也是个潜在的问题

综合这几个指标,我们可以知道,系统的就绪队列过长,也就是正在运行和等待的CPU进程数过多,导致大量的上下文切换,而上下文切换还又导致了系统CPU的占用率升高

终端三

那么到底是是哪个进程导致了这些问题了

[root@nfs ~]# pidstat -w -u 1
Linux 3.10.0-957.12.1.el7.x86_64 (nfs)  05/03/2019  _x86_64_    (2 CPU)12:58:57 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
12:58:59 PM     0      9183   31.07  162.14    0.00    0.00  193.20     0  sysbench
12:58:59 PM     0      9196    0.00    0.97    0.00    0.00    0.97     0  kworker/0:012:58:57 PM   UID       PID   cswch/s nvcswch/s  Command
12:58:59 PM     0         3      1.94      0.00  ksoftirqd/0
12:58:59 PM     0         9      7.77      0.00  rcu_sched
12:58:59 PM     0       103      1.94      0.00  kworker/1:2
12:58:59 PM     0      5823     10.68      0.00  vmtoolsd
12:58:59 PM     0      6969      0.97      0.00  sshd
12:58:59 PM     0      9066      0.97      0.00  kworker/u256:1
12:58:59 PM     0      9195      0.97      0.00  vmstat
12:58:59 PM     0      9196      1.94      0.00  kworker/0:0
12:58:59 PM     0      9198      0.97      0.00  pidstat
^C

从 pidstat 的输出你可以发现,CPU 使用率的升高果然是 sysbench 导致的,它的 CPU 使用率已经达到了 100%但是上下文切换则是来自其他进程,包括非自愿上下文切换频率最高的pidstat

以及自愿上下文切换频率最高的内核线程kworker 和 sshd

不过,细心的你肯定也发现了一个怪异的事儿:pidstat 出的上下文切换次数,加起来也就几百,比 vmstat 的 220万明显小了太多。这是怎么回事呢?难道是工具本身出了错吗?

通过运行 man pidstat ,你会发现,pidstat默认显示进程的指标数据,加上 -t 参数后,才会输出线程的指标

我们还是在第三个终端里, Ctrl+C 停止刚才的 pidstat 命令,然后运行下面的命令,观察中断的变化情况.

[root@nfs ~]# pidstat -wt 1
Linux 3.10.0-957.12.1.el7.x86_64 (nfs)  05/03/2019  _x86_64_    (2 CPU)01:00:35 PM   UID      TGID       TID   cswch/s nvcswch/s  Command
01:00:36 PM     0         3         -      0.93      0.00  ksoftirqd/0
01:00:36 PM     0         -         3      0.93      0.00  |__ksoftirqd/0
01:00:36 PM     0         9         -     17.76      0.00  rcu_sched
01:00:36 PM     0         -         9     17.76      0.00  |__rcu_sched
01:00:36 PM     0        14         -      3.74      0.00  ksoftirqd/1
01:00:36 PM     0         -        14      3.74      0.00  |__ksoftirqd/1
01:00:36 PM     0       103         -      1.87      0.00  kworker/1:2
01:00:36 PM     0         -       103      1.87      0.00  |__kworker/1:2
01:00:36 PM     0      5823         -     10.28      0.00  vmtoolsd
01:00:36 PM     0         -      5823     10.28      0.00  |__vmtoolsd
01:00:36 PM     0         -      6755      0.93      0.00  |__tuned
01:00:36 PM     0         -      6666      0.93      0.00  |__in:imjournal
01:00:36 PM     0      6969         -      0.93      0.00  sshd
01:00:36 PM     0         -      6969      0.93      0.00  |__sshd
01:00:36 PM     0      9066         -      0.93      0.00  kworker/u256:1
01:00:36 PM     0         -      9066      0.93      0.00  |__kworker/u256:1
01:00:36 PM     0         -      9184  37752.34 157714.02  |__sysbench
01:00:36 PM     0         -      9185  43673.83 153500.00  |__sysbench
01:00:36 PM     0         -      9186  32598.13 150383.18  |__sysbench
01:00:36 PM     0         -      9187  31631.78 179364.49  |__sysbench
01:00:36 PM     0         -      9188  43047.66 129503.74  |__sysbench
01:00:36 PM     0         -      9189  25115.89 170748.60  |__sysbench
01:00:36 PM     0         -      9190  40545.79 179413.08  |__sysbench
01:00:36 PM     0         -      9191  48101.87 157711.21  |__sysbench
01:00:36 PM     0         -      9192  31725.23 164217.76  |__sysbench
01:00:36 PM     0         -      9193  37538.32 159869.16  |__sysbench
01:00:36 PM     0      9195         -      0.93      0.00  vmstat
01:00:36 PM     0         -      9195      0.93      0.00  |__vmstat
01:00:36 PM     0      9196         -      1.87      0.00  kworker/0:0
01:00:36 PM     0         -      9196      1.87      0.00  |__kworker/0:0
01:00:36 PM     0      9200         -      0.93      0.93  pidstat
01:00:36 PM     0         -      9200      0.93      0.93  |__pidstat

现在你就能看到了,虽然 sysbench 进程(也就是主线程)的上下文切换次数看起来并不多,但它的子线程的上下文切换粗疏却又很多,

看来,上下文切换醉魁祸首,还是过多的线程

[root@nfs ~]# tail -15 /proc/interruptsIWI:       6600       5405   IRQ work interruptsRTR:          0          0   APIC ICR read retriesRES:      22360      25295   Rescheduling interruptsCAL:       1158        647   Function call interruptsTLB:      23862       8639   TLB shootdownsTRM:          0          0   Thermal event interruptsTHR:          0          0   Threshold APIC interruptsDFR:          0          0   Deferred Error APIC interruptsMCE:          0          0   Machine check exceptionsMCP:         35         35   Machine check pollsERR:          0MIS:          0PIN:          0          0   Posted-interrupt notification eventNPI:          0          0   Nested posted-interrupt eventPIW:          0          0   Posted-interrupt wakeup event

观察一段时间,你可以发现,变化速度最快的是重调度中断,这中断类似表示,唤醒空闲状态的CPU来调度新的任务运行,这是多处理器中,调度器用来分散任务到不同CPU的机制,通常也被称为处理间中断

cswch过多说明资源IO问题,nvcswch过多说明调度争抢cpu过多,中断次数变多说明cpu被中断程序调用

四、小结

1、每秒上下文奇幻多少次才算正常呢?

这个数值其实取决于系统本身的CPU性能,在我看来,如果系统上下文切换次数比较稳定,那么从数百一万以内,都有应该算是正常的,

但当上下文奇幻次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现性能问题

2、根据上下文切换类型再具体分析

自愿上下文切换变多了,说明进程都在等待自愿,有可能发生了I/O等其他问题;

非自愿上下文切换变多了,说明进程都在被强制调动,也就是在争抢CPU,说明CPU的确成了瓶颈

中断次数变多了了,说明CPU被中断处理程序占用,还需要通过查看/proc/interrupts 文件来分析具体的中断类型。

3、假设我现在有一台Linux服务器负载变高了,如何找到原因?如何排查分析

Step1: 首先通过uptime看下最近一段时间的负载怎么样,能够得出是徒然变高还是变高已经有一段时间了,比较5min和15min系统负载的数据

Step2: 分析系统负载高的原因有哪些?根据前面学习的,可能是计算密集型任务导致,IO密集型任务导致,还有可能是大量线程等待调度导致,还有可能是几种情况的组合同时存在。这里要怎么分析可以通过mpstat工具来区分,主要关注的几个指标是%idle %iowait %wait

Step3: 如果通过上一步确认是大量线程等待调度导致,那么可以通过vmstat来查看系统整体的上下文切换情况,主要关注cs/in/r/b 四个指标

Step4: 我们已经知道了系统负载高的原因,进一步通过pidstat 查看具体是那一个线程导致的详细原因

4、拍错思路总结

登录到服务器,现在系统负载怎么样 。 高的话有三种情况,首先是cpu使用率 ,其次是io使用率 ,之后就是两者都高 。

cpu 使用率高,可能确实是使用率高, 也的可能实际处理不高而是进程太多切换上下文频繁 , 也可能是进程内线程的上下文切换频繁

io 使用率高 , 说明 io 请求比较大, 可能是 文件io 、 网络io 。

工具 :
系统负载 : uptime ( watch -d uptime)看三个阶段平均负载

系统整体情况 : mpstat (mpstat -p ALL 3) 查看 每个cpu当前的整体状况,可以重点看用户态、内核态、以及io等待三个参数

系统整体的平均上下文切换情况 : vmstat (vmstat 3) 可以重点看 r (进行或等待进行的进程)、b (不可中断进程/io进程) 、in (中断次数) 、cs(上下文切换次数)

查看详细的上下文切换情况 : pidstat (pidstat -w(进程切换指标)/-u(cpu使用指标)/-wt(线程上下文切换指标)) 注意看是自愿上下文切换、还是被动上下文切换

io使用情况 : iostat

转载于:https://www.cnblogs.com/luoahong/p/10804753.html

Linux性能优化实战:CPU的上下文切换是什么意思(04)相关推荐

  1. idl linux运行效率,Linux性能优化实战 CPU篇 阅读笔记

    第十一讲 如何快速分析出CPU的性能瓶颈(2020.6.3) 这一讲干活真是太多了,将之将使用的各种工具串联起来.其实系统出问题之后第一感觉就是感觉就是系统相应变慢了.我们可以使用<> 里 ...

  2. linux性能优化实战学习笔记-(1)CPU性能分析工具与套路

    版权归Linux性能优化实战 作者倪鹏飞,本文主要是为学习.整理相关知识点,请勿用作商用,侵删. linux性能分析工具 下图来自:Brendan D. Gregg http://www.brenda ...

  3. Linux 性能优化实战(倪朋飞)---CPU 使用率

    查看 CPU 使用率 对于 CPU 使用率,top 默认 3 秒时间间隔:ps 使用的是进程的整个生命周期. top 显示系统总体的 CPU 和内存使用情况,及各个进程的资源使用情况:ps 只显示每隔 ...

  4. linux性能优化实战 倪朋飞,Linux性能优化实战:系统的swap变高(09)

    一.实验环境 1.操作系统 root@openstack:~# lsb_release -a No LSB modules are available. Distributor ID:Ubuntu D ...

  5. Linux 性能优化实战(倪朋飞)---平均负载

    查看平均负载: $ uptime20:32:31 up 33 min, 1 user, load average: 0.72, 0.63, 0.70 结果解释: 20:32:31 // 当前时间 up ...

  6. 推荐学习-Linux性能优化实战

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 推荐一个学习 ...

  7. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  8. Linux性能优化实战学习笔记:第十讲==中断

    Linux性能优化实战学习笔记:第十讲 一.坏境准备 1.拓扑图 2.安装包 在第9节的基础上 在VM2上安装hping3依奈包 ? 1 2 3 4 5 6 7 wget http://www.tcp ...

  9. Linux 性能优化实战(倪朋飞)---系统中出现大量不可中断进程和僵尸进程怎么办?

    进程状态 可通过 top 或 ps 查看进程状态. $ topPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4480 yjp 20 0 6 ...

  10. 学习Linux性能优化实战-1

    文章目录 前言 平均负载 命令 进程调度 命令 相关文件 CPU使用率 perf 软中断 测试工具 前言 最近在极客时间上面发现了倪鹏飞老师的Linux性能优化实战,自己感觉讲得很好,有兴趣的朋友可以 ...

最新文章

  1. 企业数字化转型本质上是“人”的转型和“组织”的转型
  2. Socket笔记【转】
  3. mysql查询总结_mysql查询总结相关
  4. cmd命令安装composer踩坑
  5. Chapter 1 Securing Your Server and Network(2):管理服务的SIDs
  6. socket阻塞与非阻塞,同步与异步
  7. java 责任链模式 链表_责任链模式的实现及源码中应用
  8. jQuery 3 有哪些新东西
  9. redhat linux 中用锐捷客服端实现上网
  10. html 实现页面加载进度,网页加载进度条实现方案
  11. meta分析-stata软件使用
  12. Android APP极光推送取消关联启动配置
  13. 主成分分析(PCA)的一种理解和推导
  14. 115CSS3+JS:胶卷式放映
  15. 【系统测试报告】苏科大App系统测试报告
  16. 项目中有时候为什么加载不出来图片
  17. 关于Entity FrameWork获取插入后的自增ID
  18. I2C器件之PCF8574TS调试记录
  19. Apache OpenNlp的初探
  20. gedit的安装及插件使用

热门文章

  1. anaconda创建一个新的虚拟环境
  2. 揭秘:广告拦截软件如何赚钱?
  3. 电影推荐系统 python简书_【记录|Spark】简单的电影推荐系统
  4. 【福利】【送书第四弹】机器学习知识体系
  5. 想要不被裁,看一看 13 年华为老兵的宝贵经验
  6. 有没有可操作的虚拟资源赚钱项目
  7. 洛谷P1606 Lilypad Pond G
  8. python lambda函数for 字符串_Python Lambda
  9. 【C语言初学必看】猜数字游戏背后的知识
  10. 嵌入式系统与通用计算机系统的区别,嵌入式操作系统和通用计算机系统的区别是什么...