How the util of iostat is computed?

前端 未结 4 1374
失恋的感觉
失恋的感觉 2021-01-30 11:49
iostat -x -d 

can display many i/o statistic info. For util of iostat, the explanation is :

Percentage of CPU time during whic

4条回答
  •  醉酒成梦
    2021-01-30 12:25

    %util is named busy in the source code of iostat: https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380

    Busy is counted as percent ratio of Ticks to deltams, limited to 100%

    busy = 100.0 * blkio.ticks / deltams; /* percentage! */
    if (busy > 100.0) busy = 100.0;
    

    DeltaMS is sum of system load for the period of time (user time + system time + idle time + iowait)/ ncpu.

    double deltams = 1000.0 *
            ((new_cpu.user + new_cpu.system +
              new_cpu.idle + new_cpu.iowait) -
             (old_cpu.user + old_cpu.system +
              old_cpu.idle + old_cpu.iowait)) / ncpu / HZ;
    

    Ticks - is the Time of requests in queue for the period

    blkio.ticks = new_blkio[p].ticks
                    - old_blkio[p].ticks;
    

    In more current version of sysstat the code is bit different: http://sources.debian.net/src/sysstat/10.2.0-1/iostat.c#L959

    /*       rrq/s wrq/s   r/s   w/s  rsec  wsec  rqsz  qusz await r_await w_await svctm %util */
    printf(" %8.2f %8.2f %7.2f %7.2f %8.2f %8.2f %8.2f %8.2f %7.2f %7.2f %7.2f %6.2f %6.2f\n",
    ...
           /*
            * Again: Ticks in milliseconds.
            * In the case of a device group (option -g), shi->used is the number of
            * devices in the group. Else shi->used equals 1.
            */
           shi->used ? xds.util / 10.0 / (double) shi->used
                     : xds.util / 10.0);    /* shi->used should never be null here */
    

    xds is filled in the compute_ext_disk_stats(&sdc, &sdp, itv, &xds); http://sources.debian.net/src/sysstat/10.2.0-1/common.c?hl=679#L679

    /*
     * Macros used to display statistics values.
     *
     * HZ is 1024 on IA64 and % should be normalized to 100.
     */
    #define S_VALUE(m,n,p)  (((double) ((n) - (m))) / (p) * HZ)
    
    xds->util  = S_VALUE(sdp->tot_ticks, sdc->tot_ticks, itv);
    

    And there is the filling of tot_ticks from iostat.c

      * @ioi        Current sample statistics.
      * @ioj        Previous sample statistics.
      * @itv        Interval of time.
      ...
    
    sdc.tot_ticks = ioi->tot_ticks;
    sdp.tot_ticks = ioj->tot_ticks;
    

    tot_ticks are read from "sysfs stat for current block device or partition" in read_sysfs_file_stat (iostat.c:487), and ioi and ioj are current and previous stat.

提交回复
热议问题