cpu上下文切换(下)

cpu上下文切换如何查看

上一篇介绍了cpu上下文切换几种场景以及数据保存恢复过程,这篇文章介绍如何查看cpu上下文切换

一、vmstat

安装:yum install -y sysstat

vmstat是一个常用的系统性能分析工具,主要用来分析系统的内存情况,也常用来分析cpu上下文切换和中断的次数。

# vmstat <br/>procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----<br/>r b swpd free buff cache si so bi bo in cs us sy id wa st<br/>1 0 0 1030608 972 119296 0 0 52 15 0 1 4 0 95 0 0

  • cs(context switch)是每秒上下文切换的次数。
  • in(interrupt)是每秒中断的次数。
  • r(Running or Runnable)是就绪队列的长度,也就是等待和运行cpu的进程数。
  • b(Blocked)是处于不可中断睡眠状态的进程数。

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

二、pidstat

pidstat -w 5

Linux 3.10.0-514.26.2.el7.x86_64 (nodejs-test) 06/09/2019 _x86_64_ (2 CPU)

10:53:49 AM UID PID cswch/s nvcswch/s Command
10:53:54 AM 0 9 21.56 0.00 rcu_sched
10:53:54 AM 0 10 0.40 0.00 watchdog/0
10:53:54 AM 0 11 0.40 0.00 watchdog/1
10:53:54 AM 0 12 0.40 0.00 migration/1
10:53:54 AM 0 13 0.40 0.00 ksoftirqd/1

  • cswch:每秒自愿上下文切换的次数。
  • nvcswch:每秒非自愿上下文切换的次数。
  • 自愿上下文切换,是指进程无法获取所需资源,导致上下文切换,如:I/O、内存等资源不足时。
  • 非自愿上下文切换,是指进程由于时间片已到等原因,被系统强制调度,进而发生上下文切换。如:大量进程争抢cpu。

    案例

    操作

    打开三个终端

    1. 创造事故

      以 10 个线程运行 5 分钟的基准测试,模拟多线程切换的问题

      $ sysbench --threads=10 --max-time=300 threads run

    2. 打开第二个中断查看

      每隔 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 st
      6 0 0 6487428 118240 1292772 0 0 0 0 9019 1398830 16 84 0 0 0
      8 0 0 6487428 118240 1292772 0 0 0 0 10191 1392312 16 84 0 0 0

    • cs列的上下文切换次数升到了139万。
    • r列:就绪队列到达了8。超过了cpu的个数。此时肯定有大量cpu竞争。
    • us和sy列加起来100%。sy列高达84%,说明cpu主要是被内核占用了。
    • in列:中断次数上升到1万左右,说明中断处理也是问题。
    1. pidstat

      利用pidstat查看进程上下文切换详细情况;

      #每隔 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:2

      08: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

    ? 从上面输出看出,sysbench进程占用cpu100%,自愿上下文切换频率高的内核线程为sshd和 kwordker。但是,加起来也就是几百,没有达到139万。

    1. pidstat -t参数

      #每隔 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<br/>08:14:05 0 - 10552 18911.00 103740.00 |__sysbench
      08:14:05 0 - 10553 18915.00 100955.00 |__sysbench<br/>08:14:05 0 - 10554 18827.00 103954.00 |__sysbench
      ...

      此时看出,sysbench主进程上下文切换次数不多,但是子线程却很多。

      前面我们看见,不止上下文切换频率升高,还有中断次数。

      一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且调用一个称为中断处理器或中断服务程序(interrupt service routine)的特定程序。

      查看文件接口

      #cat /proc/interrupts

      ? CPU0 CPU1
      25: 10652623 80703151 PCI-MSI-edge virtio3-req.0
      26: 0 0 PCI-MSI-edge virtio2-config
      27: 2 0 PCI-MSI-edge virtio2-virtqueues
      28: 0 0 PCI-MSI-edge virtio0-config
      29: 599781 28812335 PCI-MSI-edge virtio0-input.0
      30: 2 506 PCI-MSI-edge virtio0-output.0
      31: 0 0 PCI-MSI-edge virtio1-config
      32: 6893540 111078549 PCI-MSI-edge virtio1-input.0
      33: 615 1368 PCI-MSI-edge virtio1-output.0
      NMI: 0 0 Non-maskable interrupts
      LOC: 3818014562 3882568092 Local timer interrupts
      SPU: 0 0 Spurious interrupts
      PMI: 0 0 Performance monitoring interrupts
      IWI: 92938221 96288600 IRQ work interrupts
      RTR: 0 0 APIC ICR read retries
      RES: 316386309 327268304 Rescheduling interrupts
      CAL: 71367577 3699711 Function call interrupts
      TLB: 21377263 20572311 TLB shootdowns
      TRM: 0 0 Thermal event interrupts
      THR: 0 0 Threshold APIC interrupts

      中的RES: 316386309 327268304 Rescheduling interrupts

    总结

    • 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了IO等其他问题
    • 非自愿上下文切换变多了,说明进程在被强制调度,也就是在争抢cpu,说明cpu的确成了瓶颈
    • 中断次数变多了,说明cpu被中断处理程序占用,需要查看/proc/interrupts 接口文件。

原文地址:https://blog.51cto.com/12924846/2406447

时间: 2024-08-30 14:49:59

