1. 程式人生 > 實用技巧 >Linux伺服器I/O效能分析-3

Linux伺服器I/O效能分析-3

一、通過指令碼分析IO的讀/寫數量、最大延遲、延遲的分佈情況、塊大小及數量

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

if [ $UID != "0" ];then
  echo "Please use the root."
  exit 1
fi


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

DEVICE_NAME=$1

#blkparse -i $DEVICE_NAME | sort -g -k8 -k10 -k4 | awk '
cat /tmp/test1.txt | 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("========\nResult:\n========\n");

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

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

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

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

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