如何计算iostat的util?

时间:2010-12-16 06:51:50

标签: linux linux-kernel linux-device-driver

iostat -x -d 

可以显示许多i / o统计信息。 对于iostat的util,解释是:

  

向设备发出I / O请求的CPU时间百分比(设备的带宽利用率)。当此值接近100%

时,会发生设备饱和

我想知道如何计算util?

我做了一个实验,(参见下面的代码),启动40个线程来随机读取40个文件。我想磁盘工具应该很高,但我错了, iostat如下,任何人都能解释为什么? THX

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdb1              0.01     0.44  0.24  0.57     3.44     8.14    14.34     0.00    2.28   0.66   0.05

代码:

#include <iostream>
#include <fstream>
#include <pthread.h>

using namespace std;

void* work(void* a)
{
    int* id = (int*)a;
    string file = "sys.partition";
    char buf[100];
    sprintf(buf, "%d", *id);
    file.append(string(buf));
    ifstream in(file.c_str());
    in.seekg(0, ios_base::end);
    size_t len = in.tellg();

    cout << "open file : " << file << " , " << len << endl;
    srand(time(NULL));

    while(true)
    {
        size_t pos = rand() % len;
        in.seekg(pos);
        //cout << pos << endl;
        in.read(buf, 10);
        system("sync");
    }
    in.close();
}

int main(int argc, char** argv)
{
    static const int num = 40;
    pthread_t threads[num];
    for (int i = 0; i < num; i++)       {
        pthread_create(&threads[i], NULL, work, &i);
    }
    for (int i = 0; i < num; i++)       {
        pthread_join(threads[i], NULL);
    }
    return 0;
}

4 个答案:

答案 0 :(得分:19)

%util在iostat的源代码中被命名为busy:https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380

忙碌计为Ticksdeltams的百分比,限制为100%

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

DeltaMS是系统负载的总和(用户时间+系统时间+空闲时间+ 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 - 是期间的Time of requests in queue

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

在更新的sysstat版本中,代码有点不同: 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填入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);

还有来自iostat.c的tot_ticks的填充

  * @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_ticksread_sysfs_file_stat ioiiostat.c:487)和ioj和{{{1}}中的“ sysfs stat for current block device or partition ”中读取{1}}是当前和之前的统计信息。

答案 1 :(得分:9)

iostat -x(我在使用它之前使用旧的source code进行了编写)显示来自/proc/diskstats(已记录here)和/proc/stat的信息(对于%util = blkio.ticks / deltams * 100% CPU时间;请参阅man proc(5))(以及其他一些内容,但这对于理解并不重要)。

你可以在osgx的答案中看到相关的代码片段,但我无法孤立地理解它们,所以这里有一个扩展的解释:

  • deltams
  • /proc/stat是自上次快照以来经过的时间(以毫秒为单位)。它使用来自HZ的CPU统计数据,大概是因为它提供了比依赖系统时间更好的结果,但我不确定。 (旁注:由于某种原因,时间除以USER_HZ,而documentation表示它位于blkio.ticks,我不明白。)
  • Field 9 -- # of I/Os currently in progress The only field that should go to zero. Incremented as requests are given to appropriate struct request_queue and decremented as they finish. Field 10 -- # of milliseconds spent doing I/Os This field increases so long as field 9 is nonzero. 是来自/proc/diskstats docs的“执行I / O的毫秒数”:

    ticks

    即。我的理解是%util = 100%是任何I / O请求(对于此设备)正在进行时的滴答数乘以滴答之间的持续时间。

所以{{1}}意味着每次内核看起来(我想现代内核每秒1000次,见“HZ”),I / O请求正在进行中。

以下摘自another post on iostat

  

[%util is]存储设备有多少时间工作(忙碌)。

     

在适当的RAID环境中,它更像是“RAID阵列中至少有一个磁盘需要多长时间才能完成”。我故意在这里排除任何类型的缓存 - 如果请求可以从缓存中提供,那么它在%util中显示的几率可以忽略不计,与其他值不同。

     

这也意味着 - RAID子系统可以从6.25%(一个执行工作的磁盘)加载到100%(所有这些都忙)。那就是'100%'单一价值的相当多的洞察力,不是吗?

答案 2 :(得分:2)

根据手册页,iostat的第一行结果是系统启动时的平均值。

从我的测试来看,这似乎也适用于唯一的一行,如果被调用,例如如

iostat -x.

尝试:

iostat -dmx 1 5

它将为您提供五行,每行之间有一秒的差异。抛弃第一个,看看其他的,也许就像输出会更有意义。

答案 3 :(得分:1)

%util表示每单位时间写入/读取的时间,您可以从平均服务时间计算:

svctm  * (  r/s + w/s )  /1000 
= 0.66 *(0.24 + 0.57) /1000
= 0.0005346 

因此0.05%

我没有读过您的代码,但显然每秒读取或写入次数少于1次,因此不会加载磁盘!