cpu上下文切换(下)的相关文章

2.2 CPU 上下文切换是什么意思?(下)

怎么查看系统的上下文切换情况 过多的上下文切换,会把 CPU 时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个 元凶. 使用 vmstat 这个工具,来查询系统的上下文切换情况. vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数. vmstat 的使用示例: [[email protected] ~]# vmstat 5 procs -----------memor

CPU上下文切换(上)

CPU上下文切换 ? 我们经常说的平均负载和cpu升高没有直接的关系,在不同的场景cpu升高会导致系统负载,但是系统负载不一定是cpu升高导致的. 一.系统负载过高的三种场景 cpu密集型进程,使用大量cpu会导致平均负载升高,此时这两者是一致的. io密集型进程,等待io也会导致平均负载升高,但cpu不一定很高. 大量等待cpu的进程调度也会导致平均负载升高,此时cpu使用率也会比较高. ? 大量进程竞争cpu(也就是上面的第三个场景),往往是被忽略的,cpu虽然没有使用,只是在竞争,也会发生

Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换

??linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执行任务所依赖的环境,也就是CPU上下文. ??CPU上下文切换,就是把前一个任务的CPU上下文(CPU寄存器和程序计数器)保存起来,然后加载入新任务的上下文到CPU寄存器和程序计数器中,最后跳转到程序计数器所指的位置,运行新任务. ??保存下来的上下文会在系统内核中,并在任务重新调度执行时再次加载进

CPU 上下文切换之理论篇(上)

1.什么是上下文?答:上下文是由CPU寄存器和程序计数器组成 2.CPU为什么进行上下文切换?答:CPU上下文切换,是保证Linux系统正常工作的核心功能之一 3.什么是CPU上下文切换?答:CPU上下文切换,就是先把前一个任务的CPU上下文保存起来,然后加载新任务的上下文到这些寄存器和程序计数器中,最后跳转到程序计数器所指的新位置,运行任务 4.什么是cpu寄存器?答:cpu寄存器是cpu内置很小.但速度极快的内存 5.什么是程序计数器?答:是用来存储CPU正在执行的指令位置.或者即将执行的下

03讲基础篇:经常说的CPU上下文切换是什么意思(上)

1.多任务竞争CPU,cpu变换任务的时候进行CPU上下文切换(context switch).CPU执行任务有4种方式:进程.线程.或者硬件通过触发信号导致中断的调用.2.当切换任务的时候,需要记录任务当前的状态和获取下一任务的信息和地址(指针),这就是上下文的内容.因此,上下文是指某一时间点CPU寄存器(CPU register)和程序计数器(PC)的内容, 广义上还包括内存中进程的虚拟地址映射信息.3.上下文切换的过程:(1)记录当前任务的上下文(即寄存器和计算器等所有的状态):(2)找到

03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)

一.关于上下文切换的几个为什么 1.上下文切换是什么? 上下文切换是对任务当前运行状态的暂存和恢复 2.为什么CPU要进行上下文切换 当多个进程竞争CPU的时候,为了保证每个进程可以公平被CPU调用,采用处理任务按时间分片的机制,当某个时间片上的任务达到最后的时间点,那么这个任务就好被挂起,处理下一个任务,由于CPU处理的速度非常快,在人类感知上认为是并行处理的,实际是伪并行,同一时间只有一个任务在运行处理. 3.上下文切换主要消耗什么资源,为什么说上下文切换次数过多不可取? 浪费太多时间在切换

进程在多核CPU环境下分布不均导致TCP连接堆积

今天处理了一个客户的故障,可能在web排错方面有一定的代表性,所以在这里跟大家分享. 背景: 电商客户,系统架构是前端一台负载均衡设备,负载均衡算法是轮询(round robin):后面是两台web服务器,跑的应用是gunicorn(一个Python WSGI UNIX的HTTP服务器). 故障现象: 用户抱怨网站响应慢,有较多的页面打不开的情况.从系统监控来看,两台后端服务器的连接数(TCP)不相等.曲线图显示,其中一台的连接数在数十分钟内越来越偏离另一台正常服务器的连接数曲线.最严重的时刻,

faster r-cnn 在CPU配置下训练自己的数据

因为没有GPU,所以在CPU下训练自己的数据,中间遇到了各种各样的坑,还好没有放弃,特以此文记录此过程. 1.在CPU下配置faster r-cnn,参考博客:http://blog.csdn.net/wjx2012yt/article/details/52197698#quote 2.在CPU下训练数据集,需要对py-faster-rcnn内的roi_pooling_layer和smooth_L1_loss_layer改为CPU版本, 并重新编译.这位博主对其进行了修改,可直接进行替换:htt

cpu上下文切换

cpu上下文就是寄存器和程序计数器.这里记录着指令的位置,他们存在系统内核 系统调用过程叫上下文切换. 进程的上下文切换,线程的上下文切换,中断的上下文切换 一:进程的上下文切换:他与系统调用的不同是,进程中还包括,虚拟内存,全部变量,栈等用户态.也包括寄存器,内核堆栈等内核态 二:线程的上下文切换,如何进程中只一个线程,那这个线程相当于线程 三:中断上下文切换:会打断正常的进程,优先级高 怎么查看系统上下文切换? 利用sysbench,vmstat,pidstat ,和 /proc/inter