iostat を使用して Linux ハードディスクの IO パフォーマンスを表示する方法

iostat を使用して Linux ハードディスクの IO パフォーマンスを表示する方法

TOP 観察: IO 待機に占められる CPU 時間の割合。30% を超えると、IO の負荷が高くなります。次に、iostat -x 1 10 を使用します。

[ルート@コントローラー ~]#iostat -d -k 1 10
デバイス: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
19.00 0.00 112.00 0 112
sda1 0.00 0.00 0.00 0 0
sda2 0.00 0.00 0.00 0 0
sda3 0.00 0.00 0.00 0 0
sda4 0.00 0.00 0.00 0 0
sda5 3.00 0.00 16.00 0 16
sda6 0.00 0.00 0.00 0 0
sda7 16.00 0.00 96.00 0 96

tps: デバイスの 1 秒あたりの送信回数。1 回の送信は「1 回の I/O 要求」を意味します。

  • kB_read/s: デバイスから1秒あたりに読み取られるデータの量
  • kB_wrtn/s: 1秒あたりにデバイスに書き込まれるデータの量
  • kB_read: 読み取られたデータの合計量
  • kB_wrtn: 書き込まれたデータの総量

詳細情報を取得するには -x を使用してください

詳細情報を取得するには -x を使用してください

デバイスの使用状況 (%util) と応答時間 (await) を表示します。

[ルート@コントローラー ~]#iostat -d -x -k 1 10
デバイス: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
0.00 22.00 0.00 18.00 0.00 160.00 17.78 0.07 3.78 3.78 6.80
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda3 0.00 15.00 0.00 2.00 0.00 68.00 68.00 0.01 6.50 6.50 1.30
sda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda7 0.00 7.00 0.00 16.00 0.00 92.00 11.50 0.06 3.44 3.44 5.50
  • rrqm/s: 1 秒あたりのマージ読み取り操作の数。つまり、delta(rmerge)/s
  • wrqm/s: 1 秒あたりのマージ書き込み操作の数。つまり、delta(wmerge)/s
  • r/s: 1 秒あたりに完了した読み取り I/O デバイスの数。それはデルタ(リオ)/sです
  • w/s: 1 秒あたりに完了した書き込み I/O デバイス操作の数。つまり、デルタ(wio)/s
  • rsec/s: 1 秒あたりに読み取られるセクター数。つまり、delta(rsect)/s
  • wsec/s: 1 秒あたりに書き込まれるセクター数。つまり、delta(wsect)/s
  • rkB/s: 1 秒あたりに読み取られる K バイト。各セクター サイズは 512 バイトなので、rsect/s の半分になります。 (計算が必要です)
  • wkB/s: 1 秒あたりに書き込まれる K バイト数。 wsect/s の半分です。 (計算が必要)
  • avgrq-sz: デバイス I/O 操作あたりの平均データ サイズ (セクター)。デルタ(rsect+wsect)/デルタ(rio+wio)
  • avgqu-sz: 平均 I/O キューの長さ。つまり、delta(aveq)/s/1000 です (aveq はミリ秒単位であるため)。
  • await: 各デバイス I/O 操作の平均待機時間 (ミリ秒単位)。つまり、デルタ(ruse+wuse)/デルタ(rio+wio)
  • svctm: 各デバイス I/O 操作の平均サービス時間 (ミリ秒単位)。つまり、デルタ(使用)/デルタ(リオ+wio)
  • %util: 1 秒あたりの何パーセントが I/O 操作に使用されているか、または 1 秒あたりに I/O キューが空でない時間の長さ。つまり、デルタ(使用)/秒/1000(使用単位はミリ秒であるため)

%util が 100% に近い場合、生成される I/O 要求が多すぎること、I/O システムがすでに完全にロードされていること、およびディスクにボトルネックがある可能性があることを意味します。

アイドルが 70% 未満の場合、IO 圧力は比較的高く、一般的に読み取り速度の待機が多くなります。

vmstatを使用してbパラメータ()とwaパラメータ()を表示することもできます。

参照することもできます

svctm は通常、await よりも小さくなります (同時に待機している要求の待機時間が繰り返しカウントされるため)。svctm のサイズは、通常、ディスク パフォーマンスに関連します。CPU/メモリ負荷も影響します。要求が多すぎると、間接的に svctm が増加します。待機のサイズは通常、サービス時間 (svctm) だけでなく、I/O キューの長さや I/O 要求の発行パターンによっても異なります。 svctm が await に近い場合、I/O の待機時間がほとんどないことを意味します。await が svctm よりはるかに大きい場合は、I/O キューが長すぎてアプリケーションの応答時間が遅いことを意味します。応答時間がユーザーの許容範囲を超える場合は、より高速なディスクの交換、カーネル エレベータ アルゴリズムの調整、アプリケーションの最適化、または CPU のアップグレードを検討できます。

