<返回更多

Linux 常见异常分析,请收好这份排查指南

2022-11-09    LinkSLA智能运维管家
加入收藏

1 常用的 Load 分析方法

CPU高、Load高

  1. 通过 top 命令查找占用CPU最高的进程PID;
  2. 通过top -Hp PID查找占用CPU最高的线程TID;
  3. 对于JAVA程序,使用jstack打印线程堆栈信息;
  4. 通过printf %x tid打印出最消耗CPU线程的十六进制;

CPU低、Load高

产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是CPU运行的进程却很少,这样就体现到负载过大了,cpu使用率低。

ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

2 CPU高、Load高情况分析

2.1 使用 vmstat 查看系统纬度的 CPU 负载

可以通过 vmstat 从系统维度查看 CPU 资源的使用情况

格式:vmstat -n 1 -n 1 表示结果一秒刷新一次

[root@VM-1-14-centos ~]# vmstat -n 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 1  0      0 250304 163472 2154300    0    0     1    16    0    4  1  0 98  0  0

 0  0      0 250412 163472 2154332    0    0     0     0  937 1439  1  1 99  0  0

 0  0      0 250428 163472 2154332    0    0     0     4  980 1329  0  0 100  0  0

 0  0      0 250444 163472 2154332    0    0     0     0  854 1227  0  0 99  0  0

 0  0      0 250444 163472 2154332    0    0     0    68  832 1284  0  1 99  1  0

 0  0      0 250016 163472 2154332    0    0     0     0  929 1389  1  1 99  0  0

返回结果中的主要数据列说明:

常见问题及解决方法:

2.2 使用 top 查看进程纬度的 CPU 负载

可以通过 top 从进程纬度来查看其 CPU、内存等资源的使用情况。

top - 19:49:59 up 36 days, 23:15,  3 users,  load average: 0.11, 0.04, 0.05

Tasks: 133 total,   1 running, 131 sleeping,   0 stopped,   1 zombie

%Cpu(s):  3.1 us,  3.1 sy,  0.0 ni, 93.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

KiB Mem :  3880188 total,   241648 free,  1320424 used,  2318116 buff/cache

KiB Swap:        0 total,        0 free,        0 used.  2209356 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                               

 1793 MySQL     20   0 1608796 236708   9840 S   6.7  6.1  83:36.23 /usr/sbin/mysqld                                    

    1 root      20   0  125636   3920   2444 S   0.0  0.1   4:34.13 /usr/lib/systemd/systemd                                 

    2 root      20   0       0      0      0 S   0.0  0.0   0:00.90 [kthreadd]                                                                                            

    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0H]                                                                                        

    6 root      20   0       0      0      0 S   0.0  0.0   0:15.46 [ksoftirqd/0]                                                                                         

    7 root      rt   0       0      0      0 S   0.0  0.0   0:12.02 [migration/0]

默认界面上第三行会显示当前 CPU 资源的总体使用情况,下方会显示各个进程的资源占用情况。

可以直接在界面输入大小字母 P,来使监控结果按 CPU 使用率倒序排列,进而定位系统中占用 CPU 较高的进程。最后,根据系统日志和程序自身相关日志,对相应进程做进一步排查分析,以判断其占用过高 CPU 的原因。

3 CPU低、Load高

问题描述

linux 系统没有业务程序运行,通过 top 观察,类似如下图所示,CPU 很空闲,但是 load average 却非常高:

问题分析

CPU低而负载高也就是说等待磁盘I/O完成的进程过多,就会导致队列长度过大,这样就体现到负载过大了,但实际是此时CPU被分配去执行别的任务或空闲,具体场景有如下几种:

场景一:磁盘读写请求过多就会导致大量I/O等待

上面说过,cpu的工作效率要高于磁盘,而进程在cpu上面运行需要访问磁盘文件,这个时候cpu会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,cpu低的情况。

场景二:MySQL中存在没有索引的语句或存在死锁等情况

我们都知道MySQL的数据是存储在硬盘中,如果需要进行sql查询,需要先把数据从磁盘加载到内存中。当在数据特别大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。具体解决方法可以在MySQL中运行show full processlist命令查看线程等待情况,把其中的语句拿出来进行优化。

场景三:外接硬盘故障,常见有挂了NFS,但是NFS server故障

比如我们的系统挂载了外接硬盘如NFS共享存储,经常会有大量的读写请求去访问NFS存储的文件,如果这个时候NFS Server故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。

处理办法

等待 I/O 的进程通过处于 uninterruptible sleep 或 D 状态;通过给出这些信息我们就可以简单的查找出处在wait状态的进程。

ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

作者:Honest1y
来源:https://juejin.cn/post/7016127914454286367

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>