2010-12-16 433 views
14
iostat -x -d 

可以显示许多I/O统计信息。 对于UTIL的iostat中,解释是:在此期间,I/O请求被发送到设备(频带宽度利用率的装置)如何计算iostat的util?

百分比CPU的时间。当此值接近100%时发生设备饱和

我想知道util是如何计算的?

我做了一个实验(参见下面的代码),启动40个线程来随机读取40个文件。我想磁盘util应该很高,但我错了,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; 
} 
+0

格式完全改变,溢出应该改进编辑器。 – Raymond 2010-12-16 06:52:45

+0

溢出救援!改进完成! – zengr 2010-12-16 06:56:18

+0

要么查看@zengr对您的问题所做的更改,要么阅读格式帮助:http://stackoverflow.com/editing-help – 2010-12-16 07:02:44

回答

17

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

忙被计为至deltamsTicks%的比率,限制到100%

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

DeltaMS是su系统负载的时间(用户时间+系统时间+空闲时间+ 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; 

蜱 - 是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); 

而且有tot_ticks从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从读 “sysfs的STAT为当前块的设备或分区” 在read_sysfs_file_statiostat.c:487)填充,并ioiioj和是当前和以前的统计。

+0

非常感谢,但我不知道如何接受您的答案? – Raymond 2010-12-31 08:21:17

+0

@雷蒙德,你知道了,“队列中的请求时间”是什么意思?我无法完全理解这个参数,但我认为这是类似于发布和执行磁盘请求之间的平均时间。 – osgx 2010-12-31 18:51:04

+0

但是... OP问题的答案是什么?我想磁盘util应该非常高,但是我我错了,iostat很低,任何人都可以解释为什么?' – max 2017-06-30 17:40:31

8

iostat -x(我用了一个旧source code意识到这一点之前写这个了)显示从/proc/diskstats(记录here/proc/stat信息(用于CPU倍;见man proc(5))(和其他几个人,但是这并不重要,理解) 。

你可以看到代码中的相关片段中osgx的答案,但在隔离我不能让他们的感觉,所以这里是一个扩展的解释:

  • %util = blkio.ticks/deltams * 100%
  • deltams是因为经过的时间上次快照以毫秒为单位它使用来自/proc/stat的CPU统计信息,可能是因为它比依靠系统时间提供更好的结果,但我不确定。 (附注:由于某种原因,时间由HZ分,而documentation指出它在USER_HZ,我不明白这一点。)
  • blkio.ticks是“花在I/O的毫秒#”,从/proc/diskstats docs

    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. 
    

    即我的理解是ticks是滴答数,当任何I/O请求(此装置)正在进行乘以蜱之间的持续时间。

所以%util = 100%意味着每当内核看(我想这是对现代内核每秒1000次,请参阅“HZ”),一个I/O请求正在进行中。

下面是摘录自another post on iostat

[%util的是]多少时间做的存储设备具有优秀的工作(繁忙)。

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

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

+1

如果在所有iostat样本上可以看到平均队列大小(avgqu-sz)大于1(比如可以说100秒内的1秒样本),那么这是否意味着100秒内100%的利用率呢?因为具有较大的队列大小意味着设备有足够的I/O来处理。 – 2014-12-10 10:38:23

2

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

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

iostat -x. 

尝试:

iostat -dmx 1 5 

它会给你五线与线之间的一秒之差。放弃第一个,看看别人,也许就像输出会更有意义。

0

%UTIL意味着花了多少时间写/每单位阅读的时候,你可以从平均服务时间计算它:

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

因此0.05%

我没有看过你的代码,但显然每秒钟读或写的速度不会超过1次,因此不会加载太多的磁盘!