Percona Toolkit 神器全攻略(系统类)
Percona Toolkit 神器全攻略系列共八篇,前文回顾:
全文约定:$为命令提示符、greatsql>为 GreatSQL 数据库提示符。在后续阅读中,依据此约定进行理解与操作
系统类
在 Percona Toolkit 中系统类共有以下工具
pt-diskstats
概要
类似于iostat命令,不过它比iostat输出的更加详细一点
用法
打印 GNU/Linux 的磁盘 I/O 统计信息。它有点类似于 iostat,但它是交互式的并且更详细。且可以分析从另一台机器收集的样本。
选项
该工具所有选项如下
最佳实践
注意!在较新的 Linux 内核版本中,为磁盘统计信息返回的字段量更改为 20 个,并导致 pt-diskstat 在这些系统上无法提供任何输出。
※该问题详情见:https://perconadev.atlassian.net/jira/software/c/projects/PT/issues/PT-2313?jql=project%20%3D%20%22PT%22%20AND%20text%20~%20%22diskstats%22%20ORDER%20BY%20created%20DESC
※解决方法:https://github.com/percona/percona-toolkit/pull/526/files#diff-c3ecedaa384eecb55bd8fdb37456a89a3dc45a41588ef1ebe231120e965942d8R2247
直接采集分析
--devices-regex指定设备名称,根据自身设备而修改
 $ pt-diskstats --interval=1 --iterations=10 --devices-regex=sda --show-timestamps     #ts device    rd_s rd_avkb rd_mb_s rd_mrg rd_cnc   rd_rt    wr_s wr_avkb wr_mb_s wr_mrg wr_cnc   wr_rt busy in_prg    io_s  qtime stime14:08:26 sda        0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.014:08:26 sda1       0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.014:08:26 sda2       0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.014:08:26 sda3       0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.0
       复制代码
 
ts:在--show-timestamps操作时候的时间戳。但如果在 group-by 为 all 模式下此列显示时间戳偏移量,如果在 sample 模式下表示分组到每个样本的总时间跨度
device:设备名称
rd_s:每秒的平均读取次数
rd_avkb:读取的平均大小单位 kb
rd_mb_s:每秒读取的平均兆字节数
rd_mrg:在发送到物理设备之前在队列调度程序中合并在一起的读取请求的百分比
rd_cnc:根据利特尔定律计算得出的读取操作的平均并发度
rd_rt:读取操作的平均响应时间,以毫秒为单位
wr_s:每秒平均写入次数
wr_avkb:平均写入大小
wr_mb_s:每秒平均写入的平均大小
wr_mrg:发送到物理设备之前,在队列调度程序中合并在一起的写入请求的百分比
wr_cnc:写入操作的平均并发量
wr_rt:写入操作的平均相应时间
busy:磁盘繁忙程度
in_prg:正在进行的请求数
io_s:物理设备的平均吞吐量,以每秒 I/O 操作数 (IOPS) 为单位
qtime:平均排队时间
stime:平均服务时间
采集分析
先收集 /proc/diskstats 的信息,存到一个文件里面,采集一段时候后再通过 pt-diskstats 来计算。这样的好处是,可以了解该段时间内的整体 I/O 性能,而不是瞬间的性能指标
使用该 Shell 脚本
采集时间可以修改 LOOPS 参数,采集间隔修改 INTERVAL 即可
 $ vim collection.sh#!/bin/bashINTERVAL=1LOOPS=10INT=1echo `date`while (( $INT <= $LOOPS )) do Sleep=$(date +%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}")     sleep $Sleep     date +"TS %s.%N %F %T" >> diskstats-samples.txt    cat /proc/diskstats >> diskstats-samples.txt    let INT=INT+1doneecho `date`
       复制代码
 
授权并运行该 Shell 脚本
 $ chmod 755 collection.sh$ sh collection.sh
       复制代码
 
