2010-12-16 95 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次,因此不會加載太多的磁盤!