首先我们来看如何查看系统的上下文切换情况

vmstat 5

file

其中跟本文相关的比较重要的几列的含义:

  • r:正在运行和等待CPU的进程数
  • b:处于不可中断睡眠状态的进程数
  • in:每秒中断次数
  • cs:每秒上下文切换次数
  • us:用户进程占用的cpu
  • sy:系统进程占用的cpu

接着我们继续使用之前文章提到的pidsta工具观察cpu上下文切换

pidstat -w 5

file 这个结果中有两列我们需要关注的内容:

  • cswch:每秒自愿上下文切换,也就是进程无法获取到可供执行的资源从而自愿发生上下文切换
  • nvcswch:每秒非自愿上下文切换,进程时间片用完、被高优先级进程抢走、系统中断等发生的非自愿的场景

案例分析

这个案例需要用到一个压测工具:sysbench,安装方式如下: yum install -y sysbench

基本使用方式如下:

  • 测试cpu使用这个命令:sysbench --test=cpu run,可选参数如下:
    • --num-threads:线程数,默认值为1
    • --max-requests:最大请求数,默认值为10000
    • --cpu-max-prime:最大素数,使用该参数后,会使用64-bit int型进行性能测试计算
    • --percentile:取值百分比值,默认是95 ,即丢弃5%的长请求,在剩余的95%里取最大值
  • 测试io使用这个命令:sysbench --test=fileio run,可选参数如下:
    • --file-num=N:创建文件数量
    • --file-block-size=N:单个文件大小
    • --file-total-size=SIZE:创建文件的总大小
    • --file-test-mode=STRING:测试模式,可选值 {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw}
    • --file-io-mode=STRING:文件操作模式,可选值{sync,async,fastmmap,slowmmap} [sync]
    • --file-extra-flags=STRING:打开文件的模式,可选值 {sync,dsync,direct}
    • --file-merged-requests=N:最多合并请求数量
    • --file-rw-ratio=N:读写比例
  • 测试io使用这个命令:sysbench --test=memory run,可选参数如下:
    • --mutex-num:互斥量
    • --memory-scope:使用全局或局部内存块,可选值global, local
    • --memory-total-size:总内存
    • --memory-oper:内存操作类型,可选值read, write

我们用这个工具模拟一下10个线程并发执行的场景

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

观察系统的上下文切换次数

vmstat 5

file 观察结果可以得出以下结论:

  • cs列的上下文切换次数最高值已经上升到了150多万
  • r列的就绪队列的长度也到了8
  • us和sy列的CPU使用率加起来也快到100%了
  • in列中断次数也上升到了10万多

接着我们使用pidstat工具来定位引起这个结果的进程

pidstat -wu 5

file 这里很直观的可以看到是有sysbench程序引起的。

除此之外,如果我们想要定位到具体引起这么多上下文切换的线程,只需要稍微修改一下参数 pidstat -wt 5 file

1

目录