特定のストレージ アレイを使用する ESX/ESXi ホストで読み取りまたは書き込みパフォーマンスの問題が生じる
search cancel

特定のストレージ アレイを使用する ESX/ESXi ホストで読み取りまたは書き込みパフォーマンスの問題が生じる

book

Article ID: 322023

calendar_today

Updated On:

Products

VMware vSphere ESXi

Issue/Introduction

免責事項:これは英文の記事「ESX/ESXi hosts might experience read or write performance issues with certain storage arrays (1002598)」の日本語訳です。記事はベストエフォートで翻訳を進めているため、ローカライズ化コンテンツは最新情報ではない可能性があります。最新の内容については、英語版の記事を参照してください。
各種アレイ ベンダーの一部の iSCSI ストレージ アレイは、ネットワークの輻輳時に適切に動作しません。この問題はこれらのアレイの TCP/IP 実装に関わるものであり、iSCSI イニシエータを介して ESXi/ESX ソフトウェアに接続されたストレージの読み取りパフォーマンスに深刻な影響を及ぼすことがあります。この問題は、Microsoft iSCSI イニシエータが関わるネイティブ(非仮想化)環境でも報告されています。

背景となる概念

この問題を理解するには、TCP に関するいくつかの概念に精通している必要があります。
  • 遅延 ACK
  • スロー スタート
  • 輻輳の回避

遅延 ACK

TCP ネットワーク プロトコルでは重要な規範の 1 つは、TCP 経由で送ったデータが受信側によって確認されることです。RFC 813 によると、「ごく簡単に言うと、受信者はデータを受け取ったら、プロトコルの規定により、このデータの受信確認を送り返す必要がある。 このプロトコルは、データのバイトに連番を付けることを指定しているため、受信者は、番号が最も大きいバイトの受信データを伝えることでデータの確認を行うことができ、この仕組みにより、前のバイトの受信も確認できる」となっています。 確認を伝える TCP パケットは ACK と言います。

TCP データ セグメントのストリームを受信するホストは、受信したデータ セグメントごとに 1 つ未満の ACK 確認セグメントを送信することで、ネットワークとホスト双方の効率性を高めることができます。これを遅延 ACK と言います。一般的な方法では、フルサイズのデータ セグメント 1 つおきに ACK を送信して、指定のしきい値以上にセグメントの ACK を遅らせないようにします。このしきい値は 100 ~ 500ms です。ESXi/ESX は他のほとんどのサーバ同様に、この利点のために遅延 ACK を使用しています。

スロー スタートおよび輻輳の回避

送信側から受信側に至るネットワークの 2 つの要素間で、データ処理能力に不一致がある場合に、輻輳が生じることがあります。輻輳自体は、遅延、タイムアウト、またはパケット損失の現れです。輻輳の回避または輻輳からの回復のために、TCP は輻輳回避アルゴリズムおよびスロー スタート アルゴリズムという 2 つのアルゴリズムを使用します。これら 2 つのアルゴリズムの基盤となるメカニズムはそれぞれ異なりますが、その基本的な概念は、輻輳が発生した場合に、TCP 送信側は伝送速度を落とし、再送されたデータ セグメントを確認したら速度を上げるというものです。

輻輳が発生した場合、遅延 ACK とスロー スタートを使用する TCP/IP ネットワークの通常の回復手順は次のとおりです。
  1. 送信側は、再送タイムアウト時間以内に ACK を受信しなかったため、輻輳を検出します。
  2. 送信側は最初のデータ セグメントを再送し、ACK の受信を待ってから、再送用の残りのセグメントに連番を付けます。
  3. 受信側は再送データ セグメントを受信し、遅延 ACK タイマーを開始します。
  4. 送信側は、ACK タイマーのタイムアウトが切れると、ACK を送信します。この待機時間の間、送信側と受信側の間でその他のやり取りは行われません。
  5. ACK を送った受信側は、次の 2 つのデータ セグメントを再送します。
  6. 2 回目のデータ セグメントを受信した送信側は、ACK を即座に送信します。
  7. ACK を受信した受信側は、次の 4 つのデータ セグメントを再送します。
  8. 輻輳が終わって、ネットワークが通常のトラフィック速度に戻るまで、このやり取りが続きます。
この回復手順の場合、手順 3 の最初の遅延 ACK タイマーの時間が最も遅い遅延時間です。
 

問題の説明

影響を受ける問題の iSCSI アレイは、やや異なる方法で輻輳に対処します。スロー スタート アルゴリズムまたは輻輳回避アルゴリズムのいずれかまたは両方を実行する代わりに、非常に保守的な方法を用いて、一度に 1 つだけの損失データ セグメントを再送して、ホストの ACK が届くのを待ってから、次のデータ セグメントを再送します。このプロセスは、すべての損失データ セグメントが回復されるまで続きます。

