负载总结为一句话就是:需要运行处置惩罚但又必须等待队列前的进程处置惩罚完成的进程个数。具体来说,也就是如下两种情况:
等待被授权予 CPU 运行权限的进程、等待磁盘 I/O 完成的进程。
CPU 低而负载高也就是说等待磁盘 I/O 完成的进程过多,就会导致队列长度过大,如许就体现到负载过大了,但实际是此时 CPU 被分配去执行别的使命或空闲,具体场景有如下几种:
数据库抖动,造成线程队列 hang 住,负载升高
磁盘读写请求过多就会导致大量 I/O 等待。CPU 的工作效率要高于磁盘,而进程在 CPU 上面运行需要访问磁盘文件,这个时间 CPU 会向内核发起调用文件的请求,让内核去磁盘取文件,这个时间会切换到其他进程或者空闲,这个使命就会转换为不可停止睡眠状态。当这种读写请求过多就会导致不可停止睡眠状态的进程过多,从而导致负载高,CPU 低的情况。
外接硬盘故障,常见有挂了 NFS,但是 NFS server 故障好比系统挂载了外接硬盘如 NFS 共享存储,经常会有大量的读写请求去访问 NFS 存储的文件,假如这个时间 NFS Server 故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可停止状态,造成负载很高。
五、监控发现线上机器内存占用率居高不下,怎样分析进行优化?
使用top -p pid针对所要查的 pid 查看该进程的 CPU 和内存以及负载情况。
jmap -histo:live [pid],然后分析具体的对象数目和占用内存巨细,从而定位代码。
jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用 MAT 工具分析是否存在内存泄漏等等。