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

参考