Linux性能分析
性能分析工具sar⌗
安装sysstat
⌗
apt install sysstat
修改/etc/default/sysstat
文件,将ENABLE="false"
改为ENABLE="true"
重启服务
service sysstat restart
使用⌗
基本命令格式
sar [option] [-o filename] [-f filename] [interval 刷新间隔] [count 刷新次数]
其中 options
-u
CPU-r
内存-W
交换分区
查看CPU
sar -u 2
输出
Linux 5.13.0-30-generic (shen-Lenovo-G50-80m) 2022年03月09日 _x86_64_ (4 CPU)
19时48分36秒 CPU %user %nice %system %iowait %steal %idle
19时48分38秒 all 2.92 0.00 2.16 0.00 0.00 94.92
...
查看内存
sar -r 1
输出
Linux 5.13.0-30-generic (shen-Lenovo-G50-80m) 2022年03月09日 _x86_64_ (4 CPU)
19时54分56秒 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
19时54分57秒 375872 1046392 2003244 50.95 78096 1306504 12202124 152.63 961808 2086436 240
常用命令
sar -n DEV 1
sar -n TCP,ETCP 1
top⌗
输出
top - 00:21:24 up 10:28, 1 user, load average: 0.72, 0.90, 0.84
Tasks: 266 total, 1 running, 264 sleeping, 0 stopped, 1 zombie
%Cpu(s): 2.4 us, 1.6 sy, 0.0 ni, 94.1 id, 1.8 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 3839.4 total, 176.3 free, 1925.7 used, 1737.4 buff/cache
MiB Swap: 3968.0 total, 3278.1 free, 689.9 used. 1021.3 avail Mem
PID PPID UID USER RUSER TTY TIME+ %CPU %MEM S COMMAND
634 1 102 systemd+ systemd+ ? 0:00.15 0.0 0.1 S /lib/systemd/systemd-+
第1行:当前时间,系统运行时间,登录用户数,平均负载
第2行:总进程数,各状态的进程数量
第3行:CPU使用时间百分比,分别是us未改变过nice值的用户进程,sy内核进程,ni改变过nice值的用户进程,id空闲,wa等待I/O,hi硬件中断,si软件中断,st虚拟机偷掉的时间
第4行:物理内存信息,分别是total内存总量,空闲内存总量,被使用的内存,用于buffer/cache的内存
第5行:交换分区,分别是total交换分区总量,free空闲的交换分区,used被使用的交换分区,avail可用于下一次分配的物理内存数量
快捷键⌗
h
帮助
W
保存配置
H
切换为线程/进程模式,tasks
会变为threads
,第二行会变为以下格式:
Threads: 967 total, 1 running, 965 sleeping, 0 stopped, 1 zombie
非交互式运行top
,可以重定向到文件
top -b -n 1 > processes.txt
top -bH -n 1 > threads.txt
uptime⌗
命令
uptime
输出
21:54:24 up 8:01, 1 user, load average: 1.22, 1.12, 0.81
重点关注和top
命令相同的load average
平均负载。
-
三个数字分别表示过去1分钟、5分钟、15分钟的负载。
-
当一个CPU核心完全空闲的时候,平均负荷为0;当一个CPU核心工作量饱和的时候,平均负荷为1。
-
如果三个数字是递减的,说明系统的负载正在上升。
dmesg⌗
查看最近的系统消息日志
最简单的命令:
dmesg | tail
输出:
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.
诸如OOM、TCP请求丢弃等错误会记录在其中。
vmstat⌗
虚拟内存统计,有多种模式,除了内存信息还提供CPU和I/O等信息
命令:
vmstat 1
输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 587356 517540 82352 1442388 4 29 113 117 1092 452 17 5 76 2 0
0 0 587356 522660 82352 1435736 0 0 0 0 675 914 1 1 98 0 0
0 0 587356 522704 82352 1435540 0 0 0 0 805 1047 1 1 99 0 0
mpstat⌗
mpstat -P ALL 1
输出
Linux 5.13.0-30-generic (shen-Lenovo-G50-80m) 2022年03月10日 _x86_64_ (4 CPU)
00时55分05秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
00时55分06秒 all 2.78 0.00 1.01 0.00 0.00 0.00 0.00 0.00 0.00 96.21
00时55分06秒 0 1.01 0.00 2.02 0.00 0.00 0.00 0.00 0.00 0.00 96.97
00时55分06秒 1 2.97 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 96.04
00时55分06秒 2 2.06 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 97.94
00时55分06秒 3 5.05 0.00 1.01 0.00 0.00 0.00 0.00 0.00 0.00 93.94
pidstat⌗
命令:
pidstat 1
输出:
Linux 5.13.0-30-generic (shen-Lenovo-G50-80m) 2022年03月10日 _x86_64_ (4 CPU)
01时09分08秒 UID PID %usr %system %guest %wait %CPU CPU Command
01时09分09秒 1000 1917 0.98 0.00 0.00 0.98 0.98 0 Xorg
01时09分09秒 1000 2108 0.00 0.98 0.00 0.00 0.98 1 gnome-shell
01时09分09秒 1000 2475 0.00 0.98 0.00 0.00 0.98 2 chrome
01时09分09秒 1000 16062 0.00 0.98 0.00 0.00 0.98 0 code
01时09分09秒 1000 24410 1.96 0.00 0.00 0.00 1.96 0 gnome-terminal-
01时09分09秒 1000 37972 1.96 0.98 0.00 0.00 2.94 1 pidstat
每列的含义:
- UID:进程归属的用户ID
- PID:进程ID
- %usr:进程在用户态的时间
- %system:进程在内核态的时间
- %guest:虚拟机执行的时间
- %wait:进程花在等待执行上的时间
- %CPU:进程消耗的总CPU时间
- CPU:进程关联的CPU ID
- Command:进程的启动命令
iostat⌗
iostat -xz 1
输出:
inux 5.13.0-30-generic (shen-Lenovo-G50-80m) 2022年03月10日 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
15.00 0.18 4.56 1.67 0.00 78.59
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
dm-0 0.70 2.90 0.00 0.00 13.60 4.13 5.83 23.32 0.00 0.00 54.71 4.00 0.00 0.00 0.00 0.00 0.00 0.00 0.33 0.24
dm-1 2.40 36.45 0.00 0.00 18.38 15.16 4.70 39.09 0.00 0.00 6.37 8.32 0.00 0.00 0.00 0.00 0.00 0.00 0.07 2.37
dm-2 1.89 41.92 0.00 0.00 24.82 22.22 1.34 22.38 0.00 0.00 13.75 16.70 0.00 0.00 0.00 0.00 0.00 0.00 0.07 1.15
sda 2.74 81.97 2.31 45.77 18.85 29.96 3.40 83.75 8.48 71.36 12.34 24.61 0.00 0.00 0.00 0.00 0.00 0.00 0.11 3.27
scd0 0.00 0.00 0.00 0.00 1.45 0.23 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
free⌗
命令:
free -m
输出:
total used free shared buff/cache available
Mem: 3839 2029 243 718 1566 846
Swap: 3967 786 3181
实际应用场景⌗
上面说了这么多命令,硬记是记不住的,所以在这里举了一些应用场景来帮助记忆。
查看系统负载⌗
uptime
# 或
top -b -n 1 | head -n 1
查看CPU使用情况⌗
top
# 或
mpstat -P ALL 1
# 或
pidstat 1
# 或
vmstat 1
查看内存使用情况⌗
vmstat 1
# 或
free -m
# 或top
top -b -n 1 | head -n 5 | tail -n 2
查看I/O使用情况⌗
iostat -xz 1
查看最近的系统错误⌗
dmesg | tail
参考⌗
其他内容