CPU上下文:CPU中的寄存器和程序计数器。切换出的CPU上下文,会保存到linux系统内核中。
分为3种:1、进程上下文,2、线程上下文,3、中断上下文(硬件通过触发信号,导致中断处理程序运行)。
进程的运行空间:内核空间、用户空间。
内核空间:具有最高权限,可以直接访问所以资源,包括硬件。
用户空间:只有有限资源,不能访问包括内存在内的硬件只有,必须通过系统调用嵌入到内核中,才可以调用这些资源。
从用户态到内核态,是通过系统调用实现的。比如我们要查看一个文件的内容,需要
1、调用系统调用open打开一个磁盘文件,
2、read读取一个文件内容,
3、write输入到标准输入,
4、close关闭文件。
一、
执行系统调用,也是需要切换CPU上下文的。需要先保存CPU上下文的当前状态,然后加载系统调用的上下文,再然后跳转到内核态,执行内核任务。
系统调用完成,需要保存CPU现在的上下文状态,加载上次新的上下文状态,进入用户态,执行。
一次系统调用,发生了2次CPU上下文切换。
系统调用,一直是在同一个进程中运行的。
二、
进程上下文切换
进程切换只能在内核态中运行。进程切换不只切换虚拟内存、栈、全局变量等用户空间资源,也包括内核堆栈、等内核态资源。
保存上下文和恢复上下文,也不是免费操作,需要内核占用CPU运行,进行切换。
如果进程切换太频繁,容易导致CPU将大部分时间用户虚拟内存、栈等的资源的保存和恢复上。大大缩短运行真正进程的时间。
另外频繁的切换,会导致虚拟内存不停刷新,导致内存访问变慢。
什么时候会切换进程上下文?
在进程切换的时候。
每个CPU会有1个就绪队列,其中保存着各个待执行的进程。
1、进程执行完成
2、CPU会平分时间片,时间片用完,会发现进程切换。
3、进程调用sleep函数时。
4、进程暂时得不到需要的系统资源时,会挂起进程。
5、高优先级的进程过来时,会先执行高优先级的进程。
6、发生硬件中断时,CPU会将当前进程挂起,去执行中断处理程序。
线程切换
1、2个线程位于不同的进程,那么和进程切换一样。
2、2个线程位于相同的进程,那么共享同一块虚拟内存、共享变量等资源,这部分内容不动,但线程也有他自己的独有的资源。
中断上下文切换
中断只发生在内核态,所以中断上下文切换时,不需要保持原进程的内核态上下文信息,但需要保存原进程的用户态上下文信息。
工具
vmstat可以切换系统总体的上下文切换次数和系统中断次数
CS每秒上下文切换次数
in每秒中断发生次数
r就绪队列的长度,就是正在运行和准备运行的进程数
b处于不可中断睡眠状态的进程数
查询进程的上下文切换用工具pidstat -w
cswch每秒自愿上下文切换的次数,进程因为无法获得系统资源,如IO、内存等,进行的上下文切换。
nvswch每秒非自愿上下文切换的次数,进程因为时间片用完等,发生的上下文切换。
apt-get install sysbench sysstat
定位问题的思路:
1、top查看,平均负载6,现在有2个CPU,说明是CPU个数的3倍,正常最多为的CPU个数
2、查看sys内存占用76,usr占用24,猜测可能是CPU上下文切换的问题。
3、vmstat可以查看系统整体的上下文切换情况,执行命令,确实为CS每秒上下文切换次数,in每秒中断次数都达到13W,并且r就绪队列长度达到6,7。说明确实是因为这个问题。
4、pidstat -wt t这个参数是打印的线程的cswch和nvcswch,自愿上下文切换,非自愿上下文切换都很高。
/proc是linux的一个虚拟文件系统,负责用户空间与系统空间的通讯。
中断查看/proc/interrupts
mpstat可以查看每个CPU的情况
pidstat -u 和-w不同,-u和mpstat输出一样,CPU的使用情况,-w是用输出上下文和中断次数。
uptime 系统平均负载,1分钟,5分钟,15分钟
平均负载,是一段时间内,系统处于可运行状态和不可中断状态的平均进程数。
来源:CSDN
作者:技术老虎Tiger
链接:https://blog.csdn.net/li2572889641/article/details/86702665