このアプローチと ESXi/ESX ホストに実装された遅延 ACK が相まって、輻輳ネットワークの読み取りパフォーマンスが低速になり、ついには動かなくなります。その結果、このタイプのアレイを使用するホストのカーネル ログには、頻繁なタイムアウトが記録されます。中でも注目すべきは、VMFS が短いタイムアウト値を使用しているために、VMFS ハートビートで大量のタイムアウトが生じる点です。この構成では、ゲストから報告される過大な読み取り応答時間(約数十秒)も大量に発生します。この問題は、大きいブロック サイズのデータを読み取るときに悪化します。その場合、より高い帯域幅がネットワーク輻輳の原因となり、各 I/O はさらに多くのデータ セグメントで構成されるので、回復に長い時間がかかります。

vmkernel.log ファイルには、次のようなエントリが見られることがあります。

-09-17T15:07:19Z iscsid: discovery_sendtargets::Running discovery on IFACE iscsi_vmk@vmk2(iscsi_vmk) (drec.transport=iscsi_vmk)
-09-17T15:07:19Z iscsid: cannot make connection to 10.0.68.2:3260 (111)
-09-17T15:07:19Z iscsid: connection to discovery address 10.0.68.2 failed
-09-17T15:07:19Z iscsid: connection login retries (reopen_max) 5 exceeded
-09-17T15:07:19Z iscsid: Login Target Skipped: iqn.2003-10.com.lefthandnetworks:hvtiscsi:1808:vmwds01 if=iscsi_vmk@vmk1 addr=10.0.68.2:3260 (TPGT:1 ISID:0x2) (Already Running)
-09-17T15:07:19Z iscsid: Login Target Skipped: iqn.2003-10.com.lefthandnetworks:hvtiscsi:1808:vmwds01 if=iscsi_vmk@vmk2 addr=10.0.68.2:3260 (TPGT:1 ISID:0x3) (Already Running)

null

Environment

VMware vSphere ESXi 7.0.0
VMware vSphere ESXi 7.0.x
VMware vSphere ESXi 6.7
VMware vSphere ESXi 6.5

Resolution

iSCSI アレイ ベンダー側がこの問題に対処するまでは、ピーク使用時に十分に対応し、輻輳のリスクを低減できる十分な容量を IP ストレージ ネットワークで設定することを検討してください。この記事で説明した問題が発生していても、ネットワーク構成を変更できないか、輻輳のない環境を確保する方法が見つからない場合は、次の回避策を試してください。

この回避策では、構成オプションを使用して、ESX/ESXi ホストの遅延 ACK を無効にします。

注: ストレージ ベンダーに問い合わせて、遅延 ACK を無効にする方法を自社製ストレージ アレイで勧めているかどうかを確認してください。
 

ESX/ESXi 3.5 および 4.x/5.x/6.0 間の遅延 ACK での対処方法の相違

遅延 ACK を無効にする方法は、ESX/ESXi 3.5 と 4.x/5.x/6.0 とではやや異なります。ESX/ESXi 3.5 と 4.x/5.x/6.0 とでは、主な違いは遅延 ACK 設定による動作と設定方法です。
  • ESX/ESXi 3.5 の場合、遅延 ACK 設定は ESX/ESXi システムに対してグローバルに機能します。

    このオプションを設定すると、TCP が輻輳からの回復を試行しているか、正常に動作しているかに関係なく、遅延 ACK が完全に無効にされます。このオプションは TCP/IP スタック全体に影響を及ぼすため、この変更を実行すると、すべての TCP/IP アプリケーションが影響を受けます。そのため、このオプションを設定すると、iSCSI や他のアプリケーション(NFS や vMotion など)のパフォーマンスが低下し、輻輳の原因になることがあります。それでもこのオプションを使用すると、影響を受けた iSCSI アレイとの他のトランザクションの間、輻輳から迅速に回復でき、ある程度のパフォーマンスも維持できます。
     
  • ESX/ESXi 4.x/5.x/6.0 の場合、遅延 ACK 設定を構成する推奨方法は、検出ターゲットの単位で設定する方法です。ただし、遅延 ACK 設定は個別のターゲット単位で行うこともできます。また、推奨されている方法ではありませんが、すべての iSCSI ターゲットに対して ACK 設定をグローバルに構成することができます。
     

ESX/ESXi 4.x、ESXi 5.x および ESXi 6.0 での遅延 ACK の構成

ESX/ESXi 4.x、ESXi 5.x および ESXi 6.0 でこの回避策を実行するため、vSphere Client を使って遅延 ACK を無効にします。

