Linux での ENA カーネルドライバーのトラブルシューティング - Amazon Elastic Compute Cloud

Linux での ENA カーネルドライバーのトラブルシューティング

Elastic Network Adapter (ENA) は、オペレーティング システムのヘルスを向上し、予期しないハードウェア動作や障害による長期的な停止の可能性を減らすように設計されています。ENA アーキテクチャでは、デバイスやドライバーの障害がシステムに対して可能な限り透過的に保持されます。このトピックでは、ENA のトラブルシューティングについて説明します。

インスタンスに接続できない場合は、まず接続に関する問題のトラブルシューティングセクションを参照してください。

第 6 世代のインスタンスタイプに移行した後にパフォーマンスの低下が発生した場合は、記事「ネットワークのパフォーマンスを最大限に引き出すには、EC2 インスタンスを第 6 世代インスタンスに移行する前、何をする必要がありますか?」を参照してください。

インスタンスに接続できる場合、このトピックの以降のセクションに記載されている障害検出/復旧メカニズムを使用して診断情報を収集することができます。

接続に関する問題のトラブルシューティング

拡張ネットワーキングを有効化しているときに接続が失われると、ena モジュールとインスタンスの現在実行中のカーネルの互換性が保たれない可能性があります。これは、特定のカーネルバージョンのモジュールをインストール (dkms を使用しないか、不適切な設定の dkms.conf ファイルを使用) したため、インスタンスカーネルが更新された場合に発生します。起動時にロードされるインスタンスカーネルにより、ena モジュールが正しくインストールされない場合、インスタンスがネットワークアダプタを認識せず、インスタンスが到達不可能になります。

PV インスタンスまたは AMI で拡張ネットワーキングを有効にすると、お使いのインスタンスにも到達できなくなります。

ENA を使用して拡張ネットワーキングを有効した後インスタンスが到達不可能になった場合、インスタンスの enaSupport 属性を無効にすると、ストックネットワークアダプタにフォールバックできます。

ENA を使用して拡張ネットワーキングを無効にするには (EBS-backed インスタンス)
  1. ローカルコンピュータから、Amazon EC2 コンソールまたは次のいずれかのコマンドを使用して、インスタンスを停止します。stop-instances (AWS CLI)、Stop-EC2Instance (AWS Tools for Windows PowerShell)

    ヒント

    instance store-backed インスタンスを使用している場合、インスタンスを停止することはできません。代わりに、「ENA を使用して拡張ネットワーキングを無効にするには (Instance store-backed インスタンス)」に進んでください。

  2. ローカルコンピュータから、次のコマンドを使用して拡張ネットワーキングの属性を無効化します。

  3. ローカルコンピュータから、Amazon EC2 コンソールまたは次のいずれかのコマンドを使用して、インスタンスを起動します。start-instances (AWS CLI)、Start-EC2Instance (AWS Tools for Windows PowerShell)

  4. (オプション) インスタンスに接続し、enaのステップに従って、現在のカーネルバージョンを使用して EC2 インスタンスで ENA による拡張ネットワーキングを有効にする モジュールの再インストールを試みます。

ENA を使用して拡張ネットワーキングを無効にするには (Instance store-backed インスタンス)

インスタンスが instance store-backed インスタンスの場合、instance store-backed AMI を作成するの説明に従って新しい AMI を作成します。AMI を登録するときに、必ず拡張ネットワーキング enaSupport 属性を無効化してください。

  • register-image (AWS CLI)

    aws ec2 register-image --no-ena-support ...
  • Register-EC2Image (AWS Tools for Windows PowerShell)

    PS C:\> Register-EC2Image -EnaSupport $false ...

キープアライブメカニズム

ENA デバイスは、キープアライブイベントを一定の速度 (通常は 1 秒に 1 回) で送信します。ENA ドライバーは、これらのキープアライブメッセージの存在を確認するウォッチドッグメカニズムを実装します。メッセージが存在する場合、ウォッチドッグが再実装されます。存在しない場合、ドライバーはデバイスで障害が発生したと判断し、次の処理を行います。

  • 現在の統計を syslog にダンプする

  • ENA デバイスをリセットする

  • ENA のドライバー状態をリセットする

