1、CPU上下文切换多线程
一、上下文切换,有时也称作进程切换或任务切换,是指CPU从一个进程或线程切换到另外一个进程或线程。工具
二、vmstat是一个经常使用的系统性能分析工具,主要用来分析系统内存使用状况,也经常使用来分析CPU上下文切换和中断的次数。性能
例:vmstat -w线程
上下文切换须要特别关注的四列内容:3d
cs(context switch) 是每秒上下文切换的次数。
in(interrupt) 则是每秒中断的次数。
r(Running or Runnable) 是就绪队列的长度。
b(Blocked) 则是处于不可中断睡眠状态的进程数。blog
这个例子中的上下文切换次数 cs 是 12 次,系统中断次数in则是93次,而就绪队列长度 r 和不可中断状态进程数 b 都是 0。队列
三、vmstat只给出了系统整体的上下文切换状况,若是要看每一个进程的详细状况,就须要pidstat了,加上-w选项进程
例:pidstat -w 2内存
需关注:cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数资源
nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。
自愿上下文切换:是指进程没法获取所需资源,致使的上下文切换。好比说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
非自愿上下文切换:则是指进程因为时间片已到等缘由,被系统强制调度,进而发生的上下文切换。好比说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
2、使用sysbench 来模拟系统多线程调度切换的状况
二、解压tar xvf sysbench-0.4.12.14.tar.gz
三、进入解压目录并执行 ./configure
四、make && make install
五、在第一个终端执行 sysbench --num-threads=10 --max-time=300 --max-requests=10000000 --test=threads run
六、在第二个终端运行vmstat观察上下文切换状况:
vmstat -w 1 3
能够发现,上下文切换cs已经上升到了256万,同时:
r 列:就绪队列的长度已经到了 9,远远超过了系统 CPU 的个数 2,因此确定会有大量的 CPU 竞争。
us(user)和 sy(system)列:这两列的 CPU 使用率加起来上升到了 100%,其中系统 CPU 使用率,也就是 sy 列高达 89%,说明 CPU 主要是被内核占用了。
in 列:中断次数也上升到了 3000左右。
综合这几个指标,咱们能够知道,系统的就绪队列过长,也就是正在运行和等待 CPU 的进程数过多,致使了大量的上下文切换,而上下文切换又致使了系统 CPU 的占用率升高。
七、使用pidstat查看CPU和进程上下文切换状况:
pidstat -wt -u 1 3 # -wt 参数表示输出线程指标,而 -u 参数则表示输出 CPU 使用指标
从 pidstat 的输出你能够发现,CPU 使用率的升高果真是 sysbench 致使的,它的 CPU 使用率已经达到了 194%,虽然 sysbench 进程(也就是主线程)的上下文切换次数看起来不多,可是它的子线程的上下文切换次数却有不少。看来,上下文切换罪魁祸首,仍是过多的 sysbench 线程。
八、继续查看中断次数的详细信息
执行:watch -d cat /proc/interrupts # -d表示高亮显示变化的参数
观察一段时间,能够发现变化最快的是从新调度中断(RES),这个中断类型表示,唤醒空闲状态的 CPU 来调度新的任务运行。这是多处理器系统(SMP)中,调度器用来分散任务到不一样 CPU 的机制,一般也被称为处理器中断。
总结:
每秒上下文切换多少次算正常?
这个数值主要取决于系统CPU的性能,若是上下文切换比较稳定,那在1万如下都算是正常,若是超过1万或者切换次数出现很大的增加,就极可能出现了性能问题。
cswch ,自愿上下文切换的次数增多了,说明系统正在等待资源,有可能发生了I/O等其它问题;
nvcswch ,非自愿上下文切换的次数增多了,说明进程都在强制调度,也就是在争抢CPU,说明CPU性能成了瓶颈;
in,中断次数增多了,说明CPU被中断,经过分析/proc/interrupt文件来确认中断类型。