キューの長さ (avgqu-sz) もシステム I/O 負荷を測定する指標として使用できますが、avgqu-sz は単位時間あたりの平均値であるため、瞬間的な I/O フラッドを反映することはできません。

他にも良い例があります。(I/O システムとスーパーマーケットの行列)

たとえば、スーパーでレジに並んでいるとき、どのレジカウンターに行くかをどのように決めますか?まず見るのは、列に並んでいる人の数です。5人の方が20人より早いですよね?人数を数えることに加えて、私たちは前に並んでいる人がどれだけ買ったかを見ることがよくあります。私たちの前に1週間分の食料を買っているおばさんがいたら、列を変えることを検討できます。もう一つはレジのスピードです。お金を数えることすらできない初心者に出会ったら、待たされることになります。また、タイミングも非常に重要です。5分前まで混雑していたレジカウンターが今は空いているかもしれません。このタイミングで支払いをするのはとても気持ちが良いものです。もちろん、この5分間で何をしたかの方が、列に並ぶことより有意義であることが前提です(でも、列に並ぶことより退屈なことは他に思い当たりません)。

I/O システムには、スーパーマーケットの行列との類似点も数多くあります。

  • r/s+w/sは受取人の合計数に似ている
  • 平均待ち行列の長さ (avgqu-sz) は、単位時間あたりの待ち行列内の平均人数に似ています。
  • 平均サービス時間(SVCTM)はレジ係の回収速度とほぼ同じです
  • 平均待ち時間(待機)は、1人あたりの平均待ち時間とほぼ同じです。
  • 平均 I/O データ (avgrq-sz) は、各人が購入する物の平均量に似ています。
  • I/O 操作率 (%util) は、レジに行列ができている時間の割合に似ています。

このデータを使用して、I/O 要求パターン、I/O 速度、応答時間を分析できます。

%util: 統計時間中のすべての IO 処理時間を合計統計時間で割った値。たとえば、統計間隔が 1 秒で、デバイスが 0.8 秒間 IO を処理し、0.2 秒間アイドル状態の場合、デバイスの %util = 0.8/1 = 80% となり、このパラメーターはデバイスのビジー状態を示します。通常、このパラメータが 100% の場合、デバイスがほぼ全容量で動作していることを意味します (もちろん、複数のディスクがある場合、%util が 100% であっても、ディスクの同時実行機能により、ディスク使用率が必ずしもボトルネックに達するとは限りません)。

プログラムを導入する際(リアルタイムでログをアップロードするプログラムをテストしました)、システムの効率的な動作を確保するために、システムの CPU、メモリ、IO などを考慮する必要があります。

プログラム自体が非常に小さなパケットを処理し、多くのイベントがあり、プレッシャーが高く、間隔がない場合、CPU リソースを大量に占有することになります。

メモリ キャッシュの代わりにディスク キャッシュを使用すると、ブレークポイントの再送信をサポートして、信頼性の高いデータ アップロードを確保できます。突然の停電が発生した場合でも、ディスク キャッシュに保存されているデータは回復後にアップロードされ、失われることはありません。ただし、ディスクの読み取りと書き込みの回数はそれに応じて増加します。データ量が比較的少ない場合、速度はまだ許容範囲内です。

以下は、他の人が書いたこのパラメータ出力の分析です。

# iostat -x 1
平均CPU: %user %nice %sys %idle
16.24 0.00 4.31 79.44
デバイス: rrqm/s wrqm/sr/sw/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p1 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

上記の iostat 出力は、1 秒あたり 28.57 回のデバイス I/O 操作があることを示しています。合計 IO (io)/s = r/s (読み取り) + w/s (書き込み) = 1.02 + 27.55 = 28.57 (回/秒)、そのうち書き込み操作が大部分を占めています (w:r=27:1)。

平均すると、各デバイスの I/O 操作は完了するのに 5 ミリ秒しかかかりませんが、各 I/O 要求は 78 ミリ秒待機する必要があります。なぜでしょうか? I/O 要求が多すぎるためです (1 秒あたり約 29 件)。これらの要求が同時に発行されると仮定すると、平均待機時間は次のように計算できます。

平均待ち時間 = 単一 I/O サービス時間 * (1 + 2 + ... + リクエストの総数 - 1) / リクエストの総数