ESX/ESXi 4.x、ESXi 5.x および ESXi 6.0 での遅延 ACK の無効化

  1. vSphere Client にログインして、ホストを選択します。
  2. ホストを右クリックして、[メンテナンス モード] をクリックします。
  3. メンテナンス モードに入るためのタスクが完了するまで待機します。
  4. [構成] タブに移動します。
  5. [ストレージ アダプタ] をクリックします。
  6. 変更する iSCSI vmhba をクリックします。
  7. [プロパティ] をクリックします。
  8. ご使用の環境のニーズに最適なオプションを使って、遅延 ACK 設定を変更します。
     
    • 検出アドレス上で遅延 ACK 設定を変更する(推奨)。
       
      1. 検出アドレス上で [動的検出] タブをクリックします。
      2. [サーバ アドレス] タブをクリックします。
      3. [設定] > [詳細] をクリックします。
      4. [遅延 ACK 詳細パラメータ] オプションで、[親から継承][DelayedACK] のチェックを外します。
      5. [OK] をクリックします。
         
    • 特定のターゲット上で遅延 ACK 設定を変更する。
       
      1. 検出アドレス上で [静的検出] タブをクリックします。
      2. 作業中のアレイに常駐するすべてのターゲットを選択します。
      3. [削除] をクリックして選択したエントリを削除します。
      4. [動的検出] タブをクリックします。
      5. 作業中のアレイに常駐するすべてのエントリを削除します。
      6. 検出アドレスを入力します。ただし、まだアダプタは再スキャンしません。
      7. 変更する検出アドレスを選択し、[設定] > [詳細] をクリックします。
      8. [遅延 ACK 詳細パラメータ] オプションで、[親から継承][DelayedACK] のチェックを外します。
      9. [OK] をクリックします。
      10. 変更が必要な検出アドレスに対して手順 f ~ i を繰り返します。
         
    • 遅延 ACK 設定をグローバルに変更する。
       
      1. [全般] タブを選択します。
      2. [詳細] をクリックします。
      3. [遅延 ACK 詳細パラメータ] オプションで、[親から継承][DelayedACK] のチェックを外します。
      4. [OK] をクリックします。
         
  9. ホストを再起動します。

ESX/ESXi 4.x、ESXi 5.x および ESXi 6.0 での遅延 ACK の再有効化

  1. vSphere Client にログインして、ホストを選択します。
  2. 前述のタスク「ESX/ESXi 4.x、ESXi 5.x および ESXi 6.0 での遅延 ACK の再有効化」で説明されているとおりに、[詳細設定] ページに移動します。
  3. [親から継承] > [DelayedAck] をクリックします。
  4. ホストを再起動します。

ESX/ESXi 4.x、ESXi 5.x および ESXi 6.0 での遅延 ACK の現在の設定の確認

  1. vSphere Client にログインして、ホストを選択します。
  2. 前述のタスク「ESX/ESXi 4.x、ESXi 5.x および ESXi 6.0 での遅延 ACK の再有効化」で説明されているとおりに、[詳細設定] ページに移動します。
  3. [DelayedAck] の設定を確認します。

    [DelayedAck] の設定を選択していると、このオプションが有効になります。遅延 ACK 設定を変更した後、ホストを再起動する前にこの確認を行うと、現在有効な設定ではなく、新しい設定が表示されます。

    • delayed_ack を無効にするには、コマンド ラインから次のコマンドを実行します。

      vmkiscsi-tool -W -a delayed_ack=0 -j vmhbaXX

      delayed_ack を有効にするには、次のコマンドを実行します。

      vmkiscsi-tool -W -a delayed_ack=1 -j vmhbaXX
       
    • このパラメータをチェックするには、次のコマンドを実行します。

      vmkiscsi-tool -W vmhbaXX
       

ESX/ESXi 3.5 での遅延 ACK の構成

この回避策を ESX/ESXi 3.5 で実行するには、VI Client を使って Net.TcpipDelayedAck 詳細パラメータ設定を変更します。このオプションはデフォルトで 1 に設定されており、遅延 ACK が有効になっています。遅延 ACK を無効化するには、次の手順を実行します。

ESX/ESXi 3.5 での遅延 ACK の無効化

  1. VI Client にログインして、ホストを選択します。
  2. [構成] タブをクリックして、[詳細設定] をクリックします。
  3. [次へ] をクリックして、Net.TcpipDelayedAck パラメータが見つかるまで詳細パラメータ リストをスクロールします。
  4. パラメータの値を 0 に設定します。
  5. [OK] をクリックします。
  6. ホストを再起動します。

ESX/ESXi 3.5 での遅延 ACK の再有効化

  1. VI Client にログインして、ホストを選択します。
  2. [構成] タブをクリックして、[詳細設定] を選択します。
  3. [次へ] をクリックして、Net.TcpipDelayedAck パラメータが見つかるまで詳細パラメータ リストをスクロールします。
  4. パラメータの値を 1 に設定します。
  5. [OK] をクリックします。
  6. ホストを再起動します。

ESX/ESXi 3.5 での遅延 ACK の現在の設定の確認

  1. VI Client にログインして、ホストを選択します。
  2. [構成] タブをクリックして、[詳細設定] を選択します。
  3. [次へ] をクリックして、Net.TcpipDelayedAck パラメータが見つかるまで詳細パラメータ リストをスクロールします。
  4. 設定をクリックします。1 の設定は、遅延 ACK が有効化されていることを意味し、0 の設定は、遅延 ACK が無効化されていることを意味します。
  5. [OK] をクリックします。

    :遅延 ACK 設定の変更を適用するには、再起動する必要があります。変更を行った後でホストを再起動していない場合、この確認の結果には、現在有効な設定ではなく、新しい設定が表示されます。

Additional Information