性能优化-CPU上下文

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分钟

平均负载,是一段时间内,系统处于可运行状态和不可中断状态的平均进程数。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章