上記のリセット手順を実行すると、トラフィックが短時間失われる可能性がありますが (TCP 接続は回復可能です)、ユーザーに影響は及びません。

ENA デバイスは、キープアライブ通知を送信しないことによりデバイスリセット手順を間接的にリクエストすることがあります。例えば、ENA デバイスが回復不可能な設定をロードした後に不明な状態になった場合などです。

リセット手順の例を以下に示します。

[18509.800135] ena 0000:00:07.0 eth1: Keep alive watchdog timeout. // The watchdog process initiates a reset [18509.815244] ena 0000:00:07.0 eth1: Trigger reset is on [18509.825589] ena 0000:00:07.0 eth1: tx_timeout: 0 // The driver logs the current statistics [18509.834253] ena 0000:00:07.0 eth1: io_suspend: 0 [18509.842674] ena 0000:00:07.0 eth1: io_resume: 0 [18509.850275] ena 0000:00:07.0 eth1: wd_expired: 1 [18509.857855] ena 0000:00:07.0 eth1: interface_up: 1 [18509.865415] ena 0000:00:07.0 eth1: interface_down: 0 [18509.873468] ena 0000:00:07.0 eth1: admin_q_pause: 0 [18509.881075] ena 0000:00:07.0 eth1: queue_0_tx_cnt: 0 [18509.888629] ena 0000:00:07.0 eth1: queue_0_tx_bytes: 0 [18509.895286] ena 0000:00:07.0 eth1: queue_0_tx_queue_stop: 0 ....... ........ [18511.280972] ena 0000:00:07.0 eth1: free uncompleted tx skb qid 3 idx 0x7 // At the end of the down process, the driver discards incomplete packets. [18511.420112] [ENA_COM: ena_com_validate_version] ena device version: 0.10 //The driver begins its up process [18511.420119] [ENA_COM: ena_com_validate_version] ena controller version: 0.0.1 implementation version 1 [18511.420127] [ENA_COM: ena_com_admin_init] ena_defs : Version:[b9692e8] Build date [Wed Apr 6 09:54:21 IDT 2016] [18512.252108] ena 0000:00:07.0: Device watchdog is Enabled [18512.674877] ena 0000:00:07.0: irq 46 for MSI/MSI-X [18512.674933] ena 0000:00:07.0: irq 47 for MSI/MSI-X [18512.674990] ena 0000:00:07.0: irq 48 for MSI/MSI-X [18512.675037] ena 0000:00:07.0: irq 49 for MSI/MSI-X [18512.675085] ena 0000:00:07.0: irq 50 for MSI/MSI-X [18512.675141] ena 0000:00:07.0: irq 51 for MSI/MSI-X [18512.675188] ena 0000:00:07.0: irq 52 for MSI/MSI-X [18512.675233] ena 0000:00:07.0: irq 53 for MSI/MSI-X [18512.675279] ena 0000:00:07.0: irq 54 for MSI/MSI-X [18512.772641] [ENA_COM: ena_com_set_hash_function] Feature 10 isn't supported [18512.772647] [ENA_COM: ena_com_set_hash_ctrl] Feature 18 isn't supported [18512.775945] ena 0000:00:07.0: Device reset completed successfully // The reset process is complete

読み取りタイムアウトの登録

ENA アーキテクチャでは、Memory Mapped I/O (MMIO) の読み取りオペレーションの限定的に使用することが推奨されます。MMIO レジスタには、初期化手順中のみ ENA デバイスドライバーがアクセスします。

ドライバーログ (dmesg 出力にあります) が読み取りオペレーションの失敗を示している場合、互換性のないドライバーまたは適切にコンパイルされていないドライバー、ビジー状態のハードウェアドライバー、ハードウェア障害が原因の可能性があります。

読み取りオペレーションの失敗を示すログエントリが断続的に発生する場合は、問題とみなさないでください。この場合はドライバーによって再試行されます。ただし、読み取りの失敗を含むログエントリが連続して発生する場合は、ドライバーまたはハードウェアの問題を示しています。

タイムアウトによる読み取りオペレーション失敗を示すドライバーログエントリの例を以下に示します。

[ 47.113698] [ENA_COM: ena_com_reg_bar_read32] reading reg failed for timeout. expected: req id[1] offset[88] actual: req id[57006] offset[0]  [ 47.333715] [ENA_COM: ena_com_reg_bar_read32] reading reg failed for timeout. expected: req id[2] offset[8] actual: req id[57007] offset[0]  [ 47.346221] [ENA_COM: ena_com_dev_reset] Reg read32 timeout occurred

統計

ネットワークパフォーマンスが不十分な場合やレイテンシーの問題がある場合、デバイス統計情報を取得して調査する必要があります。これらの統計は、以下に示すように ethtool を使用して取得できます。

[ec2-user ~]$ ethtool -S ethN NIC statistics: tx_timeout: 0 suspend: 0 resume: 0 wd_expired: 0 interface_up: 1 interface_down: 0 admin_q_pause: 0 bw_in_allowance_exceeded: 0 bw_out_allowance_exceeded: 0 pps_allowance_exceeded: 0 conntrack_allowance_available: 450878 conntrack_allowance_exceeded: 0 linklocal_allowance_exceeded: 0 queue_0_tx_cnt: 4329 queue_0_tx_bytes: 1075749 queue_0_tx_queue_stop: 0 ...

次のコマンド出力パラメータの説明を以下に示します。

tx_timeout: N

Netdev ウォッチドッグがアクティブになった回数。

suspend: N

ドライバーが停止操作を実行した回数。

resume: N

ドライバーが再開操作を実行した回数。

wd_expired: N

ドライバーが直近 3 秒以内にキープアライブイベントを受け取らなかった回数。

interface_up: N

ENA インターフェイスが起動された回数。

interface_down: N

ENA インターフェイスが停止された回数。

admin_q_pause: N

管理キューが実行状態で見つからなかった回数。

bw_in_allowance_exceeded: N

インバウンド集計帯域幅がインスタンスの最大値を超えたためにキューまたはドロップされたパケットの数。

bw_out_allowance_exceeded: N

アウトバウンド集計帯域幅がインスタンスの最大値を超えたためにキューまたはドロップされたパケットの数。

pps_allowance_exceeded: N

双方向 PPS がインスタンスの最大値を超えたためにキューまたはドロップされたパケットの数。この制限には、ENI あたり 1024 PPS を超えるエグレスフラグメントドロップもカウントされます。

conntrack_allowance_available: N

そのインスタンスタイプの Connections Tracked 許容量に達する前にインスタンスが確立できる接続トラッキング数。Nitro ベースのインスタンスでのみ使用できます。FreeBSD インスタンスまたは DPDK 環境ではサポートされません。

conntrack_allowance_exceeded: N

接続トラッキングがインスタンスの最大数を超え、新しい接続を確立できなかったためにドロップされたパケットの数。これにより、インスタンスとの間で送受信されるトラフィックのパケット損失が発生する可能性があります。

linklocal_allowance_exceeded: N

ローカルプロキシサービスへのトラフィックの PPS がネットワークインターフェイスの最大値を超えたためにドロップされたパケットの数。これは、DNS サービス、インスタンスメタデータサービス、および Amazon Time Sync Service へのトラフィックに影響します。

queue_N_tx_cnt: N

このキューの送信パケット数。

queue_N_tx_bytes: N

このキューの送信バイト数。

queue_N_tx_queue_stop: N

キュー N がいっぱいになって停止された回数。

queue_N_tx_queue_wakeup: N

停止後にキュー N が再開された回数。

queue_N_tx_dma_mapping_err: N

直接メモリアクセスエラーの数。この値が 0 の場合は、システムリソースが低いことを示しています。

queue_N_tx_linearize: N

このキューに SKB 線形化が試行された回数。

queue_N_tx_linearize_failed: N

