从应用负载的视角出发,考虑“吞吐”和“延时”
从系统资源的视角出发,考虑资源使用率、饱和度等


安装命令:apt install stress
#模拟一个CPU使用率 100%stress -c N会让stress生成N个工作进程进行开方运算,以此对CPU产生负载。stress --cpu 1 --timeout 600
#模拟I/O密集进程stress -i N会产生N个进程,每个进程反复调用sync()将内存上的内容写到硬盘上, --timeout 600 表示600秒后退出 stress -i 1 --timeout 600
安装命令:apt install sysstat
mpstat -P ALL 5 其中-P ALL 表示监控所有CPU数字5,表示每间隔5秒输出一组数据
pidstat -u 5 1每间隔5秒输出一组数据
stress
#模拟一个CPU使用率 100% stress -c N 会让stress生成N个工作进程进行开方运算,以此对CPU产生负载。--timeout 600 表示600秒后退出 stress --cpu 1 --timeout 600
监控uptime,负载在升高

mpstat,发现一个CPU的使用率高达100%,但是iowait为0,说明平均负载的升高由于CPU的使用率为100%

pidstat,发现是stress进程导致CPU使用率升高

stress
#模拟I/O密集进程 stress -i N 会产生N个进程,每个进程反复调用sync()将内存上的内容写到硬盘上stress -i 1 --timeout 600
监控uptime,负载在升高

mpstat,发现一个系统CPU使用率升至23.87%,iowait高达67.53% 。说明平均负载的升高由于iowait的升高


pidstat,发现是由于stress进程导致

stress
stress -c 8 --timeout 600
uptime

pidstat,发现8个进程在争抢2个CPU,每个进程等待CPU的时间高达75%,导致CPU过载


CPU寄存器:CPU内置的容量小、但速度极快的内存
程序计数器:用于存储CPU正在执行的指令位置、或者即将执行的下一条指令位置
CPU上下文:CPU寄存器和程序计数器所必须的依赖环境
CPU上下文切换:先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
Linux按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应CPU特权等级的 Ring 0 和Ring 3

换个角度,也就是进程既可以在用户空间运行,又可以在内核空间运行。进程在用户空间运行时,被称为进程的用户态,而陷入内核空间的时候,被称为进程的内核态。
在进程切换时才需要切换上下文,也就是进程调度时。Linux为每个CPU都维护了一个就绪队列,将活跃进程按照优先级和等待CPU的时间排序,然后选择最需要CPU的进程,也就是优先级最高和等待CPU时间最长的进程运行。涉及到的场景包括:
线程是调度的基本单位,而进程则是资源拥有的基本单位。
线程上下文切换:1,前后两个线程属于不同进程,由于资源不同就是进程上下文切换;2,前后两个线程属于同一个进程,此时虚拟内存共享,切换时只需要切换线程的私有数据、寄存器等不共享的数据。

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

查看系统的上下文切换次数

采用sysbench进行压测

再次查看vmstat

发现cs列的上下文切换数量从之前的35骤然上升到了139万多。同时,r列:就绪队列的长度为8,远超CPU的个数2,所以判定有大量的CPU竞争;us(user)和sy(system)列:这两列的CPU使用率加起来上升到了100%,其中系统CPU使用率,也就是sy列高达84%,说明CPU主要是被内核占用了;in列:中断次数也上升到1万左右,说明中断处理也是个潜在的问题。综合这几个指标,系统的就绪队列过长,也就是正在运行和等待CPU的进程数过多,导致大量的上下文切换,而上下文切换又导致系统的CPU的占用率升高。
采用pidstat分析



结合两次的pidstat可以看出,sysbench(主线程)的上下文切换次数看起来并不太多,但它的子线程的上下文切换次数却很多。
采用watch观察interrupts中断

观察发现,变化速度最快的是重调度中断(RES),表示唤醒空闲状态的CPU来调度新的任务运行。这是多处理器系统(SMP)中,调度器用来分散任务到不同CPU的机制,通常也被称为处理器间中断(Inter-Processor Interrupts, IPI)。
如果系统的上下文切换次数比较稳定,那么从数百到一万内,都应该算是正常的。当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,都很可能已经出现了性能问题: