GNU/Linux >> Linux の 問題 >  >> Linux

iostat の使用率はどのように計算されますか?

iostat -x (これに気付く前に古いバージョンのソース コードを使用してこれを記述しました) /proc/diskstats からの情報を表示します (ドキュメントはこちら) および /proc/stat (CPU 時間については、man proc(5) を参照してください) (他にもいくつかありますが、理解する上では重要ではありません)。

関連するコードのスニペットは osgx の回答で確認できますが、それらを単独で理解することはできませんでした。そのため、詳細な説明を次に示します。

  • %util = blkio.ticks / deltams * 100%
  • deltams 最後のスナップショットからの経過時間 (ミリ秒)。 /proc/stat からの CPU 統計を使用します おそらく、システム時間に依存するよりも良い結果が得られるためですが、確かなことはわかりません。 (補足:何らかの理由で時間が HZ で割られています 、ドキュメントには USER_HZ であると記載されていますが、 、それはわかりません。)
  • blkio.ticks /proc/diskstats より、「I/O に費やされたミリ秒数」です。 ドキュメント:

    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%」という単一の値でかなり多くの洞察が得られますよね?


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

ビジーは Ticks の割合としてカウントされます deltams へ 、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現在のブロック デバイスまたはパーティションの sysfs stat から読み取られます。 " read_sysfs_file_stat で (iostat.c:487)、および ioi および ioj 現在および以前の統計です。


Linux
  1. Linuxgrepコマンドの使用方法

  2. Linuxでhistoryコマンドを使用する方法

  3. basenameコマンドの使用方法は?

  1. ホスト名を変更する方法は?

  2. Hudを呼び出す方法は?

  3. ターミナルでHZを確認するには?

  1. Linuxがメインフレームに登場した経緯

  2. 自分のディレクトリにR3.3.1をインストールする方法は?

  3. rpm の内容を抽出するにはどうすればよいですか?