...

iostatとvmstatによるサーバーI/O待ち解析:Linuxサーバーメトリクスの最適化

iostatとvmstatを使ったI/O待ち解析によって、どのようにボトルネックが可視化されるのか、また、どのLinuxサーバーのメトリクスが高速なレスポンスタイムを実現するのか、順を追って説明する。そうすることで、明確な閾値を設定し、典型的なパターンを解釈し、最適化のための具体的な対策を提案します。 入出力 そして CPU にある。

中心点

  • iostat そして vmstat は、CPUとストレージの負荷を補完するビューを提供する。.
  • ウエ 15-20%と 1TP3チュチール 80%経由はI/Oボトルネックを示している。.
  • 待つ そして avgqu-sz 待ち時間とキューについて説明する。.
  • エムピースタット は、CPUコアに不均等に分散した負荷を検出する。.
  • チューニング の範囲にある。 MySQL をカーネルのパラメータとストレージに追加する。.

LinuxサーバーにおけるI/Oウェイトとは?

I/O待ちでは、CPUは遅いメモリやネットワークデバイスを待っているため、ぼんやりと待っている。 ウエ-topやvmstatのようなツールでの値。私はこの割合を、スレッドがブロックしてリクエストが完了するのが遅くなる時間として評価する。10-20%を超える値は、多くの場合、完全に利用されていることを示す。 ストレージ-例えば、HDD、RAIDアレイ、NFSマウントが容量いっぱいまで使用されている場合などである。データベースのあるホスティング・セットアップでは、インデックスのないクエリや書き込みのピークは、データベース上で不要な待ち時間を増やす。 ディスク. .もしコンセプトをブラッシュアップしたいのであれば、以下のサイトで基本を学ぶことができる。 I/O 待機を理解する, 練習に行く前にね。.

クイックスタート:vmstatを正しく読む

vmstatを使えば、最も重要なことをチェックできる。 リナックス-そして、それほど労力をかけずに初期パターンを認識することができる。vmstat 1 10コールは10個のスナップショットを提供し、私は特にwa(I/Oウェイト)、bi/bo(ブロックI/O)、si/so(スワップ)の列に注目している。私の場合、boの値が高く、同時にwaが増加している場合は、多くの書き込みアクセスがブロックされていることを示し、バッファーの限界や低速なメディアを示すことが多い。si/soがゼロのままなのにwaが著しく上昇する場合、純粋なI/O待ちの疑いがある。 ストレージ-limitを使用する。マルチコアホストでは、vmstatとmpstat -P ALL 1を組み合わせている。I/O待ちが個々のコアにしか影響しないことが多いため、平均的には実際よりも無害に見えるからだ。.

CPUファインイメージ:us/sy/st、ランキュー、コンテキストスイッチ

vmstatとmpstatを使うと、次のようなことがわかります。 ウエハイ 私たち計算の多い」アプリケーション作業は、以下のセクションで紹介する、, sy はカーネル/ドライバーの作業を示す。 入出力. .仮想化環境では、私は次のことに注意している。 スト (スティール):st値が高いということは、VMがCPU時間を失っていることを意味し、同一のI/Oパターンでレイテンシを人為的に膨らませている。また、ラン・キュー(r vmstatで)とCPU数を比較した場合、rがCPU数より恒常的に高い場合は、CPUの混雑を示し、CPUの混雑を示さない。 ストレージ. .多くの文脈の変化 (cs)と小さな同期書き込みの組み合わせは、おしゃべりなI/Oパターンの指標となる。こうすることで、CPUの不足をI/Oの問題と誤解することを避けることができる。.

iostatを深く理解する:重要なメトリクス

iostat -x 1 で拡張されました。 ディスク-待ち時間、利用率、キューを明確に表すメトリクス。私は負荷ピークの計測を開始し、%util、await、svctm、avgqu-szを相関させ、原因と結果を区別する。%utilが90-100%に上昇し、awaitとavgqu-szも上昇した場合、私は飽和状態にあることを確認する。 プレート またはボリュームが制限されている。awaitが中程度の%utilで高い値を示した場合、私はキャッシュ、コントローラの制限、または個々の大きなリクエストによる干渉をチェックします。r/sとw/sは周波数をもたらし、MB_readとMB_wrtnは容量を説明し、専用SSDとNVMeセットアップの重要な比較値を提供してくれます。.