上記の例に適用すると、平均待機時間 = 5ms*(1+2+…+28)/29=70ms となり、これは iostat によって示された平均待機時間 78ms に非常に近くなります。これは、I/O が同時に開始されたことを示します。

1 秒あたりに発行される I/O 要求は多数 (約 29) ありますが、平均キューは長くありません (約 2 のみ)。これは、これらの 29 個の要求の到着が均一ではなく、I/O がほとんどの時間アイドル状態であることを示しています。

1 秒間に 14.29% の時間、I/O キューにリクエストが存在し、これは 85.71% の時間、I/O システムが何もしていないことを意味します。29 個の I/O リクエストはすべて 142 ミリ秒以内に処理されます。

delta(ruse+wuse)/delta(io) =await=78.21=>delta(ruse+wuse)/s=78.21*delta(io)/s= 78.21*28.57=2232.8 であり、1 秒あたりの I/O 要求は合計 2232.8 ミリ秒待機する必要があることを示しています。したがって、平均キュー長は 2232.8ms/1000ms = 2.23 になるはずですが、iostat によって提供される平均キュー長 (avgqu-sz) は 22.35 です。なぜでしょうか? iostat にバグがあるため、avgqu-sz 値は 22.35 ではなく 2.23 になるはずです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux IO 多重化 epoll ネットワーク プログラミング
  • Linuxコマンドiostatの詳しい説明
  • Linux IO のレベルトリガーとエッジトリガーの違い
  • Linux のソケット IO モデルの興味深い説明
  • Linux シェルプログラミングにおける IO、条件、ループ処理の詳細に関する議論
  • Linux でディスク IO を表示し、読み取りと書き込みで高い IO を占有するプロセスを見つけます。
  • Linux IOの詳細な紹介

<<:  期間限定フラッシュセール機能を実装するJavaScript

>>:  MySQL での重複キー更新時の replace into と insert into の使用法と相違点の分析

推薦する

mysqlとnavicat間の接続を確立する際の1251エラーを解決する

コンピュータを再インストールし、最新バージョンのMySQLデータベースをインストールしました。その結...

MySQLキーワードDistinctの詳細な紹介

MySQLキーワードDistinctの使い方の紹介DDL SQLを準備します: テーブルテストを作成...

ログインフォームを実装するためのReactサンプルコード

Vue ユーザーとして、React を拡張する時が来ました。antd の導入、less と rout...

Linux 環境変数の設定方法のまとめ (.bash_profile と .bashrc の違い)

Linux では、アプリケーションをダウンロードしてインストールすると、起動時にアプリケーション名...

Vue3 ページ、メニュー、ルートの使用

目次1. メニューをクリックしてジャンプ1. ページ名の統一2. 管理ページを追加3. ルートを追加...

MySQL データベースの集計クエリと結合クエリ操作

目次1. クエリ結果を挿入する2. 集計クエリ2.1 はじめに2.2 集計関数2.3 group b...

Vueの監視方法のケースの詳細な説明

Vueでの監視方法時計知らせ名前: 監視する属性に同じ名前を付ける必要があります。 1. 機能Vue...

エラー 2002 (HY000): ソケット '/tmp/mysql.sock' 経由でローカル MySQL サーバーに接続できません

エラーメッセージ:エラー 2002 (HY000): ソケット '/tmp/mysql.so...

mysqlはコンマに基づいてデータ行を複数の行に分割します

目次分離効果コマンドラインの説明関与する機能分離効果-- 別居前1,2,3,4 -- 別居後1 2 ...

Windows 10 Home Edition に Docker をインストールする方法

最近、プロジェクトをアップグレードするために Docker を使用しました。これまで使用したことがな...

クリエイティブな会社概要ウェブページデザイン

ユニークな「About」ページ自分を他の人たちと差別化する素晴らしい方法は、本当にユニークな自己紹介...

HTML テーブル マークアップ チュートリアル (48): CSS で変更されたテーブル

<br />では、CSS 構文を巧みに使用してテーブルを美しくする方法を見てみましょう。...

CSS 疑似要素と疑似クラスの魔法のような使い方についての簡単な説明

CSS は Web ページで非常に重要な役割を果たします。近年の CSS の発展に伴い、疑似要素/疑...

MySQLのパスワードを忘れた場合の対処方法

MySQL パスワードを忘れた場合の解決策: [root@localhost ~]# mysql -...

HTML の META タグの使用に関するヒントの例

HTML メタタグHTML メタタグは、Web ページのコンテンツに関する情報をブラウザや検索エンジ...