このトピックでは、Elastic Compute Service (ECS) インスタンスの一般的な Linux カーネルネットワークパラメーターについて説明します。また、Linux カーネルネットワークパラメーターに関するよくある質問への回答も提供します。
セルフサービスのトラブルシューティングツールの使用
Alibaba Cloud は、カーネルパラメーターの構成を迅速に確認し、明確な診断レポートを取得するのに役立つセルフサービスのトラブルシューティングツールを提供しています。
をクリックしてセルフサービスのトラブルシューティングページに移動し、ターゲットリージョンに切り替えます。
セルフサービスのトラブルシューティングツールで問題を特定できない場合は、次の手順を実行して手動でトラブルシューティングを行うことができます。
カーネルパラメーターの表示と変更
注意事項
カーネルパラメーターを変更する前に、次の項目に注意してください。
ビジネス要件と関連データにのみ基づいてカーネルパラメーターを変更することをお勧めします。
各パラメーターの関数を理解してください。カーネルパラメーターは、環境のタイプやバージョンによって異なる場合があることに注意してください。詳細については、「一般的な Linux カーネルパラメーター」をご参照ください。
ECS インスタンス上の重要なデータをバックアップします。詳細については、「スナップショットの作成」をご参照ください。
パラメーターの変更
/proc/sys/ と /etc/sysctl.conf を使用して、インスタンスの実行中にカーネルパラメーターを変更できます。違いは次のとおりです。
/proc/sys/は、カーネルパラメーターにアクセスするメソッドを提供する仮想ファイルシステムです。このファイルシステムのnetディレクトリには、現在のシステムで有効になっているすべてのネットワークカーネルパラメーターが格納されます。システムの実行中にパラメーターを変更できますが、変更はインスタンスの再起動後に無効になります。このメソッドは通常、変更の効果を一時的に検証するために使用されます。/etc/sysctl.confは構成ファイルです。/etc/sysctl.confファイルでカーネルパラメーターのデフォルト値を変更できます。変更はインスタンスの再起動後も有効です。
/proc/sys/ ディレクトリ内のファイルは、/etc/sysctl.conf 構成ファイル内の完全なパラメーター名に対応しています。たとえば、/proc/sys/net/ipv4/tcp_tw_recycle ファイルは net.ipv4.tcp_tw_recycle パラメーターに対応しています。ファイルの内容はパラメーター値です。
Linux はカーネルバージョン 4.12 以降、`tcp_tw_recycle` 構成を削除しました。これは、`net.ipv4.tcp_tw_recycle` 構成が `sysctl.conf` から削除されたことを意味します。システムのカーネルがバージョン 4.12 より前の場合にのみ、net.ipv4.tcp_tw_recycle パラメーターを使用できます。
/proc/sys/ ディレクトリのファイルを使用してカーネルパラメーターを表示および変更する
Linux オペレーティングシステムを実行する ECS インスタンスにログオンします。
詳細については、「ECS インスタンスの接続方法の概要」をご参照ください。
catコマンドを実行して、対応するファイルの内容を表示します。たとえば、次のコマンドを実行して
net.ipv4.tcp_tw_recycleの値を表示します。cat /proc/sys/net/ipv4/tcp_tw_recycleechoコマンドを実行して、カーネルパラメーターに対応するファイルを変更します。たとえば、次のコマンドを実行して
net.ipv4.tcp_tw_recycleの値を 0 に変更します。echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle
/etc/sysctl.conf 構成ファイルのカーネルパラメーターを表示および変更する
Linux オペレーティングシステムを実行する ECS インスタンスにログオンします。
詳細については、「ECS インスタンスの接続方法の概要」をご参照ください。
次のコマンドを実行して、現在のシステムですべての有効なパラメーターを表示します:
sysctl -a次のサンプルコマンド出力は、特定のカーネルパラメーターを示しています:
net.ipv4.tcp_app_win = 31 net.ipv4.tcp_adv_win_scale = 2 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_frto = 2 net.ipv4.tcp_frto_response = 0 net.ipv4.tcp_low_latency = 0 net.ipv4.tcp_no_metrics_save = 0 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_tso_win_divisor = 3 net.ipv4.tcp_congestion_control = cubic net.ipv4.tcp_abc = 0 net.ipv4.tcp_mtu_probing = 0 net.ipv4.tcp_base_mss = 512 net.ipv4.tcp_workaround_signed_windows = 0 net.ipv4.tcp_challenge_ack_limit = 1000 net.ipv4.tcp_limit_output_bytes = 262144 net.ipv4.tcp_dma_copybreak = 4096 net.ipv4.tcp_slow_start_after_idle = 1 net.ipv4.cipso_cache_enable = 1 net.ipv4.cipso_cache_bucket_size = 10 net.ipv4.cipso_rbm_optfmt = 0 net.ipv4.cipso_rbm_strictvalid = 1カーネルパラメーターを変更します。
一時的な変更
/sbin/sysctl -w kernel.parameter="[$Example]"説明`kernel.parameter` をカーネル名に、`[$Example]` をパラメーター値に置き換えます。たとえば、
sysctl -w net.ipv4.tcp_tw_recycle="0"コマンドを実行して、net.ipv4.tcp_tw_recycleカーネルパラメーターの値を 0 に変更します。この変更は永続的です。
次のコマンドを実行して
/etc/sysctl.conf構成ファイルを開きます。vim /etc/sysctl.confiキーを押して編集モードに入ります。必要に応じてカーネルパラメーターを変更します。
フォーマットは次のとおりです。
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。次のコマンドを実行して構成を有効にします:
/sbin/sysctl -p
Linux ECS インスタンスの一般的なカーネルネットワークパラメーターに関するよくある質問
/var/log/messages ログに「Time wait bucket table overflow」というエラーメッセージが表示されるのはなぜですか?
クライアントに NAT を構成した後、ECS インスタンスまたは ApsaraDB RDS インスタンスにアクセスできないのはなぜですか?
Linux ECS インスタンスにリモート接続できず、「nf_conntrack: table full, dropping packet」 エラーメッセージが /var/log/message ログに表示される場合はどうすればよいですか?
問題の説明
ECS インスタンスにリモート接続できません。宛先インスタンスに ping を実行すると、パケットが失われるか、ping コマンドが失敗します。次のエラーメッセージが /var/log/message システムログに頻繁に表示されます。
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.原因
`ip_conntrack` は、NAT の接続エントリを追跡する Linux モジュールです。`ip_conntrack` モジュールは、ハッシュテーブルを使用して TCP established connection エントリを記録します。このハッシュテーブルがいっぱいになると、新しい接続パケットがドロップされ、nf_conntrack: table full, dropping packet エラーが発生します。
Linux システムは、各 TCP 接続を維持するためにスペースを割り当てます。このスペースのサイズは、nf_conntrack_buckets および nf_conntrack_max パラメーターに関連しています。`nf_conntrack_max` のデフォルト値は、`nf_conntrack_buckets` の値の 4 倍です。したがって、nf_conntrack_max パラメーターの値を増やすことをお勧めします。
システム接続を維持すると、大量のメモリが消費されます。システムがアイドル状態で、十分なメモリがある場合は、nf_conntrack_max パラメーターの値を増やしてください。
ソリューション
Virtual Network Computing (VNC) を使用してインスタンスに接続します。
詳細については、「パスワード認証を使用して Linux インスタンスにログオンする」をご参照ください。
nf_conntrack_maxパラメーターの値を変更します。次のコマンドを実行して
/etc/sysctl.confファイルを開きます。vi /etc/sysctl.confiキーを押して編集モードに入ります。nf_conntrack_maxパラメーターの値を変更します。たとえば、ハッシュテーブルエントリの最大数を
655350に変更します。net.netfilter.nf_conntrack_max = 655350Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。
nf_conntrack_tcp_timeout_establishedパラメーターの値を変更します。デフォルト値: 432000。単位: 秒。例: 1200。
net.netfilter.nf_conntrack_tcp_timeout_established = 1200次のコマンドを実行して構成を有効にします:
sysctl -p
なぜ /var/log/messages ログに 「Time wait bucket table overflow」エラーメッセージ が表示されるのですか?
問題の説明
「kernel: TCP: time-wait bucket table overflow」エラーメッセージは、Linux ECS インスタンスの /var/log/messages ログに頻繁に表示されます。
Feb 18 12:28:38 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:44 i-*** kernel: printk: 227 messages suppressed.
Feb 18 12:28:44 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:52 i-*** kernel: printk: 121 messages suppressed.
Feb 18 12:28:52 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:53 i-*** kernel: printk: 351 messages suppressed.
Feb 18 12:28:53 i-*** kernel: TCP: time wait bucket table overflow
Feb 18 12:28:59 i-*** kernel: printk: 319 messages suppressed.原因
net.ipv4.tcp_max_tw_buckets パラメーターは、カーネルが管理できる TIME_WAIT 状態の接続数を制御します。ECS インスタンスの TIME_WAIT 状態の接続数が net.ipv4.tcp_max_tw_buckets の値を超えると、「kernel: TCP: time-wait bucket table overflow」エラーメッセージが /var/log/messages ログに表示されます。その後、システムカーネルは余分な TCP 接続を閉じます。
ソリューション
必要に応じて net.ipv4.tcp_max_tw_buckets パラメーターの値を増やすことができます。また、アプリケーションレベルで TCP 接続を最適化することをお勧めします。このセクションでは、net.ipv4.tcp_max_tw_buckets パラメーターの値を変更する方法について説明します。
VNC を使用してインスタンスに接続します。
詳細については、「パスワード認証を使用して Linux インスタンスにログインする」をご参照ください。
次のコマンドを実行して、既存の TCP 接続の数をクエリします:
netstat -antp | awk 'NR>2 {print $6}' | sort | uniq -c次のコマンド出力は、6,300 個の接続が TIME_WAIT 状態であることを示しています:
6300 TIME_WAIT 40 LISTEN 20 ESTABLISHED 20 CONNECTED次のコマンドを実行して、
net.ipv4.tcp_max_tw_bucketsパラメーターの値を表示できます。cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_buckets次の出力は、
net.ipv4.tcp_max_tw_bucketsパラメーターが 20000 であることを示しています。
net.ipv4.tcp_max_tw_bucketsパラメーターの値を変更します。次のコマンドを実行して
/etc/sysctl.confファイルを開きます。vi /etc/sysctl.confvi /etc/sysctl.confiキーを押して編集モードに入ります。net.ipv4.tcp_max_tw_bucketsパラメーターの値を変更します。たとえば、
net.ipv4.tcp_max_tw_bucketsパラメーターの値を65535に変更します。net.ipv4.tcp_max_tw_buckets = 65535Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。
次のコマンドを実行して構成を有効にします:
sysctl -p
Linux ECS インスタンスに FIN_WAIT2 状態の TCP 接続が多数あるのはなぜですか?
問題の説明
Linux ECS インスタンス上の多くの TCP 接続が FIN_WAIT2 状態です。
原因
この問題は、次の理由で発生する可能性があります:
HTTP サービスでは、サーバーは特定の理由で接続を積極的に終了します。たとえば、キープアライブメッセージへの応答がタイムアウトした場合、サーバーは接続を終了し、接続は FIN_WAIT2 状態になります。
TCP/IP プロトコルスタックは、半開きの接続をサポートします。TIME_WAIT 状態とは異なり、FIN_WAIT2 状態は接続がタイムアウトしたことを意味しません。クライアントが接続を終了しない場合、接続はシステムが再起動するまで FIN_WAIT2 状態のままになります。FIN_WAIT2 状態の接続数が増加すると、カーネルがクラッシュします。
ソリューション
net.ipv4.tcp_fin_timeout パラメーターの値を小さくして、FIN_WAIT2 状態の TCP 接続のクローズを高速化できます。
VNC を使用してインスタンスに接続します。
詳細については、「パスワード認証を使用して Linux インスタンスにログインする」をご参照ください。
net.ipv4.tcp_fin_timeoutパラメーターの値を変更します。次のコマンドを実行して
/etc/sysctl.confファイルを開きます。vi /etc/sysctl.confvi /etc/sysctl.confiキーを押して編集モードに入ります。net.ipv4.tcp_fin_timeoutパラメーターの値を変更します。たとえば、
net.ipv4.tcp_fin_timeoutパラメーターの値を 10 に変更します。net.ipv4.tcp_fin_timeout = 10Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。
次のコマンドを実行して構成を有効にします:
sysctl -p
Linux ECS インスタンスに CLOSE_WAIT 状態の TCP 接続が多数あるのはなぜですか?
問題の説明
Linux ECS インスタンス上の多くの TCP 接続が CLOSE_WAIT 状態です。
原因
この問題は、CLOSE_WAIT 状態の TCP 接続数が範囲外であるために発生する可能性があります。
TCP は 4 ウェイハンドシェイクを使用して接続を終了します。TCP 接続の両端は、接続を終了するリクエストを開始できます。ピアが接続を終了してもローカル側が終了しない場合、接続は CLOSE_WAIT 状態になります。ローカル側は、この半開きの接続を介してピアと通信できず、できるだけ早く接続を終了する必要があります。
ソリューション
プログラムでピアによって接続が終了されたことを確認することをお勧めします。
ECS インスタンスに接続します。
詳細については、「接続方法の概要」をご参照ください。
プログラムで CLOSE_WAIT 状態の TCP 接続を確認して終了します。
プログラミング言語の読み取りおよび書き込み関数を使用して、CLOSE_WAIT 状態の TCP 接続をモニターできます。Java または C 言語で接続を終了するには、次のいずれかのメソッドを使用できます:
Java 言語
readメソッドを使用して I/O を確認します。`read` メソッドが-1を返した場合、ストリームの終わりに達したことを示します。closeメソッドを使用して接続を閉じます。
C 言語
read関数の戻り値を確認します。戻り値が 0 の場合は、接続を終了します。
戻り値が 0 未満の場合は、エラーメッセージを表示します。AGAIN が表示されない場合は、接続を終了します。
クライアントに NAT を構成した後、ECS インスタンスまたは ApsaraDB RDS インスタンスにアクセスできないのはなぜですか?
問題の説明
NAT が構成された後、クライアントは、ソース NAT (SNAT) が有効になっている VPC 内の ECS インスタンスを含む、サーバー側の ECS または RDS インスタンスにアクセスできません。
原因
この問題は、サーバー上の net.ipv4.tcp_tw_recycle および net.ipv4.tcp_timestamps パラメーターが両方とも 1 に設定されている場合に発生する可能性があります。
サーバー上の net.ipv4.tcp_tw_recycle と net.ipv4.tcp_timestamps の両方のカーネルパラメーターが有効 (1 に設定) になっている場合、サーバーは各 TCP 接続パケットのタイムスタンプをチェックします。タイムスタンプが昇順でない場合、サーバーはパケットをドロップします。
ソリューション
サーバー側にデプロイされているクラウドプロダクトに基づいて、接続障害に対する適切なソリューションを選択できます。
リモートサーバーが ECS インスタンスの場合は、
net.ipv4.tcp_tw_recycleとnet.ipv4.tcp_timestampsの両方のパラメーターを 0 に設定します。リモートサーバーが ApsaraDB RDS インスタンスの場合、そのカーネルパラメーターを直接変更することはできません。代わりに、クライアントで
net.ipv4.tcp_tw_recycleとnet.ipv4.tcp_timestampsの両方のパラメーターを 0 に設定する必要があります。
VNC を使用してインスタンスに接続します。
詳細については、「パスワード認証を使用して Linux インスタンスにログインする」をご参照ください。
net.ipv4.tcp_tw_recycleおよびnet.ipv4.tcp_timestampsパラメーターの値を 0 に変更します。次のコマンドを実行して
/etc/sysctl.confファイルを開きます。vi /etc/sysctl.confvi /etc/sysctl.confiキーを押して編集モードに入ります。net.ipv4.tcp_tw_recycleおよびnet.ipv4.tcp_timestampsパラメーターの値を 0 に変更します。net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_timestamps=0Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。
次のコマンドを実行して構成を有効にします:
sysctl -p
一般的な Linux カーネルパラメーター
パラメーター | 説明 |
net.core.rmem_default | ソケット受信ウィンドウのデフォルトサイズ。単位: バイト。 |
net.core.rmem_max | ソケット受信ウィンドウの最大サイズ。単位: バイト。 |
net.core.wmem_default | ソケット送信ウィンドウのデフォルトサイズ。単位: バイト。 |
net.core.wmem_max | ソケット送信ウィンドウの最大サイズ。単位: バイト。 |
net.core.netdev_max_backlog | カーネルの処理速度がネットワークインターフェースコントローラー (NIC) の受信速度よりも遅い場合、余分なパケットは NIC の受信キューに格納されます。 このパラメーターは、前述のシナリオでキューに送信できるパケットの最大数を指定します。 |
net.core.somaxconn | このグローバルパラメーターは、各ポートのリスニングキューの最大長を指定します。 これは、3 ウェイハンドシェイクで半開きの接続の制限を指定する |
net.core.optmem_max | 各ソケットの最大バッファーサイズ。 |
net.ipv4.tcp_mem | このパラメーターは、TCP スタックのメモリ使用量を反映します。単位は、ほとんどの場合 4 KB のメモリページです。
|
net.ipv4.tcp_rmem | 受信バッファーサイズ。このパラメーターは、自動構成のためにソケットが使用するメモリのサイズを指定します。
|
net.ipv4.tcp_wmem | 送信バッファーサイズ。このパラメーターは、自動構成のためにソケットが使用するメモリのサイズを指定します。
|
net.ipv4.tcp_keepalive_time | TCP がキープアライブメッセージを送信して TCP 接続が有効かどうかを確認する間隔。単位: 秒。 |
net.ipv4.tcp_keepalive_intvl | 応答が返されない場合に TCP がキープアライブメッセージを再送する間隔。単位: 秒。 |
net.ipv4.tcp_keepalive_probes | TCP 接続が無効と見なされる前に送信できるキープアライブメッセージの最大数。 |
net.ipv4.tcp_sack | このパラメーターは、TCP 選択的確認応答 (SACK) を有効にするかどうかを指定します。値が 1 の場合は、TCP SACK が有効であることを示します。TCP SACK 機能を使用すると、サーバーは不足しているパケットのみを送信できるため、パフォーマンスが向上します。ワイドエリアネットワーク (WAN) 通信では、この機能を有効にすることをお勧めします。この機能により CPU 使用率が増加することに注意してください。 |
net.ipv4.tcp_timestamps | TCP タイムスタンプ。サイズは 12 バイトで、TCP ヘッダーで伝送されます。タイムスタンプは、再送タイムアウトメソッド (RFC 1323) よりも正確な方法で往復レイテンシ (RTT) の計算をトリガーするために使用されます。パフォーマンスを向上させるには、このオプションを有効にすることをお勧めします。 |
net.ipv4.tcp_window_scaling | このパラメーターは、RFC 1323 で定義されているウィンドウスケーリングを有効にするかどうかを指定します。システムが 64 KB より大きい TCP ウィンドウを使用できるようにするには、値を 1 に設定してウィンドウスケーリングを有効にします。最大 TCP ウィンドウサイズは 1 GB です。このパラメーターは、TCP 接続の両端でウィンドウスケーリングが有効になっている場合にのみ有効になります。 |
net.ipv4.tcp_syncookies | このパラメーターは、TCP SYN Cookie (
|
net.ipv4.tcp_tw_reuse | このパラメーターは、TIME-WAIT ソケット (TIME-WAIT ポート) を使用して TCP 接続を確立できるかどうかを指定します。 |
net.ipv4.tcp_tw_recycle | このパラメーターは、システムが TIME-WAIT ソケットをできるだけ早くリサイクルするかどうかを指定します。 |
net.ipv4.tcp_fin_timeout | ローカル側がソケット接続を切断した後、TCP 接続が FIN-WAIT-2 状態のままである期間。単位: 秒。この期間中、ピアが切断されたり、接続を終了しなかったり、予期しないプロセスの終了が発生したりする可能性があります。 |
net.ipv4.ip_local_port_range | ローカル TCP/UDP プロトコルポート番号。 |
net.ipv4.tcp_max_syn_backlog | このパラメーターは、システム内の
|
net.ipv4.tcp_westwood | このパラメーターは、クライアントで輻輳制御アルゴリズムを有効にします。輻輳制御アルゴリズムは、スループットの評価を維持し、全体的な帯域幅使用率を最適化しようとします。WAN 通信には、前述のアルゴリズムを有効にすることをお勧めします。 |
net.ipv4.tcp_bic | このパラメーターは、長距離ネットワークでギガバイト接続をより有効に活用するために、バイナリ増加輻輳制御が有効になっているかどうかを指定します。WAN 通信では、この機能を有効にすることをお勧めします。 |
net.ipv4.tcp_max_tw_buckets | TIME_WAIT 状態で許可される接続の最大数。TIME_WAIT 状態の接続数がデフォルト値より大きい場合、接続はすぐに終了します。デフォルト値は、インスタンスのメモリサイズによって異なります。最大デフォルト値は 262144 です。 |
net.ipv4.tcp_synack_retries | 接続が SYN_RECV 状態のときに SYN-ACK パケットが再送される回数。 |
net.ipv4.tcp_abort_on_overflow | 値が 1 の場合、システムが短時間で多くのリクエストを受信し、関連するアプリケーションがリクエストの処理に失敗した場合に、システムが RST パケットを送信して接続を終了できるようになります。アプリケーションの処理効率を最適化して、処理能力を向上させることをお勧めします。デフォルト値: 0。 |
net.ipv4.route.max_size | カーネルで許可されるルートの最大数。 |
net.ipv4.ip_forward | インターフェイス間のメッセージ転送。 |
net.ipv4.ip_default_ttl | パケットが通過できるホップの最大数。 |
net.netfilter.nf_conntrack_tcp_timeout_established | 確立された接続で特定の期間内にパケットが送信されない場合、システムは iptables を使用して接続を終了します。 |
net.netfilter.nf_conntrack_max | 追跡できる接続数を指定する最大ハッシュ値。 |