Linux服务器I/O性能分析-3

一、通过脚本分析IO的读/写数量、最大延迟、延迟的分布情况、块大小及数量

#!/bin/sh
#
# File Name :  count_io.sh
# Time      :  2020-07-29-11:24:28
# Author    :  Lucky
# QQ        :  1151574975

if [ $UID != "0" ];then
  echo "Please execute as root user."
  exit 1
fi

if [ $# -ne 1 ];then
  echo "Usage: $0 <block_device_name>"
  exit 1
fi

if [ ! -b $1 ];then
  echo "Can't find block device"
  exit 1
fi

DEVICE_NAME=$(basename $1)

blkparse -i $DEVICE_NAME | sort -g -k8 -k10 -k4 | awk '
BEGIN{
  total_read=0;
  total_write=0;
  maxwait_read=0;
  maxwait_write=0;
}

# 计算Q--C中间的IO等待延时,此处Q赋值
{
  if ($6=="Q") {
    start_time=$4;
    block=$8;
    update_block=$10;
    action=$7;
  };
  # 此处C值比较,得出IO等待值
  if ($6=="C" && $8==block && $10==update_block && $7==action) {
    await=$4-update_block;

    # IO读等待赋值
    if (action=="R") {
     if (await>maxwait_read) maxwait_read=await;
       total_read++;

       read_count_block[update_block]++;

       if (await>0.001) read_count1++;
       if (await>0.01) read_count10++;
       if (await>0.02) read_count20++;
       if (await>0.03) read_count30++;
    }

   # IO写等待赋值
   if (action=="W") {
    if (await>maxwait_write) maxwait_write=await;
      total_write++;

      write_count_block[update_block]++;

      if (await>0.001) write_count1++;
      if (await>0.01) write_count10++;
      if (await>0.02) write_count20++;
      if (await>0.03) write_count30++;
                }
   }

} END {
        printf("========
Result:
========
");

        printf("total number of reads: %d
", total_read);
        printf("total number of writes: %d
", total_write);

        printf("slowest read : %.6f second
", maxwait_read);
        printf("slowest write: %.6f second
", maxwait_write);

        printf("reads
> 1ms: %d
>10ms: %d
>20ms: %d
>30ms: %d
", read_count1, read_count10, read_count20, read_count30);
        printf("writes
> 1ms: %d
>10ms: %d
>20ms: %d
>30ms: %d
", write_count1, write_count10, write_count20, write_count30);

        printf("
block size:%16s
","Read Count");
        for (i in read_count_block)
          printf("%10d:%16d
", i, read_count_block[i]);

        printf("
block size:%16s
","Write Count");
        for (i in write_count_block)
          printf("%10d:%16d
", i, write_count_block[i]);
}'

1.1 执行结果

  • IO空闲状态如下:
# ./count_io.sh /dev/sda
========
Result:
========
total number of reads: 0
total number of writes: 0
slowest read : 0.000000 second
slowest write: 0.000000 second
reads
> 1ms: 0
>10ms: 0
>20ms: 0
>30ms: 0
writes
> 1ms: 0
>10ms: 0
>20ms: 0
>30ms: 0

block size:      Read Count

block size:     Write Count
  •  IO繁忙时看数值变化即可

  

原文地址:https://www.cnblogs.com/zhangweiyi/p/13398120.html