磁盘-IO

1.iostat

iostat [选项] [时间间隔] [次数]

选项:
    -c:仅显示 CPU 使用情况统计。
    -d:仅显示磁盘使用情况统计。
    -x:显示详细的设备统计。
    -m:所有尺寸信息以 MB 单位显示。
    -p [设备]:显示指定磁盘分区的统计信息,没有指定设备时显示所有分区信息。
    -t:在输出中包含时间戳信息。
    -h:输出以更容易阅读的格式显示。
    -V:显示程序版本。
#展示所有设备的简要 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
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.排查命令

top
htop
iotop
    #判断哪个进程IO高
iostat -x 1
vmstat 1
    #查看磁盘的读写情况
lsof -p $pid
    #根据进程查看调用了哪些文件
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 的统计数据。
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

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压力,解决问题
11-19
在数据库操作中,“non-IO” 通常指的是不涉及磁盘输入输出(Input/Output)的操作。数据库性能问题可以分为 **IO 密集型** 和 **non-IO(非IO)密集型** 两大类。你提到的 “non-io” 慢,表示数据库操作变慢的原因不是磁盘读写问题,而是其他非IO相关的因素。 --- ### 常见的 non-IO 慢原因包括: #### 1. **SQL 查询逻辑复杂** - 比如使用了多层嵌套查询、大量 `JOIN`、子查询或未使用索引的 `WHERE` 条件。 - 即使数据量不大,也可能导致 CPU 计算压力大,查询变慢。 #### 2. **未使用索引或索引失效** - 查询字段没有合适的索引,导致全表扫描。 - 或者虽然有索引,但因为查询语句不规范(如使用 `LIKE '%abc'`),导致索引失效。 #### 3. **大量数据在内存中处理** - 比如排序(`ORDER BY`)、分组(`GROUP BY`)、去重(`DISTINCT`)等操作需要在内存中进行大量计算。 - 如果数据量大或内存不足,会导致性能下降。 #### 4. **锁竞争或事务冲突** - SQLite 是文件级锁,在并发访问时可能出现写锁等待。 - 即使没有 IO 问题,也可能因为事务处理不当导致阻塞。 #### 5. **数据库连接或语句未复用** - 每次操作都重新打开连接或编译 SQL 语句,增加了额外开销。 - 推荐使用连接池或 `PreparedStatement`。 #### 6. **触发器或约束检查开销大** - 如果表上定义了复杂的触发器(Triggers)或外键约束(Foreign Keys),每次操作都可能带来额外的 CPU 消耗。 --- ### 如何定位 non-IO 慢的问题? 1. **查看执行计划(EXPLAIN QUERY PLAN)** ```sql EXPLAIN QUERY PLAN SELECT * FROM table_name WHERE column = 'value'; ``` 可以看到是否使用了索引、是否进行了全表扫描。 2. **使用 Profiling 工具** - Android 中可以使用 `Debug.startMethodTracing()` 或者 `Systrace` 工具分析方法耗时。 - 在 SQLite 中也可以启用 `sqlite3_trace()` 来跟踪 SQL 执行。 3. **日志分析** - 查看是否有频繁的锁等待、事务回滚等现象。 --- ### 优化建议 - 使用索引优化查询速度。 - 避免复杂 SQL,拆分大查询。 - 使用事务批量处理数据。 - 复用数据库连接和语句对象。 - 减少不必要的排序和分组。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值