NVMe、SATA、RAID:%util、await、キューの深さの意味するもの

私はメディアの種類を厳密に区別している: HDD より高く見せる 待つ-頭の動きが支配的だからだ。. SSD/NVMeは並列度によってうまくスケールする。 avgqu-sz である限り、普通である。 待つ は制限内にとどまっています。アプリが十分な並列性を生成しなかったり、キューの深さ(nr_リクエスト, キュー深度)は小さすぎる。である。 RAID ランダムI/Oの散布でストライプサイズが小さすぎるかどうかをチェックする。 待つ そして 1TP3チュチール メンバーディスクに不均一に表示されます。そのため、ホットスポットを可視化するために、コンポジット・ボリューム上だけでなく、メンバー・デバイスごとにiostatを見ています。ログ構造化レイヤー(コピーオンライトなど)の場合、書き込みのレイテンシが若干高くなることが予想されますが、ライトバック・ウィンドウの拡大やアプリ側のバッチ処理でこれを補います。.

待ち時間の長い診断ワークフロー

各分析をvmstat 1とiostat -x 1で並行して開始し、CPUの状態とデバイスの状態を同期して見て、時間に割り当てることができるようにしている。その後、mpstat -P ALL 1を使って、個々のコアの動作が異常に高いかどうかを検証する。 ウエ これは、平均値が誤って解釈されるのを防ぐためである。原因の兆候がある場合は、pidstat -dまたはiotopを使用して、どのPIDが最も多くのI/Oシェアを使用しているかを正確に確認する。データベースのあるホスティング環境では、まずリードピークとライトピークを区別します。ライトバック戦略とfsyncパターンでは、発生する症状が大きく異なるため、ターゲットを絞って使用することができます。 対策 がそれを可能にする。ストレージに関するより詳細な質問については、以下のサイトにあるような概要を参照されたい。 ホスティングにおけるI/Oボトルネック, カーネルやファイルシステムをいじる前にね。.

仮想化とコンテナの明確な区分け

VMでは次のように考えている。 ウエ とともに スト (Steal)し、さらにハイパーバイザー上で測定する。 キュー が見える。ストレージ・アグリゲーション(シン・プロビジョニング、デデュープ、スナップショット)は、レイテンシのピークをスタック内に移動させる。 待つ がジャンプする一方で、%utilは目立たないままだ。コンテナでは 入出力 をCgroupルール(IOPS/スループット制限など)で設定する。 騒がしい隣人たち を手なずける。私は、測定値が再現可能で、アラームがそのコンテキストを保持するように、サービスごとにリミットを文書化します。重要 ウエ VMのバックアップは、ホスト全体のバックアップ、スクラブ、リビルドによってトリガーされる可能性があります。.

限界、閾値、次のステップ

私は、いくつかの明確な閾値を使って、本当のボトルネックがあるかどうかを判断し、パフォーマンスを顕著に安定させるためにどのようなアクションを取るべきかを決めています。HDDとNVMeでは同じ数値でも意味合いが異なるため、メディアの種類、ワークロード、レイテンシー要件を考慮に入れています。以下の表は、私がプレイブックで使用しているクイックガイドです。私は、異常値が誤ったアラームを発生させないように、また傾向を認識できるように、数分間に数回、負荷をかけて測定しています。反射的にハードウェアを交換したり、NVMeを交換したりするのではなく、的を絞ったアクションを取るための基礎として、これを使用しています。 パラメータ 大量にね。.

