一、原因总结
等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就导致负载过大,但cpu使用率低。
二、场景分析
(1)磁盘读写请求过多就会导致大量I/O等待
cpu的工作效率要高于磁盘,而进程在cpu上面运行需要访问磁盘文件,这个时候cpu会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,cpu低的情况。
(2)MySQL中存在没有索引的语句或存在死锁
MySQL的数据是存储在硬盘中,如果需进行sql查询,要先把数据从磁盘加载到内存中。当在数据特别大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。
(3)外接硬盘故障,常见有挂载了NFS,但是NFS Server故障
假如系统挂载了外接硬盘,如NFS共享存储,经常会有大量的读写请求去访问NFS存储的文件,如果这个时候NFS Server故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。
备注:只有运行状态(running)和不可中断状态(uninterruptible)才会被加入负载。