磁盘-IO

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压力,解决问题
相关推荐
---学无止境---16 分钟前
Linux交换缓存深度解析:从条目编码到缓存管理的完整机制
linux
---学无止境---28 分钟前
Linux内存回收与TLB管理:高效释放与缓存刷新的精密协作
linux
亮子AI29 分钟前
【Nginx】怎样清除 Nginx 的缓存?
运维·nginx·缓存
硬核子牙30 分钟前
硬盘第一关:MBR VS GPT
linux
LCG元37 分钟前
Linux 日志分析全攻略:快速从海量日志中定位问题
linux
_Power_Y39 分钟前
Linux&git入门&设计模式(常考点)
linux·git·设计模式
海蓝可知天湛43 分钟前
Ubuntu24.10禁用该源...+vmware无法复制黏贴“天坑闭环”——从 DNS 诡异解析到 Ubuntu EOL 引发的 apt 404排除折腾记
linux·服务器·安全·ubuntu·aigc·bug
vvw&44 分钟前
如何在 Ubuntu 24.04 上安装和使用 AdGuard
linux·运维·服务器·ubuntu·adguard
weixin_453253651 小时前
python+playwright自动化如何解决文件上传问题
运维·自动化
King's King1 小时前
超详细的自动化立体仓库技术标书-模板
运维·自动化