linux 系统观测工具是问题排查的有效手段, 有必要把排查工具整理下

系统整体监控

top

top 能整体查看系统运行情况工具。利用top,能够观察到cpu,内存的运行情况,过滤出cpu 内存占用高的进程

%Cpu,可以看出cpu各种操作的时间占比。

  1. us(用户态进程执行),
  2. sy(内核进程执行),
  3. ni(nice低优先级执行),
  4. id(idle, cpu空闲时间占比),
  5. wa(wait, 等待时间占比, 如果时间段在执行io且cpu空闲,则这段空闲cpu时间认为是wait),
  6. hi(hard interrupt), 硬中断执行时间
  7. si(soft interrupt), 操作系统软中断执行时间
  8. st(Steal Time), 分配给虚拟机的时间片
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    top - 16:16:56 up 16:55,  0 users,  load average: 2.01, 1.83, 1.48
    Tasks: 340 total, 1 running, 338 sleeping, 1 stopped, 0 zombie
    %Cpu(s): 1.3 us, 0.3 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    MiB Mem : 7902.0 total, 2180.4 free, 2668.4 used, 3053.2 buff/cache
    MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4924.6 avail Mem
    scroll coordinates: y = 1/340 (tasks), x = 1/12 (fields)
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    172367 root 20 0 31.3g 171008 54448 S 1.0 2.1 0:56.97 node
    1832 root 20 0 11.4g 76164 43988 S 0.7 0.9 7:02.08 node
    171284 root 20 0 13884 8968 7412 S 0.7 0.1 0:06.62 sshd
    14 root 20 0 0 0 0 I 0.3 0.0 5:13.07 rcu_sched
    1774 root 20 0 11.3g 128480 46240 S 0.3 1.6 9:43.66 node

top 命令点击大写P、M实现按照cpu/mem 排序的进程,点击数字键1 可以看到每个cpu的占用。

iostat

iostat是监控磁盘性能的工具。如果top发现cpu慢在wa,可以使用iostat看具体盘有无问题。命令iostat -x 1 2

1
2
3
4
5
6
7
8
9
10
11
12
13
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
1.69 0.01 1.05 0.02 0.00 97.23

Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %util
loop0 0.00 0.00 0.00 0.00 0.29 1.21 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

r/s w/s 每秒读和写的请求数量(qos)
rrqm/s wrqm/s 每秒合并的读写请求数量
rkB/s wkB/s 每秒读写的字节数(吞吐)
r_await w_await 读写操作io平均等待时间
avgrq-sz:每个IO的平均扇区数,一个扇区512字节
await:平均每个IO所需要的时间,
%util 磁盘的利用率

磁盘利用率表示io时间占cpu总时间的比例, 表示cpu处理空闲阶段且存在io操作,这段cpu时间片就认为是iowait消耗的

网络信息

ifconfig 能输出 网卡、ip地址、网络传输等基本信息

