「詳解システムパフォーマンス」の読書メモシリーズ・第9弾。前回がなんと昨年10月で、あやうく1年ぶりの読書メモとなってしまうところであった......。。この1年弱、興味があれやこれやと移り変わり、それに身を任せていたらこうなってしまった。
- 詳解システムパフォーマンスを読んでいる話・2章/メソドロジ 読書メモ - えいのうにっき
- 読書メモ・詳解システムパフォーマンス 第3章/オペレーティングシステム - えいのうにっき
- 読書メモ・詳解システムパフォーマンス 第4章/可観測性ツール - えいのうにっき
- 読書メモ・詳解システムパフォーマンス 第5章/アプリケーション - えいのうにっき
- 読書メモ・詳解システムパフォーマンス 第6章/CPU - えいのうにっき
- 読書メモ・詳解システムパフォーマンス 第7章/メモリ - えいのうにっき
- 読書メモ・詳解システムパフォーマンス 第8章/ファイルシステム - えいのうにっき
- 読書メモ・詳解システムパフォーマンス 第9章/ディスク - えいのうにっき
- 作者:Brendan Gregg
- 発売日: 2017/02/22
- メディア: 単行本(ソフトカバー)
読書メモ
なるほど
- パケットサイズ
- 通常、ネットワークインターフェイスのMTU(Maximum Transmission Unit)によって制限される
- 多くのイーサネットネットワークでは、MTUは1,500バイトとされている・約9,000バイトまでの大きなパケット(ジャンボフレーム)もサポートしている
- ただ、ジャンボフレームは古いネットワークハードウェアと構成の誤ったファイアウォールによって普及が妨げられた
- パケットサイズは大きく変動しうるもの
- スループットや使用率の計算をしても、パケット数からバイト数を導くことはできない
- ネットワークワークロードを特徴づける基本特性
- ネットワークインターフェイスのスループット
- ネットワークインターフェイスのIOPS
- TCP接続の頻度
- アクティブとパッシブ、1秒あたりの接続数
- 平均パケットサイズ
- プロトコルの内訳
- アクティブなTCP/UDPポートの特定、1秒あたりのバイト数、接続数
- ネットワークをアクティブに利用しているプロセス
- ネットワークモニタリングの主要な指標
- スループット(送受信両方)
- 1秒あたりに開設されているTCP接続の数
- 落ちたパケットのカウンタも含む、エラーの数
- TCP再送
- TCPの順序が異なるパケット
- 静的パフォーマンスチューニングでチェックする側面
- P.527
- チューニング可能パラメータ
- sysctl(8) コマンドで表示、設定でき、etc/sysctl.conf に書き込まれる
- TCP関連で操作可能なチューニング可能パラメータ: `sysctl -a | grep tcp"
- sysctl(8) コマンドで表示、設定でき、etc/sysctl.conf に書き込まれる
復習
- カプセル化
- ペイロードの先頭、末尾、もしくはその両方にメタデータを追加するもの
- レイテンシ計測の観点
- システムコールの送受信遅延
- システムコール接続遅延
- TCP接続初期化時間
- 名前解決遅延
- ping遅延
- 接続遅延
- Time To First-Byte
- ping遅延・接続遅延がネットワークによるレイテンシを計測するのに対し、TTFBは、ターゲットサーバーがコードを実行するための時間も含まれる
- RTT
- 接続ライフスパン(ネットワーク接続が確立されてから切断されるまでの時間)
- インタースタックレイテンシ
- パケットがカーネルTCP/IPスタックを移動する時間
- TCP輻輳回避アルゴリズム
- TCPはシーケンス番号を使った応答確認によってデータの確実な到達を担保している。
- 応答確認が行われないパケットについては、再度同じデータを送信するように、受信側から送信側へ再送要求が行われる。
- ネットワークが輻輳して遅延が大きくなると、同じデータを何度も再送してしまい、無駄なトラフィックが発生して輻輳がさらに悪化する。これを回避するためのもの。
- ネットワークインターフェイスの使用率
- 最大帯域幅に対する現在のスループットの割合として計算可能
- オートネゴシエーションによって帯域幅・二重化モードが変わるため、難しい
- 全二重通信の場合は使用率は各方向で計算され、その方向の「現在ネゴシエートされている帯域幅」に対する「その方向の現在のスループットの割合」として計算される
- localhost接続にはloopbackという仮想ネットワークインターフェイスが使われる
- ハードウェア
- スイッチ
- ふたつの接続されたホストの間に専用通信パスを提供し、ホストペア間の複数の通信が干渉を受けないようにする
- スイッチ
- メソドロジー
- ツールメソッド
- 再送やパケットの順序の異同が激しいものを探す:
netstat -s
- インターフェイスのエラーカウンタをチェックする:
netstat -i
- 単位時間あたりの送受信されるデータの量(スループット)をチェックする:
ip(8)
- 再送やパケットの順序の異同が激しいものを探す:
- USEメソッド
- ネットワーク帯域幅の制限を実装する環境では、物理的な限界に加えて与えられた制限も考慮して使用率を計測する必要がある
- ツールメソッド
- netstat(8) コマンド:ネットワークのさまざまなタイプの統計情報の表示
- P.530, 533
- Linuxは ifconfig(8)は陳腐化したとされていて、ip(8)コマンドを使う
- nicstat(1)
- スループットや使用率などのネットワークインターフェイス統計を表示するツール
たしかに
- 名前解決はアプリケーションの動作にとって不要な場合もある
- スイッチや外部ネットワークコンポーネントが大きなバッファを使っていると、パケットが長時間キューで待たされる問題(バッファブロート)が起きることがある。
- これが起きると、ホストでTCP輻輳回避アルゴリズムが実行され、パフォーマンスが下がる
- チューニング可能パラメータを操作する前に、まずネットワークの使用状況を理解したほうがいい場合がある
知らなかった
- ping遅延
- ICMPエコー要求がエコー応答を受けるまでの時間
- ICMPエコー要求受信側:通常割り込みによって処理され、すぐに返されるため、カーネルコードを実行するためにつくぁれる時間は最小限
- ICMPエコー要求送信側:タイムスタンプがユーザーランドから計測されるため、カーネルモードへのコンテキストスイッチ、カーネルコードパスでの時間が含まれる分、少し余分な時間が追加されることがある
- 接続遅延
- 接続確立のためにpingよりも多くのカーネルコードを実行することに加え、落ちたパケットを再送するための時間も含んでいる
- エンドツーエンド原理
- 通信プロトコルの操作は可能な限り通信システムの終端で行い、また制御対象のリソースになるべく近いところで行うべきであるというもの。
- 接続バックログ
- 最初の接続要求のためのバッファリング
- これにより、SYN要求はカーネル内でキューイングできる
- localhost接続
- localhost に対するIP接続は、IPソケットによるプロセス間通信のテクニック
- TCP/IPソケットでは、カーネルはハンドシェイク後にlocalhost接続を検出し、TCP/IPスタックを通さずにデータ転送をおこなってパフォーマンスを上げる
- アーキテクチャ・TCP
- スライディングウィンドウ
- 確認応答を受信する前でも、ウィンドウサイズまでの複数のパケットをネットワークに送れるという機能
- レイテンシの高いネットワークでも高いスループットを実現する
- スロースタート
- TCP輻輳制御の一部
- 最初は輻輳ウィンドウを小さくしておき、一定時間内にACKを受信できる間は、だんだんウィンドウを大きくしていく
- 時間内にACKを受信できない場合は、輻輳ウィンドウを縮小していく
- 選択的確認応答
- 連続していないパケットにACKできるようにするもの、再送の数を削減できる
- 高速再送
- タイマーを待たず、重複するACKの受信にもとづいて落ちたパケットを再送できる
- 遅延ACK
- 複数のACKを結合できるようにするため、ACKの送信を遅らせる
- SACK
- 選択的応答確認
- 受信側が送信側に、連続していないデータブロックを受信したことを知らせられるようにするもの
- FACK
- SACKの拡張
- 監視する状態を増やし、ネットワークに残っているデータの量をよりうまく調整してパフォーマンスを向上させる
- スライディングウィンドウ
- ハードウェア
- コントローラ
- マイクロプロセッサにより駆動され、I/Oトランスポートを介してシステムに接続される
- ネットワークスループットやIOPSの制限要因となる場合がある
- コントローラ
- ソフトウェア
- TCP
- 接続のバックログキューは2つある
- SYNバックログ
- リスンバックログ(確立したセッションがアプリケーションの受け入れを待つためのもの)
- 以前のカーネルでは1個のキューしか使われておらず、SYNあふれ(偽のIPアドレスから、リスンしているTCPポートに膨大なSYNを送り込むDoS攻撃)に弱かった
- 接続のバックログキューは2つある
- ネットワークデバイスドライバ
- Interrupt Coalescingモード:パケットが到着するたびにカーネルに割り込むのではなく、タイマーが作動するか一定数のパケットが到着したときにだけ割り込みを送りもの
- TCP
- リソースコントロール
- IPのサービス品質
- ネットワークコンポーネントによるトラフィックの優先度
- IPのサービス品質
- traceroute(8) の仕組み
- パケットごとにIPプロトコルのTTLを1ずつ増やし、ホストまでの一連のゲートウェイにICMP Time Exceede 応答メッセージを送らせて身元を明らかにさせるという方法
- pathchar を使うことで、ホップ間の帯域幅の情報も表示できる
- 一連のサイズのネットワークパケットを何度も送り、統計的分析をおこなって判定する
- あまり人気がない
- 分析のためのその他のツール
- P.564
- ネットワークパフォーマンスのためのチューニング
- イーサネットのジャンボフレーム構成オプション
- リングアグリゲーション
- ソケットオプション
- setsockopt() を使うことでアプリケーションがバッファサイズをチューニングできる、大きくするとスループットが上がる
練習問題
1. ネットワークの用語について
- 帯域幅とスループットの違い
- 帯域幅:ネットワークのデータ転送速度の上限
- スループット:ネットワーク端点の間の、現在のデータ転送速度
- TCP接続遅延とはなにか
- ネットワーク接続を確立するためにかかる時間のこと。TCPの場合はTCPハンドシェイク時間。
- TTFBとはなにか
- 接続が確立されてから、データの先頭バイトが到達するまでの時間のこと
- RTTとはなにか
- ネットワークパケットが端点の間で往復するためにかかる時間のこと
2. コンセプトについて
- ネットワークインターフェイスの使用率と飽和の説明
- 使用率:最大帯域幅に対する、現在のスループットの割合。インターフェイスがフレームの送受信でビジーだった時間の割合。
- 全二重通信の場合は使用率は各方向で計算され、その方向の「現在ネゴシエートされている帯域幅」に対する「その方向の現在のスループットの割合」として計算される
- 飽和:使用率が100%になったために発生した、キューイング、バッファリング、ブロッキングの度合い。
- 使用率:最大帯域幅に対する、現在のスループットの割合。インターフェイスがフレームの送受信でビジーだった時間の割合。
- TCPリスンバックログとは何で、どのようにして使うものか。
- 確立したセッションがアプリケーションの受け入れを待つためのもの。
- Interrupt Coalescing の長所と短所について。
- パケットが到着するたびにカーネルに割り込むのではなく、タイマーが作動するか一定数のパケットが到着したときにだけ割り込みを送るようにすること
- 長所:カネールがNICと通信する頻度が下がり、バッファリングされるデータが大きくなってスループットが上がる
- 短所:レイテンシが若干高くなる
3. 各種問題について
- TCP接続で、ネットワークフレーム(またはパケット)エラーによってパフォーマンスが損なわれる仕組みについて。
- エラーにより再送が発生し、再送により外れ値となるような大きなレイテンシが発生する
- ネットワークインターフェイスがリクエストにより過負荷になったとき、アプリケーションのパフォーマンスの影響を含めて何が起きるか。
- パケットが長時間キューで待たされるバッファブロートが起きる可能性がある。
- 接続のためのバックログキューがあふれ、それ以上の接続を受け付けることができなくなる