このキューで SKB 線形化が失敗した回数。

queue_N_tx_napi_comp: N

napi ハンドラーがこのキューの napi_complete を呼び出した回数。

queue_N_tx_tx_poll: N

napi ハンドラーがこのキューにスケジュールされた回数。

queue_N_tx_doorbells: N

このキューの送信ドアベルの数。

queue_N_tx_prepare_ctx_err: N

このキューで ena_com_prepare_tx が失敗した回数。

queue_N_tx_bad_req_id: N

このキューの req_id が無効です。有効な req_id は 0、マイナス queue_size、マイナス 1 です。

queue_N_tx_llq_buffer_copy: N

このキューの llq エントリよりもヘッダーサイズが大きいパケットの数。

queue_N_tx_missed_tx: N

このキューの未処理のパケット数。

queue_N_tx_unmask_interrupt: N

このキューで tx 割り込みがマスク解除された回数。

queue_N_rx_cnt: N

このキューで受信したパケット数。

queue_N_rx_bytes: N

このキューの受信バイト数。

queue_N_rx_rx_copybreak_pkt: N

rx キューが、このキューの rx_copybreak パケットサイズより小さいパケットを受信した回数。

queue_N_rx_csum_good: N

rx キューが、チェックサムをチェックし、このキューに対して正しいパケットを受信した回数。

queue_N_rx_refil_partial: N

ドライバーが rx キューの空いている部分にこのキューのバッファーを補充できなかった回数。この値が 0 でない場合、メモリリソースが低いことを示しています。

queue_N_rx_bad_csum: N

rx キューに、このキューの不良なチェックサムがあった回数 (rx チェックサムオフロードがサポートされている場合のみ)。

queue_N_rx_page_alloc_fail: N

このキューのページ割り当てに失敗した回数。この値が 0 でない場合、メモリリソースが低いことを示しています。

queue_N_rx_skb_alloc_fail: N

このキューの SKB 割り当てに失敗した回数。この値が 0 でない場合、システムリソースが低いことを示しています。

queue_N_rx_dma_mapping_err: N

直接メモリアクセスエラーの数。この値が 0 の場合は、システムリソースが低いことを示しています。

queue_N_rx_bad_desc_num: N

パケットあたりのバッファーが多すぎます。この値が 0 でない場合、バッファーの使用量が非常に少ないことを示しています。

queue_N_rx_bad_req_id: N

このキューの req_id は無効です。有効な req_id は [0, queue_size - 1 ] です。

queue_N_rx_empty_rx_ring: N

このキューの rx キューが空だった回数。

queue_N_rx_csum_unchecked: N

rx キューが、このキューに対してチェックサムがチェックされなかったパケットを受信した回数。

queue_N_rx_xdp_aborted: N

XDP パケットが XDP_ABORT として分類された回数。

queue_N_rx_xdp_drop: N

XDP パケットが XDP_DROP として分類された回数。

queue_N_rx_xdp_pass: N

XDP パケットが XDP_PASS として分類された回数。

queue_N_rx_xdp_tx: N

XDP パケットが XDP_TX として分類された回数。

queue_N_rx_xdp_invalid: N

パケットの XDP リターンコードが無効な回数。

queue_N_rx_xdp_redirect: N

XDP パケットが XDP_REDIRECT として分類された回数。

queue_N_xdp_tx_cnt: N

このキューの送信パケット数。

queue_N_xdp_tx_bytes: N

このキューの送信バイト数。

queue_N_xdp_tx_queue_stop: N

このキューがいっぱいになって停止した回数。

queue_N_xdp_tx_queue_wakeup: N

停止後にこのキューが再開された回数。

queue_N_xdp_tx_dma_mapping_err: N

直接メモリアクセスエラーの数。この値が 0 の場合は、システムリソースが低いことを示しています。

queue_N_xdp_tx_linearize: N

このキューに XDP バッファ線形化が試行された回数。

queue_N_xdp_tx_linearize_failed: N

このキューで XDP バッファ線形化が失敗した回数。