指標 しきい値 解釈 次のステップ
ウエ (vmstat) > 15-20% かなりのI/O待ち時間 iostatをチェックし、pidstat/iotopで原因を突き止め、キャッシュと書き込みを分析する。
1TP3チュチール (イオスタット) > 80-90% 使用デバイス キューの深さ、スケジューラー、RAID、SSD/NVMeをチェックする。
待つ (ミリ秒) > SSD>10~20ミリ秒、HDD>30~50ミリ秒 待ち時間の増加 ランダムとシーケンシャルを区別する。ファイルシステムのオプション、ライトバック、ジャーナリングをカスタマイズする。
avgqu-sz > 1-2持続性 キューが増える 並列性の調整/増加、アプリのI/Oパターンの最適化、コントローラーの限界チェック
シ/ソ (vmstat) 負荷時 > 0 ストレージのボトルネック RAMの増設、クエリ/キャッシュのチューニング、スワッピネス/メモリ制限のチェック

スタック内の原因:DB、ファイルシステム、仮想化

データベースでは、インデックスがない結合、小さすぎるバッファ、過剰なfsyncコールをよく見かける。 原因 高い待機値に対してクエリプランをチェックし、遅いステートメントのログをアクティブにし、InnoDBバッファプール、ログファイルサイズ、オープンファイルなどのサイズを客観的に調整します。ファイルシステム・レベルでは、マウント・オプション、ジャーナル・モード、RAIDストライプへのアライメントを調べます。仮想化セットアップでは、VM内の測定値だけに頼らず、ホストを調べます。 キュー が見えるようになった。これにより、重複排除、シンプロビジョニング、隣接VMの影響をアプリケーションパターンから明確に分離することができる。.

ファイルシステムとマウント・オプションの詳細

私は仕事量に照らしてファイルシステムを評価する: エクステンドフォー 順序付きモードまたはライトバックモードでは、書き込み強度の障壁を最小限に抑えることができる。 エックスエフエス は、並列ワークロード用のログ設計で得点を稼いでいる。以下のようなオプションがある。 ノータイム 或いは relatime メタデータの書き込みを減らす、, 怠け者 は、タイムスタンプの更新をバンドル内のライトバックに移動する。ジャーナリングでは、コミット間隔(commit=など)をチェックし、コントローラのキャッシュポリシーによって強制フラッシュ(バリア)が悪化していないかチェックします。RAIDでは、ストライプ(1MiBスタートのParted/FDISK)へのクリーンアライメントに注意します。 待つ シーケンシャルと思われるパターンであっても、Read-Modify-Writeを使う。データベースの場合、O_DIRECTや直接ログをフラッシュする戦略をよく使うが、ファイルシステムのキャッシュは、作業セットがその中に収まるなら、読み込み負荷を劇的に減らすことができるからだ。.

チューニング:カーネルからアプリまで

システム・レベルに着手する前に、例えばクエリのインデックス作成、バッチ書き込み、賢明なコネクション・プーリングの設定など、シンプルな勝利から始めます。ライトバックについては、vm.dirty_background_ratio、vm.dirty_ratio、vm.dirty_expire_centisecsを制御された方法で調整し、システムが連続的に書き込みを行い、メモリを詰まらせることなくブロッキングを少なくするようにする。ブロック・デバイスについては、I/Oスケジューラ、キューの深さ、リード・アヘッドなどをチェックする。RAIDコントローラでは、ストライプサイズとキャッシュポリシーを調整する。 SSDファームウェア、TRIM、一貫したオーバープロビジョニング設定のために/NVMe。各変更の後、私は次のステップに進む前に、vmstatとiostatで数分間、待ち時間が減少し、%utilが安定しているかどうかを確認します。.

割り込み、NUMA、アフィニティ

私はIRQ負荷とNUMAトポロジーをモニターしているが、どちらもレイテンシーに顕著な影響を与えるからだ。. NVMe-割り込みをアフィニティでコントローラのNUMAドメインのCPUにバインドし、データパスが短くなるようにしています。IRQストームがあるコアで実行されている場合、私は高い割り込みが発生するのを確認する。 sy 残りのCPUはアイドル状態のようだ;; エムピースタット がこれを暴露している。ディストリビューションがハードウェアにマッチしている場合のみirqbalanceを許可し、そうでない場合は特定のアフィニティーを設定する。また、アプリケーションとその 入出力 同じNUMAゾーン(ストレージの場所)で作業する場合、クロスソケットアクセスは次のような待ち時間を発生させるからです。 待つ をマスクすることができる。.

