web-dev-qa-db-ja.com

iostatのutilはどのように計算されますか?

iostat -x -d 

多くのI/O統計情報を表示できます。 iostatのutilの場合、説明は次のとおりです。

I/O要求がデバイスに発行されたCPU時間のパーセンテージ(デバイスの帯域幅使用率)。この値が100%に近い場合、デバイスの飽和が発生します

Utilがどのように計算されたか知りたいですか?

私は実験を行い(次のコードを参照)、40スレッドを開始して40ファイルをランダムに読み取ります。ディスクユーティリティは非常に高いはずだと思いますが、私は間違っています。iostatは次のとおりです。誰でも理由を説明できますか?どうも

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;
}
15
Raymond

_%util_は、iostatのソースコードでbusyという名前が付けられています: https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#38

ビジーは、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;
_

ティック-期間の_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_ticks_は、_read_sysfs_file_stat_( iostat.c:487 )の「sysfsstat for current block device orpartition」から読み取られます。 、およびioiiojは、現在および以前の統計です。

20
osgx

iostat -x(私は古い ソースコード を使用してこれを実現する前に記述しました)/proc/diskstats(文書化された ここ )および/proc/stat(CPU時間について; を参照)からの情報を表示しますman proc(5) )(および他のいくつかですが、それは理解にとって重要ではありません)。

Osgxの回答で関連するコードスニペットを見ることができますが、それらを単独で理解することはできなかったので、ここに詳細な説明があります。

  • %util = blkio.ticks / deltams * 100%
  • deltamsは、最後のスナップショットからの経過時間(ミリ秒単位)です。 /proc/statのCPU統計を使用しているのは、おそらくシステム時間に依存するよりも良い結果が得られるためですが、確かなことはわかりません。 (補足:何らかの理由で、時間はHZで除算されますが、 documentationUSER_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%は、カーネルが検索されるたびに(最近のカーネルでは、1秒あたり1000回だと思います。「HZ」を参照)、I/O要求が進行中であったことを意味します。

これは iostatに関する別の投稿 からの抜粋です:

[%util is]ストレージデバイスが未処理の作業を行った時間(ビジーでした)。

適切なRAID環境では、「RAIDアレイ内の少なくとも1つのディスクが何かをするのにどれくらいの時間がかかったか」のようなものです。ここでは、あらゆる種類のキャッシュを意図的に除外しています。リクエストをキャッシュから処理できる場合、他の値とは異なり、%utilに表示される可能性はごくわずかです。

これが意味すること– RAIDサブシステムは6.25%(1つのディスクが作業を行う)から100%(すべてがビジー)までロードできます。それは「100%」という単一の値についての非常に多くの洞察ですよね?

9
Nickolay

Manページによると、iostatの結果の最初の行は、システムが起動された瞬間からの平均です。

私のテストから、これは、たとえば次のように呼び出された場合、唯一の行にも当てはまるようです。なので

iostat -x.

試してください:

iostat -dmx 1 5

それはあなたに5つの線を与えます、線の間の1秒の違い。最初のものを破棄し、他のものを見てください。おそらく、出力がより意味をなすようになります。

2
Wences

%utilは、単位時間あたりの書き込み/読み取りに費やされた時間を意味します。平均サービス時間から計算できます。

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

したがって0.05%

私はあなたのコードを読んでいませんが、明らかに1秒あたり1回未満の読み取りまたは書き込みでは、ディスクをそれほどロードしていません!

1
phil_w