在脚本文件的同一个目录下会生成diskstats-samples.txt文本文件,接着使用 pt-diskstats 工具分析即可
 $ pt-diskstats --group-by disk diskstats-samples.txt  #ts device    rd_s rd_avkb rd_mb_s rd_mrg rd_cnc   rd_rt    wr_s wr_avkb wr_mb_s wr_mrg wr_cnc   wr_rt busy in_prg    io_s  qtime stime {19} sda        0.0     0.0     0.0     0%    0.0     0.0     0.4     6.8     0.0     8%    0.0     0.3   0%      0     0.4    0.2   0.2 {19} sda3       0.0     0.0     0.0     0%    0.0     0.0     0.3     7.9     0.0    10%    0.0     0.3   0%      0     0.3    0.2   0.1 {19} dm-0       0.0     0.0     0.0     0%    0.0     0.0     0.4     7.2     0.0     0%    0.0     0.5   0%      0     0.4    0.2   0.2
       复制代码
 
不同点是 ts 列显示包含在输出行中的样本数,其它字段意思和上方一致
查看该段时间内 sda 的 iops 变化情况
 $ pt-diskstats --group-by sample --devices-regex sda --columns-regex io_s diskstats-samples.txt
 #ts device    io_s  0.0 {4}      156.6......中间省略部分 55.2 {4}        0.0 56.2 {4}        0.0
       复制代码
 
查看 sda-sdb 两块盘在采集的时间段内的整体 I/O 平均负载情况
 $ pt-diskstats --group-by disk --devices-regex 'sd[a-c]' diskstats-samples.txt
       复制代码
 
小技巧
在使用 pt-diskstats 工具在线分析的时候按“?”键,将调出交互式帮助菜单,其中显示哪些键控制程序
 $ pt-diskstats --devices-regex=sda --show-timestamps15:08:06 sda        0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.015:08:06 sda1       0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.015:08:06 sda2       0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.015:08:06 sda3       0.0     0.0     0.0     0%    0.0     0.0     0.0     0.0     0.0     0%    0.0     0.0   0%      0     0.0    0.0   0.0# 此时输入'?'会弹出提示   You can control this program by key presses:   ------------------- Key ------------------- ---- Current Setting ----   A, D, S) Set the group-by mode              A   c) Enter a Perl regex to match column names .   /) Enter a Perl regex to match disk names   sda   z) Set the sample size in seconds           1   i) Hide inactive disks                      yes   p) Pause the program   q) Quit the program   space) Print headers   ------------------- Press any key to continue -----------------------
       复制代码
 pt-fifo-split
概要
可以用做切割大文件,切割完成后再分批导入 GreatSQL 数据库中,不会造成效率低以及主从延迟
用法
选项
该工具所有选项如下
最佳实践
用命令seq 1 1000000 > hugefile.txt 向 hugefile.txt 文件插入一百万行数据
 $ wc -l hugefile.txt           1000000 hugefile.txt
       复制代码
 
接着需要写一个脚本文件获取切割后的数据
 $ vim fifo_get.sh #!/bin/bashfilename=/tmp/hugefilen=1while [ -e /tmp/pt-fifo-split ];do         cat /tmp/pt-fifo-split > "$filename"_"$n".txt ;        let n++done
       复制代码
 
使用 pt-fifo-split 工具切割
 $ pt-fifo-split --lines 10000 --statistics hugefile.txtchunks     lines  time  overall  current    1     10000    48 208.33 208.33    2     20000    48 416.67 10000.00    3     30000    48 625.00 10000.00    4     40000    48 833.33 10000.00    5     50000    48 1041.67 10000.00......下方省略
       复制代码
 
使用脚本工具获取数据
 $ chmod 755 fifo_get.sh$ sh fifo_get.sh $ ls /tmp/hugefile_* 2>/dev/null | wc -l100
       复制代码
 
接下来就可以把这些切割后的文件导入到 GreatSQL 数据库中了,此时可以用 GreatSQL 的并行 LOAD DATA 特性,最大导入的加速比大概为 20 倍
使用 LOAD 语句增加 HINT 启用
 greatsql> LOAD /*+ SET_VAR(gdb_parallel_load=ON) SET_VAR(gdb_parallel_load_chunk_size=65536) SET_VAR(gdb_parallel_load_workers=16) */DATA INFILE 'hugefile.txt' INTO TABLE t1;
       复制代码
 