測定の自動化と可視化

トレンドを確実に認識するために、私は測定を自動化し、iostat/vmstatを監視ツールに統合して、履歴データを表示できるようにしている。 データ を保存します。アラームは控えめに設定し、例えば、いくつかの間隔でwa > 15%から、誤アラームを避けるためにawaitと%utilのしきい値と組み合わせます。全体的なメトリクス画面には、相関関係がすぐにわかるように、CPU、ストレージ、ネットワーク、アプリのメトリクスを並べたダッシュボードを使用しています。メトリクスの入門が必要な場合は、以下を参照してください。 サーバー・メトリクス 日々の仕事をコンパクトにまとめる。測定し、仮説を立て、調整し、また測定し、結果を分析する。 結果 の文書がある。.

fioによる再現可能な負荷テスト

実負荷がない場合、あるいは仮説を検証したい場合、私は短命の選手を使う。 fio-テスト。代表的なパターン(例:4kランダム・リード、64kシーケンシャル・ライト、70/30混合プロファイル)をシミュレートし、以下のように変化させた。 iodepth, の間のスイートスポット・ウィンドウを設定する。 待つ そしてスループット。結果を正しく分類できるように、本番データからテストパスを厳密に分離し、境界条件(ファイルシステム、マウントオプション、スケジューラー、キューの深さ)を記録しています。チューニング後、同じテストをリグレッションチェックとして使用する。 待つ そして 1TP3チュチール 一貫して見栄えを良くするために、私は表面に変化を加える。.

エラーパターンの認識:典型的なパターン

WAが高く、同時に%utileが高く、avgqu-szが増加している場合、すべてが飽和を支持している。 装置, すなわち、実際の物理的限界である。%utilが中程度でawait値が高い場合は、バリア、ライトスルー、散発的なフラッシュなど、コントローラやキャッシュの特異性を示す傾向がある。si/so値の上昇とキャッシュの窪みは、明らかにRAM不足を示し、I/Oを人為的に増大させ、待ち時間を増加させる。ディスクは目立たないが、アプリが大規模で同期負荷の高い書き込みをフレームする場合、私は作業を非同期書き込み、パイプライン化、または バッチ-メカニズム。NFSやネットワーク・ストレージのセットアップでは、レイテンシー、MTU、再送、サーバー側のキャッシュもチェックする。.

NFS/iSCSIと分散ストレージ

時点では ネットワークファイルシステム とiSCSIでは、デバイスとネットワークパスを区別している: iostat はブロック・レイヤが見ているものだけを示している。私はまた、ネットワーク・メトリクスによって再送、待ち時間、ウィンドウの問題を認識している。高い 待つ を、適度に 1TP3チュチール 仮想ブロックデバイス上でネットワークがストールしたり、サーバー側のキャッシュがクールダウンしたときに典型的です。NFSの場合はマウントオプション(rsize/wsize、proto、sync/async)とサーバーサイド(スレッド、エクスポートポリシー、キャッシュ)、iSCSIの場合はセッションとキューのパラメーターをチェックします。ピーク時に共有ストレージが飽和してサーバーが利用できなくならないように、サーバーのジョブ(スクラブ、リビルド、リバランシング)のメンテナンス・ウィンドウを計画します。 ウエ すべてのクライアントで。.

実践例:3つのショートシナリオ

執筆のヒントが詰まったブログクラスター

%utilが95%を維持する一方で、プライムタイムになると、コメントとキャッシュの無効化が増加し、iostatのawaitとavgqu-szが大幅に増加する。私はライトバック・パラメーターを緩やかに増やし、パス・レベルでのキャッシュ無効化を最適化し、InnoDBのログ・バッファーを増やして、小さな同期書き込みが少なくなるようにした。その後、awaitは著しく低下し、bo値は高いままだが、waは低下し、レスポンスタイムはすぐに短縮された。同時に、ジャーナル用のHDDをSSDに交換し、ボトルネックを解消した。このパターンは バッチ-文章を書くことと、より速く日記を書くことを組み合わせる。.

