stress

stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。

stress --cpu 1 --timeout 600  # 拟一个 CPU 使用率 100% 的场景stress -i 1 --timeout 600   #模拟 I/O 压力,即不停地执行 syncstress -c 8 --timeout 600  #模拟的是 8 个进程

sysstat

sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。

  • mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。
# -P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据$ mpstat -P ALL 5Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)13:30:06     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle13:30:11     all   50.05    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   49.9513:30:11       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0013:30:11       1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
  • pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。
# 每隔 1 秒输出 1 组数据(需要 Ctrl+C 才结束)#-d 展示 I/O 统计数据,-p 指定进程号# -w 参数表示输出进程切换指标,而 -u 参数则表示输出 CPU 使用指标  -t输出线程的上下文切换指标$ pidstat -wt -u 108:06:33      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command08:06:34        0     10488   30.00  100.00    0.00    0.00  100.00     0  sysbench08:06:34        0     26326    0.00    1.00    0.00    0.00    1.00     0  kworker/u4:2 08:06:33      UID       PID   cswch/s nvcswch/s  Command08:06:34        0         8     11.00      0.00  rcu_sched08:06:34        0        16      1.00      0.00  ksoftirqd/108:06:34        0       471      1.00      0.00  hv_balloon08:06:34        0      1230      1.00      0.00  iscsid08:06:34        0      4089      1.00      0.00  kworker/1:508:06:34        0      4333      1.00      0.00  kworker/0:308:06:34        0     10499      1.00    224.00  pidstat08:06:34        0     26326    236.00      0.00  kworker/u4:208:06:34     1000     26784    223.00      0.00  sshd

用户态 CPU 使用率 (%usr);
内核态 CPU 使用率(%system);
运行虚拟机 CPU 使用率(%guest);
等待 CPU 使用率(%wait);
以及总的 CPU 使用率(%CPU)。

sysbench

sysbench 是一个多线程的基准测试工具,一般用来评估不同系统参数下的数据库负载情况。

# 以 10 个线程运行 5 分钟的基准测试,模拟多线程切换的问题sysbench --threads=10 --max-time=300 threads run

top

top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。

# 默认每 3 秒刷新一次$ toptop - 11:58:59 up 9 days, 22:47,  1 user,  load average: 0.03, 0.02, 0.00Tasks: 123 total,   1 running,  72 sleeping,   0 stopped,   0 zombie%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 stKiB Mem :  8169348 total,  5606884 free,   334640 used,  2227824 buff/cacheKiB Swap:        0 total,        0 free,        0 used.  7497908 avail Mem   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND    1 root      20   0   78088   9288   6696 S   0.0  0.1   0:16.83 systemd    2 root      20   0       0      0      0 S   0.0  0.0   0:00.05 kthreadd    4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H...

user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。

nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
system(通常缩写为 sys),代表内核态 CPU 时间。
idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。

进程都有一个 %CPU 列,表示进程的 CPU 使用率。它是用户态和内核态 CPU 使用率的总和,包括进程用户空间使用的 CPU、通过系统调用执行的内核空间 CPU 、以及在就绪队列等待运行的 CPU。在虚拟化环境中,它还包括了运行虚拟机占用的 CPU。

perf

perf 是 Linux 2.6.31 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。

$ perf topSamples: 833  of event 'cpu-clock', Event count (approx.): 97742399Overhead  Shared Object       Symbol   7.28%  perf                [.] 0x00000000001f78a4   4.72%  [kernel]            [k] vsnprintf   4.32%  [kernel]            [k] module_get_kallsym   3.65%  [kernel]            [k] _raw_spin_unlock_irqrestore...#离线采集分析   -g 参数,开启调用关系的采样perf record -g # 按 Ctrl+C 终止采样perf report # 展示类似于 perf top 的报告

第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。比如这个例子中,perf 总共采集了 833 个 CPU 时钟事件,而总事件数则为 97742399。

第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。

ab

ab(apache bench)是一个常用的 HTTP 服务性能测试工具,用来模拟 Ngnix 的客户端。

# 并发 10 个请求测试 Nginx 性能,总共测试 100 个请求$ ab -c 10 -n 100 http://192.168.0.10:10000/This is ApacheBench, Version 2.3 <$Revision: 1706008 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, ...Requests per second:    11.63 [#/sec] (mean)Time per request:       859.942 [ms] (mean)...//并发请求数改成 5,同时把请求时长设置为 10 分钟ab -c 5 -t 600 http://192.168.0.10:10000/

dstat

dstat ,可以同时查看 CPU 和 I/O 这两种资源的使用情况。

# 间隔 1 秒输出 10 组数据$ dstat 1 10You did not select any stats, using -cdngy by default.--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw  0   0  96   4   0|1219k  408k|   0     0 |   0     0 |  42   885  0   0   2  98   0|  34M    0 | 198B  790B|   0     0 |  42   138  0   0   0 100   0|  34M    0 |  66B  342B|   0     0 |  42   135  0   0  84  16   0|5633k    0 |  66B  342B|   0     0 |  52   177  0   3  39  58   0|  22M    0 |  66B  342B|   0     0 |  43   144  0   0   0 100   0|  34M    0 | 200B  450B|   0     0 |  46   147  0   0   2  98   0|  34M    0 |  66B  342B|   0     0 |  45   134  0   0   0 100   0|  34M    0 |  66B  342B|   0     0 |  39   131  0   0  83  17   0|5633k    0 |  66B  342B|   0     0 |  46   168  0   3  39  59   0|  22M    0 |  66B  342B|   0     0 |  37   134

strace

strace 正是最常用的跟踪进程系统调用的工具。

$ strace -p 6082strace: attach: ptrace(PTRACE_SEIZE, 6082): Operation not permitted

pstree

# -a 表示输出命令行选项# p 表 PID# s 表示指定进程的父进程$ pstree -aps 3084systemd,1  └─dockerd,15006 -H fd://      └─docker-containe,15024 --config /var/run/docker/containerd/containerd.toml          └─docker-containe,3991 -namespace moby -workdir...              └─app,4009                  └─(app,3084)