GreatSQL 的并行 LOAD DATA 详见:https://greatsql.cn/docs/8032-25/user-manual/5-enhance/5-1-highperf-parallel-load.html
当然也可以使用split命令来做切割 split -l 1000 hugefile.txt chunk_
pt-ioprofile
概要
主要用于监视和分析 GreatSQL/MySQL 进程的 I/O 活动。通过 strace 和 lsof 来跟踪进程的 I/O 情况,并打印出相关的表文件和活动 I/O 信息。
用法
建议使用 root 权限,可以收集到更多的信息
选项
该工具所有选项如下
最佳实践
直接使用即可,默认--cell为 times 既 I/O 操作的时间,默认监听 30 秒的 mysqld 进程,并给出 30 秒内的分析结果
注意!是要等待 30 秒后给出分析结果,并不是实时出结果
 $ pt-ioprofileWed Apr  3 02:16:37 PM CST 2024Tracing process ID 657147     total      write      lseek  ftruncate filename  0.000468   0.000232   0.000142   0.000094 /data/GreatSQL/innodb_status.657147  0.000184   0.000000   0.000184   0.000000 /tmp/#13526  0.000180   0.000000   0.000180   0.000000 /tmp/#13525
       复制代码
 
可指定--cell为 sizes 既 I/O 操作的大小
 $ pt-ioprofile --cell=sizes                                                        Wed Apr  3 02:11:09 PM CST 2024Tracing process ID 657147     total      write      lseek  ftruncate filename     53620      26810      26810          0 /data/GreatSQL/innodb_status.657147      5074          0       5074          0 /tmp/#13525      2024          0       2024          0 /tmp/#13526
       复制代码
 
可指定--cell为 count 既 I/O 操作的次数
 $ pt-ioprofile --cell=count Wed Apr  3 02:15:18 PM CST 2024Tracing process ID 657147     total      write      lseek  ftruncate filename         7          4          2          1 /data/GreatSQL/innodb_status.657147         1          0          1          0 /tmp/#13526         1          0          1          0 /tmp/#13525
       复制代码
 pt-stalk
概要
pt-stalk 工具的功能是出现问题时收集 GreatSQL 数据库和系统的诊断信息,可以解决更细粒度的现场故障采集
用法
建议使用 root 权限,可以收集到更多的信息
选项
该工具所有选项如下
最佳实践
监控SHOW GLOBAL STATUS中的状态值
例如监控Threads_running状态值,如果Threads_running状态值连续 5 次超过 100,这触发收集主机和数据库的信息
 $ pt-stalk --function status --variable Threads_running --cycles 5 --threshold 500 --daemonize --user=root --password=
       复制代码
 
有以下三种触发方式
立即收集主机和数据库信息
不等待触发发生,立即收集在 60 秒内主机和数据库的信息,等待 180 秒后结束自动退出
 $ pt-stalk --no-stalk --run-time=60 --iterations=1 --user=root --password=
       复制代码
 
查看默认诊断数据存放的位置/var/lib/pt-stalk
 $ ls /var/lib/pt-stalk                            2024_04_07_14_47_10-df              2024_04_07_14_47_10-lsof            2024_04_07_14_47_10-numastat     2024_04_07_14_47_10-ps-locks-transactions2024_04_07_14_47_10-disk-space      2024_04_07_14_47_10-meminfo         2024_04_07_14_47_10-opentables1  2024_04_07_14_47_10-slabinfo2024_04_07_14_47_10-diskstats       2024_04_07_14_47_10-mpstat          2024_04_07_14_47_10-opentables2  2024_04_07_14_47_10-slave-status2024_04_07_14_47_10-hostname        2024_04_07_14_47_10-mpstat-overall  2024_04_07_14_47_10-output       2024_04_07_14_47_10-sysctl2024_04_07_14_47_10-innodbstatus1   2024_04_07_14_47_10-mutex-status1   2024_04_07_14_47_10-pmap         2024_04_07_14_47_10-top2024_04_07_14_47_10-innodbstatus2   2024_04_07_14_47_10-mutex-status2   2024_04_07_14_47_10-processlist  2024_04_07_14_47_10-trigger2024_04_07_14_47_10-interrupts      2024_04_07_14_47_10-mysqladmin      2024_04_07_14_47_10-procstat     2024_04_07_14_47_10-variables2024_04_07_14_47_10-iostat          2024_04_07_14_47_10-netstat         2024_04_07_14_47_10-procvmstat   2024_04_07_14_47_10-vmstat2024_04_07_14_47_10-iostat-overall  2024_04_07_14_47_10-netstat_s       2024_04_07_14_47_10-ps           2024_04_07_14_47_10-vmstat-overall
       复制代码
 