queue_N_xdp_tx_napi_comp: N

このキューで napi ハンドラーが napi_complete を呼び出した回数。

queue_N_xdp_tx_tx_poll: N

このキューで napi ハンドラーがスケジュールされた回数。

queue_N_xdp_tx_doorbells: N

このキューの送信ドアベルの数。

queue_N_xdp_tx_prepare_ctx_err: N

このキューで ena_com_prepare_tx が失敗した回数。この値は、常に 0 になる必要があります。そうでない場合はドライバーログを参照してください。

queue_N_xdp_tx_bad_req_id: N

このキューの req_id は無効です。有効な req_id は [0, queue_size - 1 ] です。

queue_N_xdp_tx_llq_buffer_copy: N

このキューの llq バッファコピーを使用してヘッダーをコピーしたパケット数。

queue_N_xdp_tx_missed_tx: N

tx キューエントリがこのキューの完了タイムアウトを逃した回数。

queue_N_xdp_tx_unmask_interrupt: N

このキューで tx 割り込みがマスク解除された回数。

ena_admin_q_aborted_cmd: N

中断された管理コマンドの数。これは、通常自動リカバリ手順中に発生します。

ena_admin_q_submitted_cmd: N

管理者キューのドアベルの数。

ena_admin_q_completed_cmd: N

管理者キューの完了数。

ena_admin_q_out_of_space: N

ドライバーが新しい管理コマンドの送信を試みたが、キューがいっぱいであった回数。

ena_admin_q_no_completion: N

ドライバーが管理コマンドの完了を取得しなかった回数。

syslog のドライバーエラーログ

ENA ドライバーは、システム起動時にログメッセージを syslog に書き込みます。問題が発生した場合、これらのログを調べてエラーを探すことができます。システム起動時に ENA ドライバーにより syslog に記録される情報の例と、特定のメッセージの注釈の一部を以下に示します。

Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 478.416939] [ENA_COM: ena_com_validate_version] ena device version: 0.10 Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 478.420915] [ENA_COM: ena_com_validate_version] ena controller version: 0.0.1 implementation version 1 Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.256831] ena 0000:00:03.0: Device watchdog is Enabled Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.672947] ena 0000:00:03.0: creating 8 io queues. queue size: 1024 Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.680885] [ENA_COM: ena_com_init_interrupt_moderation] Feature 20 isn't supported // Interrupt moderation is not supported by the device Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.691609] [ENA_COM: ena_com_get_feature_ex] Feature 10 isn't supported // RSS HASH function configuration is not supported by the device Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.694583] [ENA_COM: ena_com_get_feature_ex] Feature 18 isn't supported //RSS HASH input source configuration is not supported by the device Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.697433] [ENA_COM: ena_com_set_host_attributes] Set host attribute isn't supported Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.701064] ena 0000:00:03.0 (unnamed net_device) (uninitialized): Cannot set host attributes Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 479.704917] ena 0000:00:03.0: Elastic Network Adapter (ENA) found at mem f3000000, mac addr 02:8a:3c:1e:13:b5 Queues 8 Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 480.805037] EXT4-fs (xvda1): re-mounted. Opts: (null) Jun 3 22:37:46 ip-172-31-2-186 kernel: [ 481.025842] NET: Registered protocol family 10
無視可能なエラー

システムのエラーログに記録される可能性がある以下のエラーは、Elastic Network Adapter では無視できます。

ホスト属性の設定がサポートされない

ホスト属性は、このデバイスではサポートされていません。

rx キューのバッファの割り当てに失敗した

これは復元可能なエラーであり、エラーがスローされたときにメモリプレッシャーの問題が発生した可能性があることを示します。

機能 X はサポートされていない

言及されている機能は、Elastic Network Adapter ではサポートされていません。X に指定できる値は、以下のとおりです。

  • 10: RSS ハッシュ関数設定は、このデバイスではサポートされていません。

  • 12: RSS 間接テーブル設定は、このデバイスではサポートされていません。

  • 18: RSS ハッシュ入力設定は、このデバイスではサポートされていません。

  • 20: 割り込みモデレーションは、このデバイスではサポートされていません。

  • 27: Elastic Network Adapter ドライバーは、snmpd によるイーサネット機能のポーリングをサポートしていません。

