面试题之CPU飚高原因
得物软开实习 二面
一、问题
你有没有遇到过CPU飚高的情况,一般CPU使用率多少属于正常,高了怎么处理?
我:实验室服务器配置比较高,一般没遇到过,-_-!!!
考查:CPU执行与线程切换等
注:能力有限,一下为一些不太全面的总结
二、CPU飚高
1、CPU使用率一般多少正常
CPU是整个计算机的核心计算资源,对于一个服务来说,在计算机上的体现是一个进程,一个进程可以开启多个线程,而CPU的最小执行单元是线程。
CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比,用公式来表示就是:
因此CPU使用率可以表示某个时间点机器上程序的运行情况。通常CPU使用率在0-75%是正常,如果经常在90%以上,则说明CPU使用率过高,可能有问题存在。
现在操作系统都是基于多任务分时设计的,也就是机器上运行多个程序,正常情况下,某一个线程执行一定时间之后操作系统就会调度将CPU切换到其他线程,因此CPU使用率过高,最直接的原因可能就是创建线程过多或者某一个线程对应的程序设计有问题,导致CPU一直处于调度状态或者一直被某一个线程占用。
最明显的体现就是,计算机开机的时候,如果自启动项过多,就会短时间内CPU使用率飚高,这个时候如果自己再去开启其他应用程序,就会出现无响应或者响应慢的情况。
2、具体原因
导致CPU飚高的原因
(1)、线程过多
创建线程过多导致CPU上下文切换频繁,对于CPU来说,同一时刻下每个CPU核心只能运行一个线程,如果有多个线程要执行,CPU只能通过上下文切换的方式来执行不同的线程。上下文切换需要做两个事情
- 保存当前运行线程的执行状态
- 让处于等待状态的线程来执行
这两个过程需要CPU执行内核相关指令实现状态保存到响应的寄存器和存储器,如果较多的上下文切换会频繁的占据CPU而占用资源,无法去执行用户进程中的指令,导致实际的用户进程的响应速度下降。
(2)、代码逻辑问题
如果线程出现死循环等情况无法退出,也会一直占用CPU资源无法释放,(但是现在一般程序都有抢占式调度?某一个线程占用一定时间CPU或者内存达到某一定阈值就会出现抢占式调度。)
3、尝试解决方案
这两个问题导致的CPU利用率较高,通过top命令,定位到CPU利用率比较高的进程,然后shift+h找到CPU比较高的线程,两种情况。
- CPU利用率过高的一直是同一个线程,说明程序存在线程长期没有释放CPU的情况,
- CPU利用率过高的线程ID不断变化,说明线程创建过多
也可能是定位之后发现线程对应的代码正确,CPU只是在飚高的某些时刻,用户访问量较大,导致资源不够。
posted on 2022-05-28 11:15 weilanhanf 阅读(1063) 评论(0) 编辑 收藏 举报