有很多采集的文件,从文件名可以看出来,命名方式就是以命令来命名的。同时也可以用pt-sift工具来查看产生的文件内容
pt-sift
概要
用于分析、查看pt-stalk命令产生的文件内容,并生产概要信息,然后通过输入不同的命令查看不同的内容。如,输入m,查看的是SHOW STATUS命令的内容。
用法
这是一个交互式的命令
选项
该工具所有选项如下
最佳实践
显示所有 pt-stalk 收集的信息
可以直接使用pt-sift命令,并加上pt-stalk工具收集的信息存放地址
 $ pt-sift /var/lib/pt-stalk
       复制代码
 
此时会跳出一个交互式的命令行,可以通过输入?来查看帮助信息,通过输入不同的命令显示不同的内容
d:设置在样本磁盘性能统计信息上启动 pt-diskstats 工具的操作
i:设置在 less 中查看第一个 INNODB STATUS 样本的操作
m:使用 pt-mext 工具并排显示 SHOW STATUS 计数器的前 4 个样本
n:以两种方式汇总 netstat 数据的第一个样本:按原始主机和按连接状态
j:选择下一个时间戳作为活动样本
k:选择前一个时间戳作为活动样本
q:退出程序
1:将每个示例的操作设置为默认值,即查看示例的摘要
0:将操作设置为仅列出示例中的文件
*:查看所有文件
                   ---  COMMANDS  ---      1  Default action: summarize files      0  Minimal action: list files      *  View all the files in less      d  Invoke 'diskstats' on the disk performance data      i  View the first INNODB STATUS sample in 'less'      m  Invoke 'pt-mext' to show the SHOW STATUS counters side by side      n  Summarize the 'netstat -antp' status data                  --- NAVIGATION ---      j  Select the next timestamp      k  Select the previous timestamp      q  Quit the programPress any key to continue
       复制代码
 pt-summary
概要
打印信息涵盖 CPU、内存、硬盘、网卡等核心信息,同时展现文件系统、磁盘调度、队列大小、LVM、RAID 等详细配置,以及网络链接统计、netstat 分析,并突出前 10 负载与 vmstat 数据
用法
选项
最佳实践
直接使用即可
该段展示当前日期和时间,以及服务器和操作系统的概览
 # Percona Toolkit System Summary Report ######################        Date | 2024-04-15 07:49:13 UTC (local TZ: CST +0800)    Hostname | myarch      Uptime | 74 days,  5:25,  4 users,  load average: 0.03, 0.01, 0.00    Platform | Linux     Release | "Arch Linux" (n/a)      Kernel | 6.6.3-arch1-1Architecture | CPU = 64-bit, OS = 64-bit   Threading | NPTL 2.39    Compiler | GNU CC version 13.2.1 20230801.     SELinux | No SELinux detected Virtualized | No virtualization detected
       复制代码
 
该段提取自/proc/cpuinfo
 # Processor ##################################################  Processors | physical = 1, cores = 6, virtual = 12, hyperthreading = yes      Speeds | 1x4071.589, 1x4177.016, 1x4179.769, 1x4197.696, 1x4197.784, 1x4198.704, 6x800.000      Models | 12xIntel(R) Core(TM) i7-8850H CPU @ 2.60GHz      Caches | 12x9216 KB
       复制代码
 
该段是内存信息。生成自free、ps、sysctl以及dmidecode
 # Memory #####################################################         Total | 15.4G          Free | 1.1G          Used | physical = 3.7G, swap allocated = 0.0, swap used = 0.0, virtual = 3.7G        Shared | 3.9M       Buffers | 10.9G        Caches | 11.7G         Dirty | 20 kB       UsedRSS | 3.3G    Swappiness | 60   DirtyPolicy | 20, 10   DirtyStatus | 0, 0    Numa Nodes | 1   Numa Policy | defaultPreferred Node | current   Node    Size        Free        CPUs   ====    ====        ====        ====   node0   15787 MB    1165 MB     0 1 2 3 4 5 6 7 8 9 10 11
       复制代码
 