AENQ の設定に失敗した

Elastic Network Adapter では、AENQ 設定がサポートされていません。

サポートされていない AENQ のイベントを設定しようとしている

このエラーは、Elastic Network Adapter によりサポートされていない AENQ イベントグループを設定しようとしたことを示しています。

最適とは言えない構成に関する通知

ENA デバイスは、変更可能なドライバー内の最適ではない構成設定を検出します。デバイスは ENA ドライバーに通知し、コンソールに警告を記録します。次の例は、警告メッセージの形式を示しています。

Sub-optimal configuration notification code: 1. Refer to AWS ENA documentation for additional details and mitigation options.

次のリストは、通知コードの詳細と、最適ではない構成が検出された場合の推奨アクションを示しています。

  • コード 1: ワイド LLQ 設定の ENA Express は推奨されません

    ENA Express ENI はワイド LLQ で設定されています。この構成は最適とは言えず、ENA Express のパフォーマンスに影響を与える可能性があります。ENA Express ENI を使用するときは、次のようにワイド LLQ 設定を無効にすることをお勧めします。

    sudo rmmod ena && sudo modprobe ena force_large_llq_header=0

    ENA Express の最適な構成の詳細については、「ENA Express を使用して EC2 インスタンス間のネットワークパフォーマンスを高める」を参照してください。

  • コード 2: Tx キューの深さが最適ではない ENA Express ENI は推奨されません

    ENA Express ENI が最適ではない Tx キューの深さで設定されています。この設定は、ENA Express のパフォーマンスに影響を与える可能性があります。ENA Express ENI を使用する際は、次のようにすべての Tx キューをネットワークインターフェイスの最大値に拡大することをお勧めします。

    以下の ethtool コマンドを実行すると、LLQ サイズを調整できます。Wide-LLQ を制御、クエリ、有効化する方法の詳細については、Amazon Drivers GitHub リポジトリで、ENA 用 Linux カーネルドライバードキュメントの「ラージローレイテンシーキュー (Large LLQ)」トピックを参照してください。

    ethtool -g interface

    Tx キューを最大の深度に設定します。

    ethtool -G interface tx depth

    ENA Express の最適な構成の詳細については、「ENA Express を使用して EC2 インスタンス間のネットワークパフォーマンスを高める」を参照してください。

  • コード 3: 通常の LLQ サイズの ENA および Tx パケットトラフィックは、ヘッダーがサポートする最大サイズを超えています

    デフォルトでは、ENA LLQ は最大 96 バイトの Tx パケットヘッダーサイズをサポートします。パケットヘッダーのサイズが 96 バイトを超えると、パケットはドロップされます。この問題を軽減するには、Wide-LLQ を有効にすることをお勧めします。これにより、サポートされる Tx パケットヘッダーサイズが最大 224 バイトに増加します。

    ただし、Wide-LLQ を有効にすると、Tx リングの最大サイズは 1000 エントリから 512 エントリに減少します。Wide-LLQ は Nitro v4 以降のすべてのインスタンスタイプでデフォルトで有効になっています。

    • Nitro v4 インスタンスタイプのデフォルトの最大 Wide-LLQ Tx リングサイズは 512 エントリで、これを変更することはできません。

    • Nitro v5 インスタンスタイプのデフォルトの最大 Wide-LLQ Tx リングサイズは 512 エントリで、最大 1000 エントリまで増加できます。

    以下の ethtool コマンドを実行すると、LLQ サイズを調整できます。Wide-LLQ を制御、クエリ、有効化する方法の詳細については、Amazon Drivers GitHub リポジトリで、ENA 用 Linux カーネルドライバードキュメントの「ラージローレイテンシーキュー (Large LLQ)」トピックを参照してください。

    Tx キューの最大深度を特定します。

    ethtool -g interface

    Tx キューを最大の深度に設定します。

    ethtool -G interface tx depth