読書ピークと検索インデックスのあるショップ

プロモーションでは読み込み負荷が高く、R/Sは急上昇し、待ち時間は中程度にとどまるが、アプリはフィルターナビゲーションへの反応がまだ鈍い。私は、ファイルシステムのキャッシュワーキングセットを超える、適切なインデックスを持たない多くのバッファリングされていないクエリを認識しています。ターゲットを絞ったインデックス作成とクエリ書き換えにより、R/Sは低下し、ヒットはより頻繁にキャッシュに入り、iostatは同じスループットでより低いMB_readを確認した。同時に、シーケンシャル・スキャンをより効率的に処理するために、リード・アヘッドをわずかに増やし、レイテンシをさらに減らしている。このようにして 読む-パターンがまたキャッシュヒットにつながる。.

ノイジー・ネイバー」を持つVMホスト„

個々のVMでは、トップは高いWAを示していますが、VMのiostatは仮想デバイスの利用率を誤解させるような表示しかしていません。私はハイパーバイザー上でも測定し、飽和した実ブロックデバイスを確認し、原因として積極的なバックアップを行っている近隣のVMを特定しました。帯域幅を制限し、バックアップウィンドウを変更することで、ホスト全体の待ち時間と%utilが安定しました。その後、VM内とホスト上で再度測定を行い、双方の効果を確認し、防止しました。これにより、実際の デバイス-メトリックスは常にホストの真実を示している。.

次のインシデントのためのチェックリスト

シグナルが失われないように、まずログと計測を開始し、vmstat 1とiostat -x 1を数分間実行し続ける。その後、pidstat -dで個々のプロセスを特定し、仮説を立てる前に、アプリのイベントやシステムタイマーとピークを時間相関させる。次のステップでは、メモリ、スワップ、キャッシュのヒットをチェックし、RAM不足が誤って次のように認識されないようにする。 ディスク-という問題が現れる。原因を突き止めたときだけ、私はあることを正確に変更し、その設定をログに残し、await、%util、waへの影響を評価する。こうすることで、再現性のある分析を維持し、すべてのインシデントから学び、問題が解決するまでの時間を短縮することができる。 ソリューション はっきりと。

頻繁な誤解とつまずき

私は孤立したピークには騙されない:高い ウエ が正常であれば、持続的なプラトーだけが構造的ボトルネックを示している。. 1TP3チュチール 100%に近いことが重要なのは、次の場合だけである。 待つ そうでなければ、デバイスは単にビジー状態なのだ。そうでなければ単にビジーなだけだ。 SSD/NVMeの方が高い。 avgqu-sz レイテンシの目標が達成されなかった場合にのみスロットルを行う。私はCPUの周波数スケーリングをチェックしている。 ウエ が悪化しているように見える。また、アプリケーションのTTFBとストレージのレイテンシは切り離して考えています。ネットワーク、TLSハンドシェイク、アップストリームのサービスでも、同じような症状が出ることがあります。 iostat „は「有罪」である。.

管理者のための簡単な要約

iostatとvmstatを使ったI/O待ち解析は、wa、await、%util、avgqu-szを一緒に読み込んで、ワークロードのコンテキストに関連付けると素早く機能する。私はまず、実際にデバイスが飽和しているのか、それともメモリやアプリのパターンがレイテンシを引き起こしているのかを特定し、それから適切なレバーを選択します。クエリ、ライトバックパラメータ、スケジューラ、キューの深さに対する小規模で的を絞った調整は、高価なハードウェアの変更が必要になる前に、最大の効果を発揮することが多い。測定、仮説、変更、再測定というのが私の決まった順序である。こうして私は リナックス-サーバーの応答性が向上し、確実に改善された。 応答時間 負荷がかかっている

現在の記事