驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
Linux常用性能分析和优化工具【持续更新】
/  

Linux常用性能分析和优化工具【持续更新】

开篇

  • top 可能是最常用的,可以查看当前系统的大略情况。
  • sysstat 非常全面的一个性能工具

top

开篇一张图1111.png

通用信息

  • 第一行重点关注信息:load average平均负载,0.17,0.20,0.23表示的是1/5/15`分钟内的平均负载。备注1
  • 第二行表示当前的任务数,如果同时运行的任务超过了线程数,那么需要好生排查。
  • 第三行表示的就是cpu时间的占比/使用率相关的信息
    • us 表示的用户态的cpu的使用率
    • sy 表示的内核态的cpu使用率
    • wa 表示的是等待io完成的cpu使用率。IO中断过多时,该使用率高
    • hi 表示的是处理硬件中断的cpu时间。
    • si 表示处理软中断的cpu时间。
  • 第四行/第五行都是是内存相关信息,
    • 第四行分表表示。全部内存、可用内存、已使用内存、缓存内存
    • 第五行表示的swap的内存信息,当物理内存不够的时候,内核就可能把物理内存缓存到磁盘中。

进程概要信息

从第6行就是进程的概要信息了。

  • PID 表示进程ID
  • VIRT 表示的进程请求虚拟内存的大小
  • RES 表示的是进程请求的非交换区的实际内存大小
  • SHR 表示的是进程共享内存的大小
  • S表示的是Status分别有如下情况
    • S 是最多的状态,表示睡眠状态,通常由于无法获取到系统资源而sleep
    • R 表示的当前进程获得CPU资源正在Running
    • I 表示的是可中断状态,也属于空闲状态
    • D 表示的不可中断状态,Disk Sellp,该状态会导致系统负载升高
    • Z 表示僵尸态

Sysstat

其中包括诸多性能监控的工具,常用的如下所示:

  • Pidstat 从进程角度去查看系统各项指标,IO/CPU/内存
  • Iostat 主要是统计系统设备的io信息
  • Mpstat 提供cpu信息
  • sar 主要是统计相关信息
  • Vmstat

安装/更新

# 推荐源码安装
## 先安装GCC
yum -y install gcc git
## 然后克隆代码进行安装
git clone git://github.com/sysstat/sysstat
cd sysstat
./configure --disable-nls --prefix=/usr/local/
make && make install

## 启动服务
systemctl restart sysstat
systemctl enable sysstat

查看版本

# 安装完后,断开shell后重新连接
$ mpstat -V
sysstat version 12.5.6
(C) Sebastien Godard (sysstat <at> orange.fr)

pidstat

查看一段时间的进程活跃信息,状态为Running

# 每隔1秒查看一次,一共查看3次
[root@pressure-201 ~]# pidstat 1 3
Linux 4.19.12-1.el7.elrepo.x86_64 (pressure-201) 	12/08/21 	_x86_64_	(2 CPU)

14:29:11      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command

14:29:12      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
14:29:13        0     75797    0.00    1.00    0.00    0.00    1.00     0  pidstat

14:29:13      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0     75797    0.00    0.33    0.00    0.00    0.33     -  pidstat

查看进程的io情况

# 1表示间隔1秒,3表示一共输出3次
[root@mx-05 ~]#  pidstat -d -p 1 3
Linux 4.19.91-22.2.al7.x86_64 (mx-05)   2021年12月08日  _x86_64_        (8 CPU)

14时29分50秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
14时29分51秒     0       569      0.00     23.76      0.00  jbd2/vdb1-8
14时29分51秒     0       913      0.00     19.80      0.00  dockerd
14时29分51秒     0      9704      0.00      3.96      3.96  containerd-shim
14时29分51秒  1000      9806      0.00    130.69     71.29  java

查看进程的所有子线程的cpu信息,查看进程的某个线程占用cpu过高,也可以采取该方法。

# 其中9806为进程号,-t表示输出统计信息,-p表示进程号, 2表示每隔2秒输出,3表示一共输出3次
[root@mx-05 ~]# pidstat -t -p 9806 2 3
Linux 4.19.91-22.2.al7.x86_64 (mx-05)   2021年12月08日  _x86_64_        (8 CPU)

14时54分35秒   UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
14时54分37秒  1000      9806         -   10.95    0.50    0.00   11.44     5  java
14时54分37秒  1000         -      9806    0.00    0.00    0.00    0.00     5  |__java
14时54分37秒  1000         -     29655    0.00    0.00    0.00    0.00     1  |__G1 Refine#4
14时54分37秒  1000         -      6384    2.99    0.50    0.00    3.48     1  |__elasticsearch[a
。。。
  • UID 表示的USER ID
  • TGID 表示的 进程id
  • TID 表示的线程id

iostat

# 1是间隔1秒,3表示一共输出3次
[root@pressure-201 ~]# iostat -x 1 3
Linux 4.19.12-1.el7.elrepo.x86_64 (pressure-201) 	12/08/21 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.32    0.00    0.18    0.00    0.00   99.50

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     f/s f_await  aqu-sz  %util
dm-0             0.02      0.82     0.00   0.00    1.01    45.19    0.48    109.16     0.00   0.00    2.03   229.38    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.02
dm-1             0.00      0.00     0.00   0.00    0.06    24.09    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    0.00   0.00

或者

# 参数-d表示显示设备磁盘的使用状态;
# -k表示某些使用block为单位的列强制使用kilobytes为单位。 -m为K换位M
# 2表示数据每隔2秒刷新一次 6表示一共刷新6次
[root@mx-65 ~]# iostat -d -k 2 1
Linux 4.19.91-24.1.al7.x86_64 (mx-65)   12/08/21        _x86_64_        (4 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda              10.59       184.11        35.87         0.00 1162285133  226453113          0

输出信息意义
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

sar

sar 工具比较强大,既能收集系统CPU、硬盘、动态数据,也能显示动态显示,更能查看二进制数据文件;sar 的应用比较多,而且也比较复杂,数据更为精确

查看网络吞吐量,对于bps和pps都有效果

sar --human  -n DEV 2 4  #查看网络设备的网络吞吐量,每隔2秒输出1次,一个输出4次 human表示单位
sar --human  -n DEV 2 4 | grep ens33 # 只查看某个网卡的

查看cpu的情况

[root@mx-05 sa]# sar --human 2 3
Linux 4.19.91-22.2.al7.x86_64 (mx-05)   12/08/21        _x86_64_        (8 CPU)

15:56:25        CPU     %user     %nice   %system   %iowait    %steal     %idle
15:56:27        all      6.4%      0.0%      1.3%      0.6%      0.0%     91.6%
15:56:29        all      2.1%      0.0%      1.1%      0.0%      0.0%     96.7%
15:56:31        all      4.7%      0.0%      1.1%      0.1%      0.0%     94.0%
Average:        all      4.4%      0.0%      1.2%      0.3%      0.0%     94.1%

vmstat

优势在于,一次能够看多个不同类型的指标。

[root@mx-05 sa]# vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1886060 1230660 4977508    0    0    18   189    1    0  2  1 97  0  0
 0  0      0 1883816 1230660 4979600    0    0     0  1338 7249 12095  4  1 95  0  0
 3  0      0 1885088 1230660 4978816    0    0     0   228 6569 11716  2  1 97  0  0
  • r表示等待执行和正在执行的任务的个数,如果超过了cpu的个数,那么就是存在瓶颈
  • b 表示等待IO的任务的个数

mpstat

[root@mx-65 ~]# mpstat 2 3
Linux 4.19.91-24.1.al7.x86_64 (mx-65)   12/08/21        _x86_64_        (4 CPU)

19:55:29     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
19:55:31     all    1.64    0.00    1.52    0.00    0.00    0.13    0.00    0.00    0.00   96.72
19:55:33     all    2.15    0.00    1.65    0.00    0.00    0.13    0.00    0.00    0.00   96.07
19:55:35     all    2.40    0.00    2.02    0.00    0.00    0.00    0.00    0.00    0.00   95.58
  • %user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100
  • %nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
  • %sys 在internal时间段里,内核时间(%) (system/total)*100
  • %iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
  • %irq 在internal时间段里,硬中断时间(%) (irq/total)*100
  • %soft 在internal时间段里,软中断时间(%) (softirq/total)*100
  • %idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100

其他

hping3

生成和解析TCP/IP协议数据包汇编/分析的开源工具,可以用来进行:洪水攻击

hping3 -S -p 80

watch

查看系统软中断的次数

$ watch -d cat /proc/softirqs
Every 2.0s: cat /proc/softirqs                                                                                                                                                                               Wed Dec  8 14:43:43 2021

                    CPU0       CPU1       CPU2       CPU3
          HI:          0          1          0          0
       TIMER: 3953236589 3820984042 3983670880 3798287639
      NET_TX:   38291417    3677459   38238437    2527695
      NET_RX: 2427513379  436348199 2440027908  434966544
       BLOCK:          0          0          0          0
    IRQ_POLL:          0          0          0          0
     TASKLET:    1132212      12601     607401      12528
       SCHED: 1654027503 1601501933 1645590675 1575244373
     HRTIMER:       5192          6       5045          6
         RCU: 1301657166 1236721365 1370222958 1232914689

perf

# -g 开启调用关系分析,-p 指定 php-fpm 的进程号 21515
$ perf top -g -p 21515
# 记录性能事件,等待大约 15 秒后按 Ctrl+C 退出
$ perf record -g
# 查看报告
$ perf report

pstree

查看当前进程的目录树

pstree
pstree | grep nginx

[root@mx-05 ~]# pstree -aps 980systemd,1 --switched-root --system --deserialize 22  └─containerd-shim,925 -namespace moby -id 5738aa6f4b6e160144d2a2987b8782ebcc37e5cebeb2a0abce70f0fa26237da6 -address /run/containerd/containerd.sock      └─java,980 -Xms512m -Xmx512m -Dspring.cloud.discovery.client.simple.instances.oap-service[0].uri=http://skywalking-oap:12800 -jar webapp/skywalking-webapp.jar          ├─{java},1097          ├─{java},1098

ab

ab测试

# 并发10个请求,总共测试10000个请求
$ ab -c 10 -n 10000 http://10.240.0.5:10000/

# 请求时长设置为10分钟 60*10
$ ab -c 5 -t 600 http://192.168.0.10:10000/

# websocket 压测
ab -n 10000 -c 10 https://xxx.xxx

短时进程

execsnoop
骐骥一跃,不能十步。驽马十驾,功在不舍。