1.iostat
bash
复制代码
iostat [选项] [时间间隔] [次数]
选项:
-c:仅显示 CPU 使用情况统计。
-d:仅显示磁盘使用情况统计。
-x:显示详细的设备统计。
-m:所有尺寸信息以 MB 单位显示。
-p [设备]:显示指定磁盘分区的统计信息,没有指定设备时显示所有分区信息。
-t:在输出中包含时间戳信息。
-h:输出以更容易阅读的格式显示。
-V:显示程序版本。
bash
复制代码
#展示所有设备的简要 I/O 信息
iostat
#显示 CPU 使用率
iostat -c
#显示扩展的磁盘 I/O 统计
iostat -dx
#以 MB 为单位显示信息
iostat -m
#显示特定磁盘分区的统计信息
iostat -p sda
#设置时间间隔和次数,每2秒钟收集并报告一次系统 I/O 统计,重复5次
iostat 2 5
#显示时间戳、磁盘和 CPU 的详细统计信息,时间戳的扩展磁盘和 CPU 统计信息,每2秒更新一次,共更新5次
iostat -tx 2 5
bash
复制代码
iostat -tx 2 3
Linux 4.19.91-007.ali4000.alios7.x86_64 (109d04301.cloud.d07.am11) 06/06/2024 _x86_64_ (96 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
15.34 0.00 8.96 0.02 0.00 75.68
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 5.63 0.46 19.69 57.69 136.07 19.24 0.03 1.37 0.61 1.39 0.05 0.10
nvme1n1 0.00 1557.83 86.97 1981.93 2442.73 41908.82 42.87 0.30 0.10 0.14 0.09 0.01 3.07
nvme0n1 0.00 14.70 0.23 15.02 28.95 430.81 60.31 0.00 0.07 0.35 0.07 0.06 0.09
loop0 0.00 0.00 0.11 1.07 14.43 3.35 30.09 0.00 0.54 0.09 0.59 0.09 0.01
dm-0 0.00 0.00 0.00 1.07 0.09 3.94 7.52 0.00 0.54 0.09 0.54 0.42 0.05
Device:显示的是设备名,如 sd(a-z)、nvme(n) 等。
rrqm/s:每秒进行合并的读请求的数量。
wrqm/s:每秒进行合并的写请求的数量。
r/s:每秒完成的读次数。
w/s:每秒完成的写次数。
rkB/s:每秒从设备(磁盘)读取的数据量(KB)。
wkB/s:每秒向设备(磁盘)写入的数据量(KB)。
avgrq-sz:平均每次I/O操作的数据量(扇区)。
avgqu-sz:平均I/O请求队列的长度。
await:I/O请求的平均等待时间(毫秒)。
r_await:读请求的平均等待时间(毫秒)。
w_await:写请求的平均等待时间(毫秒)。
svctm:平均服务时间(毫秒)。注意,此列在新版的 Linux 内核中可能已不支持。
%util:设备的利用率百分比,接近 100% 时表示设备可能已成为瓶颈。
2.排查命令
bash
复制代码
top
htop
iotop
#判断哪个进程IO高
iostat -x 1
vmstat 1
#查看磁盘的读写情况
lsof -p $pid
#根据进程查看调用了哪些文件
bash
复制代码
ll /dev/mapper
#首先确定loop0,dm0是属于什么磁盘:ll /dev/mapper;df -h;lsblk 通过分析发现loop0盘做了逻辑分区dm-0属于其中之一
tsar -I dm-0 -i1 -l
#-I dm-0:-I 选项后跟 dm-0 告诉 tsar 报告特定于块设备 dm-0 的信息。dm-0 通常是一个设备映射(device-mapper)设备,可能是 LVM(逻辑卷管理)的一部分,或者是软件 RAID 或其他高级存储特性所使用的。
#-i1:-i 选项指定两次报告之间的时间间隔(以秒为单位)。在这个例子中,-i1 表示 tsar 将每1秒收集并报告一次数据。
#-l:-l 选项告诉 tsar 显示实时数据,而不是历史数据。它将连续监控并以指定的间隔报告统计数据。
因此,完整的命令 tsar -I dm-0 -i1 -l 用于实时连续监控并每1秒显示设备映射 dm-0 的统计数据。
bash
复制代码
echo 1 > /proc/sys/vm/block_dump ; sleep 60 ;dmesg |awk ' /dm-0/ {print $2}' |sort |uniq -c | sort -rn ;echo 0 > /proc/sys/vm/block_dump;
#这段命令是一个组合的 Linux 命令,用来启用 block_dump,记录一段时间内(在本例中为60秒)对特定块设备(dm-0)的访问,并对记录进行处理和分析,最后再禁用 block_dump。下面是对每个命令部分的具体解释:echo 1 > /proc/sys/vm/block_dump:
#该命令启用内核的 block_dump 功能,允许内核记录所有的块设备读写事件到内核环形缓冲区(kernel ring buffer)。
#/proc/sys/vm/block_dump 是一个虚拟文件系统中的文件,通过向它写入1,可以启用 block_dump。
#sleep 60:这个命令使脚本暂停60秒。在这60秒内,内核会记录所有的块设备访问事件。
#dmesg | awk ' /dm-0/ {print $2}' | sort | uniq -c | sort -rn:dmesg 命令用于打印或控制内核环形缓冲区的内容,这些内容包括了 block_dump 的输出。
#awk '/dm-0/ {print $2}' 通过 awk 对 dmesg 的输出进行筛选,只打印出包含 'dm-0' 字样的行的第二个字段(通常是进程名或命令名)。
#sort 命令对结果进行排序,以便接下来的 uniq -c 可以计数。
#uniq -c 对排序后的内容进行去重,并计算每个唯一行出现的次数。
#sort -rn 以数值递减的顺序对计数结果进行排序。
#echo 0 > /proc/sys/vm/block_dump:
最后,通过向 /proc/sys/vm/block_dump 写入0来禁用 block_dump 功能,防止其影响系统性能或生成过多的日志数据。
总的来说,这段命令用于捕捉和分析在60秒内对设备 'dm-0' 的所有访问事件,并对访问最频繁的进程进行排序输出。这可以帮助系统管理员或开发者分析哪些进程在给定时间内频繁访问特定的块设备,从而对系统的性能瓶颈或异常行为进行诊断。
请注意,在实际环境中执行此命令可能需要 root 权限,因为修改 /proc/sys/vm/block_dump 和读取 dmesg 输出通常需要高级权限。此外,启用 block_dump 可能会产生大量日志输出,应谨慎使用。
3.tsar
bash
复制代码
tsar --io -I dm-0 -i 1
#显示出规律来了间隔5分钟左右io飙升
for i in `docker ps -q`;do echo $i;docker exec $i crontab -l 2>/dev/null |grep "/5";done
9e9afc08e9b7
*/5 * * * * find /alidata/www/logs/ -mtime +3 -type f -name "*.log*" |xargs rm -rf;
*/5 * * * * /usr/sbin/logrotate /alidata/conf/log_rotate.conf
ed555455e8a5
*/5 * * * * date >/tmp/test.log
9e575b226ba3
*/5 * * * * find /alidata/logs/ -mtime +0 -type f -name "*.log*"|xargs rm -rf;
*/5 * * * * /usr/sbin/logrotate /alidata/conf/log_rotate.conf
34c6c3398bf5
*/5 * * * * (echo `date` > /var/log/cron.log; find /alidata/www/logs -mtime +0 -type f -name "*.log*" | xargs rm -f;)
5a86fcb49739
*/5 * * * * find /alidata/www/logs/ -mtime +3 -type f -name "*.log*" |xargs rm -rf;
*/5 * * * * /usr/sbin/logrotate /alidata/conf/log_rotate.conf
761dbad2d3a2
*/5 * * * * find /alidata/www/logs/ -mtime +3 -type f -name "*.log*" |xargs rm -rf;
*/5 * * * * /usr/sbin/logrotate /alidata/conf/log_rotate.conf
#根据定时计划任务判断日志压力过大,logrotate压力大
docker ps | grep 9e9afc08e9b7
docker ps | grep ed555455e8a5
docker ps | grep 9e575b226ba3
docker ps | grep 34c6c3398bf5
docker ps | grep 5a86fcb49739
docker ps | grep 761dbad2d3a2
发现是tianjimon的一些容器里面的定时任务在异常 可以采用注释掉定时任务 观察10分钟的方式 发现io水位不再飙升 定位问题就出现在这里
kubectl get pods -n=tianjimon | grep acc | grep -v slave | awk '{print "kubectl delete pod",$1,"-n=tianjimon"}' | bash
#发现tianjimonaccsource-0里的stdout.log日志暴涨 导致的 重拉pod后解决问题
#发现tianjimonaccsource-0里的stdout.log日志暴涨 导致的 重拉pod, 降低logrotate压力,解决问题