1
2
3
4
5
6
7
8
9
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 192.168.92.128 netmask 255.255.255.0 broadcast 192.168.92.255
inet6 fe80::20c:29ff:fe51:9544 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:51:95:44 txqueuelen 1000 (Ethernet)
RX packets 695151 bytes 132025574 (132.0 MB)
RX errors 183 dropped 206 overruns 0 frame 0
TX packets 863078 bytes 357598696 (357.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 19 base 0x2000

netstat -nultp 查看pid和监听的端口信息

1
2
3
4
5
6
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp 0 0 127.0.0.1:39997 0.0.0.0:* LISTEN 171361/code-fabdb6a
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 130592/systemd-reso
tcp 0 0 127.0.0.1:44791 0.0.0.0:* LISTEN 172327/code-fabdb6a
tcp 0 0 127.0.0.1:32819 0.0.0.0:* LISTEN 169497/code-fabdb6a
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2793/cupsd

netstat -r 显示路由表

ss(socket statistics)是一个比 netstat 更快速和功能更强大的工具。

ss -t显示tcp连接数量

1
2
3
State               Recv-Q               Send-Q                                Local Address:Port                                Peer Address:Port                Process               
ESTAB 0 0 127.0.0.1:41999 127.0.0.1:52880
ESTAB 0 0 192.168.92.128:ssh 192.168.92.1:55778

ping和curl 查看网络和端口的连通性

网络流量统计

使用iftop 统计网卡实时流量
iftop -i 指定网卡

1
2
3
TX:             cum:   12.4KB   peak:   11.9Kb                                                                                                          rates:   9.09Kb  9.89Kb  9.89Kb
RX: 8.64KB 8.17Kb 8.17Kb 6.91Kb 6.91Kb
TOTAL: 21.0KB 18.3Kb 17.3Kb 16.8Kb 16.8Kb

vnStat 可用来统计过去时间段的流量信息

sar工具

sar (System Activity Report) 是 Linux 系统中的一个性能监控工具,可以用来统计cpu, 内存, io, 网络等

sar -u 1 5 统计cpu 信息

1
2
3
4
5
6
7
Linux 5.15.0-127-generic (larry-latop-ubuntu)   2025年01月04日  _x86_64_        (8 CPU)

17时00分04秒 CPU %user %nice %system %iowait %steal %idle
17时00分05秒 all 4.96 0.00 2.01 0.00 0.00 93.03
17时00分06秒 all 0.13 0.00 1.00 0.00 0.00 98.87
17时00分07秒 all 0.00 0.00 0.76 0.13 0.00 99.12
17时00分08秒 all 0.00 0.00 0.13 0.00 0.00 99.87

sar -hr 1 5 显示内存信息

1
2
3
4
17时01分34秒 kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
17时01分35秒 2.0G 4.8G 2.5G 32.6% 438.8M 2.2G 4.9G 50.6% 1.5G 3.3G 28.0k
17时01分36秒 2.0G 4.8G 2.5G 32.6% 438.8M 2.2G 4.9G 50.6% 1.5G 3.3G 72.0k
17时01分37秒 2.0G 4.8G 2.5G 32.6% 438.8M 2.2G 4.9G 50.6% 1.5G 3.3G 72.0k

查看磁盘统计, 统计每个磁盘的iops, 读写吞吐, wait, 使用率
tps Transactions Per Second, 每秒io数量

1
2
3
4
Average:          DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
Average: dev7-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev7-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev7-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sar -n DEV 1 5 统计网络流量

rxkB/s:每秒接收的数据量(KB)。
txkB/s:每秒发送的数据量(KB)。
%ifutil 网络接口利用率

1
2
3
4
17时03分27秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
17时03分28秒 lo 34.00 34.00 3.79 3.79 0.00 0.00 0.00 0.00
17时03分28秒 ens33 15.00 15.00 1.67 2.79 0.00 0.00 0.00 0.37
17时03分28秒 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sar -q 1 5 查看系统负载(进程)信息

runq-sz:运行队列的长度。
plist-sz:当前进程的数量。
ldavg-1、ldavg-5、ldavg-15:系统在 1、5 和 15 分钟的平均负载。

1
2
3
4
5
17时04分40秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
17时04分41秒 1 787 0.21 0.13 0.40 0
17时04分42秒 1 788 0.21 0.13 0.40 0
17时04分43秒 0 785 0.21 0.13 0.40 0
17时04分44秒 1 804 0.21 0.13 0.40 0

进程监控

查看运行进程的信息

ps -ef | grep, ps aux |grep 获得进程的pid, 状态等信息

/proc/{pid} 目录可以看到进程相关资源信息。例如

/proc/{pid}/fd 查看打开的文件信息

1
2
3
4
5
6
7
8
root@larry-latop-ubuntu:/proc/812# ll /proc/812/fd/
total 0
dr-x------ 2 root root 0 1月 3 23:22 ./
dr-xr-xr-x 9 messagebus messagebus 0 1月 3 23:22 ../
lrwx------ 1 root root 64 1月 3 23:22 0 -> /dev/null
lrwx------ 1 root root 64 1月 3 23:22 1 -> 'socket:[39683]'
lrwx------ 1 root root 64 1月 3 23:22 10 -> 'socket:[269352]'
lrwx------ 1 root root 64 1月 3 23:22 11 -> 'socket:[36858]'

/proc/{pid}/cgroup,查看cgroup信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
13:hugetlb:/
12:perf_event:/
11:blkio:/system.slice/dbus.service
10:memory:/system.slice/dbus.service
9:rdma:/
8:pids:/system.slice/dbus.service
7:freezer:/
6:cpu,cpuacct:/system.slice/dbus.service
5:cpuset:/
4:misc:/
3:devices:/system.slice/dbus.service
2:net_cls,net_prio:/
1:name=systemd:/system.slice/dbus.service
0::/system.slice/dbus.service

性能排查

pstack, strace, perf等

日志监控

对异常执行流,在程序里打印error日志。通过错误日志查看程序执行的问题。

TODO