该段是挂载文件系统。生成自mount和df
 # Mounted Filesystems ########################################  Filesystem      Size Used Type     Opts                   Mountpoint  /dev/nvme0n1p1  799M   1% vfat     rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro /efi  /dev/nvme0n1p2  233G  34% ext4     rw,relatime                   /  /dev/sda1       916G   4% ext4     rw,relatime                   /home  efivarfs        384K  19% efivarfs rw,nosuid,nodev,noexec,relatime                   /sys/firmware/efi/efivars  run             7.8G   1% tmpfs    rw,nosuid,nodev,relatime,mode=755,inode64                   /run  tmpfs           1.6G   1% tmpfs    rw,nosuid,nodev,inode64                   /run/user/0  tmpfs           1.6G   1% tmpfs    rw,nosuid,nodev,relatime,size=1616676k,nr_inodes=404169,mode=700,inode64                   /run/user/0  tmpfs           1.6G   1% tmpfs    rw,nosuid,nodev,nr_inodes=1048576,inode64                   /run/user/0  tmpfs           7.8G   0% tmpfs    rw,nosuid,nodev,inode64                   /dev/shm  tmpfs           7.8G   0% tmpfs    rw,nosuid,nodev,relatime,size=1616676k,nr_inodes=404169,mode=700,inode64                   /dev/shm  tmpfs           7.8G   0% tmpfs    rw,nosuid,nodev,nr_inodes=1048576,inode64                   /dev/shm  tmpfs           7.8G   1% tmpfs    rw,nosuid,nodev,inode64                   /tmp  tmpfs           7.8G   1% tmpfs    rw,nosuid,nodev,relatime,size=1616676k,nr_inodes=404169,mode=700,inode64                   /tmp  tmpfs           7.8G   1% tmpfs    rw,nosuid,nodev,nr_inodes=1048576,inode64                   /tmp
       复制代码
 
该段是磁盘调度信息。提取自/sys
 # Disk Schedulers And Queue Size #############################     nvme0n1 | [none] 1023         sda | [mq-deadline] 64
       复制代码
 
该段是磁盘分区信息。生成自fdisk -l
 # Disk Partitioning ##########################################Device       Type      Start        End               Size============ ==== ========== ========== ==================/dev/nvme0n1 Disk                             256060514304/dev/nvme0n1p1 Part       2048    1640447                  0/dev/nvme0n1p2 Part    1640448  500117503                  0/dev/sda     Disk                            1000204886016/dev/sda1    Part       2048 1953523711                  0
       复制代码
 
该段是Kernel Inode State
 # Kernel Inode State #########################################dentry-state | 733944   717873  45      0       291017  0     file-nr | 1120     0       9223372036854775807    inode-nr | 631593   103806
       复制代码
 
该段是内核索引节点信息。分别提取自/proc/sys/fs目录下同名文件
 # LVM Volumes ################################################Unable to collect information# LVM Volume Groups ##########################################Unable to collect information
       复制代码
 
该段是 RAID 控制器。生成自lvs
 # RAID Controller ############################################  Controller | No RAID controller detected
       复制代码
 
该段是网络配置,生成自lspci和sysctl
 # Network Config #############################################  Controller | Intel Corporation Ethernet Connection (7) I219-LM (rev 10) FIN Timeout | 60  Port Range | 60999
       复制代码
 
该段是网络接口统计,生成自ip -s link
 # Network Connections ########################################  Connections from remote IP addresses    192.168.6.76        1    213.133.111.6       1  Connections to local IP addresses    192.168.6.55        2  Connections to top 10 local ports    22                  1    35554               1  States of connections    ESTABLISHED         2    LISTEN              5
       复制代码
 
该段是TOP命令前几行
 # Top Processes ##############################################    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND1526529 root      20   0   15316   5632   3584 R  16.7   0.0   0:00.03 top      1 root      20   0   22644  13452  10112 S   0.0   0.1  12:08.33 systemd      2 root      20   0       0      0      0 S   0.0   0.0   0:05.75 kthreadd      3 root      20   0       0      0      0 S   0.0   0.0   0:00.00 pool_wo+      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+
       复制代码
 
该段是要注意的地方,这里提示sshd没运行
 # Notable Processes ##########################################  PID    OOM    COMMAND    ?      ?    sshd doesn't appear to be running
       复制代码
 
该段是内存管理,这里提示开启了透明大页
 # Memory management ##########################################Transparent huge pages are enabled.
       复制代码
 
该段表示结束
 # The End ####################################################
       复制代码
 
本文完 :) 下章节将介绍 Percona Toolkit 神器全攻略(开发类)
评论