负载高问题排查


1、常用命令

1. 查看物理 CPU 数目

[root@yingxiaoyun ~]# cat /proc/cpuinfo | grep "physical id"
physical id : 0

2. 查看每个物理 CPU 中的 core 的个数(即核数)

[root@yingxiaoyun ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 2

3. 查看逻辑 CPU 数目

[root@yingxiaoyun ~]# cat /proc/cpuinfo| grep "processor"| wc -l
4

4. 如果不想自己算,也可以直接 lscpu

[root@yingxiaoyun ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1

5. 检查硬盘是否为 SSD

[root@k3sDB opt]# cat /sys/block/sda/queue/rotational
1
[root@k3sDB opt]# cat /sys/block/sdb/queue/rotational
1
0为SSD

6. 查看 SN 号

decode -t system | grep Serial

7. 是否物理机

dmidecode -s system-product-name

8. uuid

blkid

2、CPU 高、Load 高

Load 就是对计算机干活多少的度量,Load Average 就是一段时间( 1 分钟、5 分钟、15 分钟 )内平均 Load
linux 服务器出现高负载的情况下,一般都有一些具体的症状,比如 cpu、内存等被耗尽,磁盘 IO 或者网络等出现问题,下面通过具体命令去分析解决高负载的问题

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

通过 P 键,可以对 CPU 使用率进行倒序排列,方便定位系统中占用 CPU 较高的进程
通过 M 键,您可以对系统内存使用情况进行排序。如果有多核 CPU,数字键1可以显示每核 CPU 的负载状况
进而定位系统中占用 CPU 较高的进程
执行 ll /proc/PID/exe 命令,可以查看每个进程 ID 对应的程序文件
最后,根据系统日志和程序自身相关日志,对相应进程做进一步排查分析,以判断其占用过高 CPU 的原因

2.如果遇到 CPU 使用率高达 100% 等异常情况,且无法通过 top、htop 等命令查询到消耗 CPU 资源的具体进程,该问题可能是病毒导致

执行如下命令,查看当前 Linux 系统命令最近是否被修改过
stat /usr/bin/top
分别执行如下命令,查看 ps 或 top 命令是否被修改过
rpm -Vf /bin/ps
rpm -Vf /usr/bin/top
正常情况下,系统无返回修改信息
执行如下命令,查看当前实例是否连接到异常域名
综合以上表现,top、ps 命令被修改,并且连接到异常域名,判断您的 ECS 实例已被病毒入侵

3. 线程检查

// 对每个进程的线程数进行了统计
ps -eLf|awk '{print $2}'|sort -n|uniq -c

关于 java 服务

  1. top 得到哪个进程占 cpu 高--拿到 pid
  2. top -Hp PID 查找占用 CPU 最高的线程 TID
  3. 查看问题线程
    pstack 进程号pid | grep 线程号(线程号需要由十进制转换成十六进制) 定位问题所在
  4. https://www.cnblogs.com/heyanan/p/9261695.html
  5. 调优
    jstat -gc pid 3000
    使用 jstack 打印线程堆栈信息(可联系业务进行排查定位)
    通过 printf %x tid 打印出最消耗 CPU 线程的十六进制;
    在堆栈信息中查看该线程的堆栈信息;
    // gc
    jstat -gc “进程PID” 2000 5
    // 占比
    jstat -gcutil “进程PID” 5000
    // 排序
    jmap -histo “进程PID”

jstack -l “进程PID” >/tmp/log.txt
jstack “进程PID” | grep -A 10 12

jinfo “进程PID”
// 取dump文件
jmap -dump:format=b file=hprof 进程PID
jmap -histo:live 进程PID >> a.txt

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

通过 vmstat 命令实时查看虚拟内存 swpd、cache 等使用情况,一般系统高负载的情况下 cache 可能会被耗尽
格式:vmstat -n 1 表示结果一秒刷新一次
[root@k8s-10 ~]# 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 1 0 2798000 2076 6375040 0 0 10 76 10 49 6 2 91 1 0
0 0 0 2798232 2076 6375128 0 0 0 207 7965 12525 7 2 90 2 0
返回结果中的主要数据列说明:
r: 表示系统中 CPU 等待处理的线程。由于 CPU 每次只能处理一个线程,所以,该数值越大,通常表示系统运行越慢。
b: 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
us: 用户 CPUtop 接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy: 系统 CPU 时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id: 处于空闲状态的 CPU 时间百分比。如果该值持续为 0,同时 sy 是 us 的两倍,则通常说明系统则面临着 CPU 资源的短缺。
wa: IO 等待消耗的 CPU 时间百分比。该值较高时,说明 IO 等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。
常见问题及解决方法:
如果r经常大于4,且id经常少于40,表示cpu的负荷很重。
如果si,so长期不等于0,表示内存不足。
如果 disk 经常不等于0,且在b中的队列大于3,表示io性能不好

3、 CPU 低、Load 高

load average 是对 CPU 负载的评估,其值越高,说明其任务队列越长,处于等待执行的任务越多
出现此种情况时,可能是由于僵死进程导致的。可以通过指令 ps -axjf 查看是否存在 D 状态进程
D 状态是指不可中断的睡眠状态。该状态的进程无法被 kill,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决

1.查看磁盘 IO 情况

通过如下命令查找具体占用 IO 的进程;

  1. iotop 命令实时监测磁盘 IO 使用情况,系统高负载一般也有可能是大量的小文件的读写引起的
    yum install -y iotop
    iotop -k -n 5 -d 3
    说明
    -b:记录到日志
    -k:以KB为单位显示
    -n:统计次数
    -d:统计时间间隔

  2. iostat是一款Linux系统中监控 I/O 性能的工具,可以从系统纬度查看磁盘 I/O 负载情况
    yum install sysstat
    iostat -d -k 3 5
    说明
    -d:显示磁盘的使用情况
    -k:以KB为单位显示
    3:统计时间间隔
    5:统计次数
    iostat -d -x -k 1 3
    Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    sda 0.00 0.01 0.01 0.18 0.51 5.67 63.93 0.01 37.37 13.28 38.49 6.54 0.13
    dm-0 0.00 0.00 0.01 0.19 0.50 5.67 61.08 0.01 38.35 13.60 39.41 6.30 0.13
    %util较大 说明磁盘瓶颈
    await大于svctm (每次IO服务时间)差值越小越好
    avgqu-sz 平均等待处理的IO请求队列长度

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

ps -eo state,pid,cmd | grep "^D"
// 查找占用 IO 的程序
ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

2.通过 sar -n DEV 1 10 查看网络 IO 情况

yum install -y sysstat
/etc/init.d/sysstat start
sar 命令的参数说明如下,区分大小写
-A:汇总所有的报告
-a:报告文件读写使用情况
-B:报告附加缓存的使用情况
-b:报告缓存的使用情况
-c:报告系统调用的使用情况
-d:报告磁盘的使用情况
-g:报告串口的使用情况
-h:报告关于buffer使用的统计数据
-m:报告IPC消息队列和信号量的使用情况
-n:报告命名cache的使用情况
-p:报告调页活动的使用情况
-q:报告运行队列和交换队列的平均长度
-R:报告进程的活动情况
-r:报告没有使用的内存页面和硬盘块
-u:报告CPU的利用率
-v:报告进程、i节点、文件和锁表状态
-w:报告系统交换活动状况
-y:报告TTY设备活动状况

  1. 查看 CPU 负载
    sar -u 1 5 #每隔一秒刷新,刷新5次
    Linux 3.10.0-123.9.3.el7.x8664 (iZ23pddtofdZ) 07/04/2016 _x86_64 (1 CPU)
    10:16:35 AM CPU %user %nice %system %iowait %steal %idle
    10:16:36 AM all 14.14 0.00 1.01 0.00 0.00 84.85
    显示结果主要字段说明
    %user:用户模式下消耗的CPU时间比例
    %nice:通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间比例
    %system:系统模式下消耗的CPU时间比例
    %iowait:CPU等待磁盘I/O导致空闲状态消耗的时间比例
    %steal:利用Xen等操作系统虚拟化技术,等待其它虚拟CPU计算占用的时间比例
    %idle:CPU空闲时间百分比

  2. 查看队列长度和 CPU 平均负载
    sar -q 1 10 #每隔一秒刷新,刷新10次
    sar -q 1 6Linux 3.10.0-123.9.3.el7.x8664 (iZ23pddtofdZ) 07/04/2016 _x86_64 (1 CPU)
    10:23:13 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
    10:23:14 AM 0 142 0.00 0.01 0.05 0
    10:23:15 AM 0 142 0.00 0.01 0.05 0
    显示结果主要字段说明
    runq-sz:运行队列的长度,即等待运行的进程数。
    plist-sz:进程列表中进程(processes)和线程(threads)的数量。
    ldavg-1:最后1分钟的系统平均负载。
    ldavg-5:最后5分钟的系统平均负载。
    ldavg-15:最后15分钟的系统平均负载。

  3. 查看磁盘读写负载情况
    sar -d 1 3 #每隔一秒刷新,刷新3次
    Linux 3.10.0-123.9.3.el7.x8664 (iZ23pddtofdZ) 07/04/2016 _x86_64 (1 CPU)
    10:27:34 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
    10:27:35 AM 275992 740664 72.85 181552 315340 362052 35.61 471216 115828 60
    10:27:36 AM 276024 740632 72.85 181552 315340 362052 35.61 471220 115828 64
    显示结果主要字段说明
    kbmemfree:该值和free命令中的free值基本一致,不包括buffer和cache空间。
    kbmemused:该值和free命令中的used值基本一致,包括buffer和cache空间。
    %memused:物理内存使用率,该值是kbmemused和内存总量(不包括swap内存)的百分比。
    kbbuffers和kbcached:这两个值和free命令中的buffer和cache一致。
    kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存,即RAM加上swap的内存。
    %commit:该值是kbcommit与内存总量(包括swap内存)的百分比

  4. 查看内存负载
    sar -r 1 3 #每隔一秒刷新,刷新3次
    Linux 5.10.134-13.al8.x86_64 (iZ2zegjvrdtgifd77gadyqZ) 03/09/2023 x86_64 (8 CPU)
    02:41:04 PM DEV tps rkB/s wkB/s areq-sz aqu-sz await svctm %util
    02:41:05 PM dev253-0 1.00 0.00 4.00 4.00 0.00 0.00 1.00 0.10
    02:41:06 PM dev253-0 1.00 0.00 4.00 4.00 0.00 1.00 1.00 0.10
    显示结果主要字段说明
    tps:每秒I/O的传输总数
    rd_sec/s:每秒读取的扇区的次数。
    wr_sec/s:每秒写入的扇区的次数。
    avgrq-sz:平均每次磁盘I/O操作的扇区大小扇区。
    avgqu-sz:磁盘请求队列的平均长度。
    await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间。
    svctm:系统处理每次请求的平均时间。
    %util:I/O请求占用的CPU百分比,值越高,说明I/O越慢。

  5. 查看 I/O 负载
    sar -b 1 10 #每隔一秒刷新,刷新10次
    Linux 5.10.134-13.al8.x86_64 (iZ2zegjvrdtgifd77gadyqZ) 03/09/2023 x86_64 (8 CPU)
    02:34:00 PM tps rtps wtps bread/s bwrtn/s
    02:34:01 PM 6.00 0.00 6.00 0.00 80.00
    02:34:02 PM 55.00 0.00 55.00 0.00 632.00
    显示结果主要字段说明
    tps:每秒钟向物理设备请求数据次数。
    rtps:每秒钟从向物理设备读请求次数。
    %util:表示一秒中有百分之几的时间用于I/O操作的时间百分比。
    wtps:每秒钟向物理设备写请求次数。
    bread/s:每秒钟从物理设备读入的数据量。
    bwrtn/s:每秒钟向物理设备写入的数据量。

  6. 查看 swap 分区页面交换情况
    sar -W 1 3
    系统显示类似如下。
    Linux 3.10.0-123.9.3.el7.x8664 (iZ23pddtofdZ) 07/04/2016 _x86_64 (1 CPU)
    10:28:59 AM pswpin/s pswpout/s
    10:29:00 AM 0.00 0.00
    10:29:01 AM 0.00 0.00
    显示结果主要字段说明
    pswpin/s:每秒从交换分区到系统的交换页面(swap page)数量。
    pswpout/s:每秒从系统交换到swap的交换页面(swap page)的数量。

  7. 使用 sar 来监控查看网络流量
    sar -n DEV [interval] [count]
    [interval]表示统计间隔,[count]表示统计次数。
    -n 这个参数很有用,他有6个不同的开关
    DEV 显示网络接口信息
    EDEV 显示关于网络错误的统计数据
    NFS 统计活动的NFS客户端的信息
    NFSD 统计NFS服务器的信息
    SOCK 显示套 接字信息
    ALL 显示所有5个开关,它们可以单独或者一起使
    sar -n DEV 1 5
    显示结果主要字段说明
    IFACE:网络接口名称。
    rxpck/s、txpck/s:每秒接收或发送的数据包数量。
    rxkB/s、txkB/s:每秒接收或发送的字节数,以kB/s为单位。
    rxcmp/s、txcmp/s:每秒接收或发送的压缩过的数据包数量。
    rxmcst/s:每秒接收到的多播数据包

3.iftop 是 Linux 系统中一个免费的网卡实时流量监控工具,可以监控包括指定网卡的实时流量、端口连接信息、反向解析 IP 等信息

iftop [-i interface]
yum install iftop -y
iftop -i eth0 -P
-P参数会显示请求端口

查看端口对应的进程
netstat -tunlp |grep [$Port]
确认对应服务后,您可以通过停止服务或使用iptables服务来对指定地址进行处理。
例如屏蔽IP地址或限速,以保证服务器带宽能够正常使用

显示结果主要字段说明
第①部分:带宽使用情况。
第②部分:外部连接列表,即记录了哪些IP正在和本机的网络连接。
右侧部分是实时流量信息,分别是该访问IP连接到本机2秒、10秒和40秒的平均流量。
=>表示发送数据,<=表示接收数据。
第③部分。
第一列:TX表示发送流量,RX表示接收流量,TOTAL表示总流量。
第二列cum:表示第一列各种情况的总流量。
第三列peak:表示第一列各种情况的流量峰值。
第四列rates:表示第一列各种情况2秒、10秒、40秒内的平均流量。

进入 iftop 界面后,可以通过按下相应的字母快捷按键,来对显示结果进行调整

h:切换是否显示帮助
n:切换显示本机的IP或主机名
s:切换是否显示本机的host信息
d:切换是否显示远端目标主机的host信息
t:切换显示格式为2行、1行、只显示发送流量或只显示接收流量
N:切换显示端口号或端口服务名称
S:切换是否显示本机的端口信息
D:切换是否显示远端目标主机的端口信息
p:切换是否显示端口信息
P:切换暂停或继续显示
b:切换是否显示平均流量图形条
B:切换计算2秒或10秒或40秒内的平均流量
T:切换是否显示每个连接的总流量
l:打开屏幕过滤功能,输入要过滤的字符。比如输入相应IP地址,回车后,屏幕就只显示这个IP相关的流量信息
L:切换显示画面上边的刻度,刻度不同,流量图形条会有变化
j或k:向上或向下滚动屏幕显示的连接记录
1或2或3:根据右侧显示的三列流量数据进行排序
<:根据左边的本机名或IP排序
>:根据远端目标主机的主机名或IP排序
o:切换是否固定只显示当前的连接
f:编辑过滤代码
!:调用Shell命令
q:退出

4.Nethogs 是一款开源的网络流量监控工具,可用于显示每个进程的带宽占用情况

nethogs [-i interface]
yum install nethogs -y
nethogs eth1
nethogs 默认的监控间隔是 1 秒,您可以通过 -d 参数来设定监控间隔。例如执行如下 nethogs eth1 -d 5 命令,设定监控间隔为 5 秒
若确定进程是恶意程序,可以通过执行如下命令,终止进程
kill -TERM [$Port1]
说明 如果是 Web 服务程序,您可以使用 iftop 等工具来查询具体 IP 来源,然后分析 Web 访问日志是否为正常流量。日志分析可以使用 logwatch 或 awstats 等工具进行

在 nethogs 监控界面,按 s 可以按照 Sent 列进行排序,按 r 可以按照 Received 列进行排序,按 m 可以切换不同的统计单位显示,例如 kb/s、kb、b、mb 监控界面信息说明如下所示
PID 列表示相应流量关联程序的进程号
USER 列表示相应进程的所属用户
PROGRAM 列表示程序的具体执行路径
DEV 列当前监控的网络接口名称
Sent 列表示相应进程已经发送的数据流量
Received 列表示程序已经接收的数据流量

参考文献:

https://help.aliyun.com/document_detail/41225.html?spm=a2c4g.52871.0.0.1100375dXQkptC
https://www.cnblogs.com/liuyupen/p/13905967.html

             ------------------------------- THE END -------------------------------

posted @ 2025-02-10 14:19  ordinaryRoadX  阅读(6)  评论(0编辑  收藏  举报