このトピックでは、一般的な Linux カーネルのネットワークパラメーターについて説明し、関連する問題のソリューションを提供します。
セルフサービス・トラブルシューティングツール
Alibaba Cloud のセルフサービス・トラブルシューティングツールは、カーネルパラメーターの設定を迅速にチェックし、詳細な診断レポートを提供します。
をクリックしてセルフサービス・トラブルシューティングページを開き、対象のリージョンを選択します。
診断レポートには、「セキュリティグループで共通ポートのインバウンドルールが設定されていません」などのアノマリーが表示されることがあります。具体的には、ポート -1 での ICMP プロトコルのインバウンドトラフィックが許可されていないため、インスタンスが PING リクエストに応答できません。これを修正するには、セキュリティグループルールを変更して、対応するポートでのトラフィックを許可します。
セルフサービス・トラブルシューティングツールで問題が特定できない場合は、次の手順で手動によるトラブルシューティングを進めてください。
カーネルパラメーターの表示と変更
注意事項
カーネルパラメーターを変更する前に、次の点にご注意ください:
-
カーネルパラメーターの変更は、特定の要件と裏付けとなるデータに基づいてのみ行ってください。安易な調整は避けてください。
-
各パラメーターの目的を理解してください。カーネルパラメーターは環境やバージョンによって異なる場合があることに注意してください。詳細については、「一般的な Linux カーネルパラメーター」をご参照ください。
-
ご利用の Elastic Compute Service (ECS) インスタンス上の重要なデータをバックアップしてください。詳細については、「スナップショットの作成」をご参照ください。
パラメーターの変更
インスタンスの実行中にカーネルパラメーターを変更するには、/proc/sys/ と /etc/sysctl.conf の両方を使用できます。違いは次のとおりです:
-
/proc/sys/ディレクトリは、カーネルパラメーターへのアクセスを提供する仮想ファイルシステムです。netサブディレクトリには、現在のシステムで有効になっているすべてのネットワークカーネルパラメーターが含まれています。これらのパラメーターはランタイムに変更できますが、変更はインスタンスの再起動後に永続化されません。この方法は通常、変更を一時的にテストするために使用されます。 -
/etc/sysctl.confファイルは設定ファイルです。/etc/sysctl.confファイルを変更して、カーネルパラメーターのデフォルト値を変更できます。変更はインスタンスの再起動後も永続化されます。
/proc/sys/ ディレクトリ内のファイルは、/etc/sysctl.conf ファイル内のパラメーター名に対応しています。たとえば、パラメーター net.ipv4.tcp_tw_recycle はファイル /proc/sys/net/ipv4/tcp_tw_recycle に対応し、ファイルの内容がパラメーターの値になります。
sysctl.conf の net.ipv4.tcp_tw_recycle 設定を含む tcp_tw_recycle 構成は、Linux カーネルバージョン 4.12 以降から削除されました。システムが 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_recycle -
echoコマンドを使用してカーネルパラメーターを変更します。たとえば、次のコマンドを実行して
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="[value]"説明kernel.parameterをカーネルパラメーターの名前に、[value]を目的の値に置き換えてください。たとえば、sysctl -w net.ipv4.tcp_tw_recycle="0"コマンドを実行して、net.ipv4.tcp_tw_recycleカーネルパラメーターの値を 0 に変更します。 -
永続的な変更を行う場合:
-
次のコマンドを実行して、
/etc/sysctl.conf設定ファイルを開きます:vim /etc/sysctl.conf -
iキーを押して編集モードに入ります。 -
必要に応じてカーネルパラメーターを変更します。
次の例は、必要な形式を示しています:
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 -
Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。 -
次のコマンドを実行して変更を適用します:
/sbin/sysctl -p
-
-
一般的なネットワークパラメーターの問題
-
/var/log/messages ログに「Time wait bucket table overflow」エラーメッセージが表示されるのはなぜですか?
-
NAT を設定した後、クライアントがサーバー側の ECS または ApsaraDB RDS インスタンスにアクセスできないのはなぜですか?
リモート接続の失敗:「nf_conntrack: table full, dropping packet」
症状
ECS インスタンスにリモート接続できません。ターゲットインスタンスへの 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 モジュールです。このモジュールは、ハッシュテーブルを使用して TCP の ESTABLISHED 接続エントリを記録します。このハッシュテーブルがいっぱいになると、新しい接続のパケットが破棄され、nf_conntrack: table full, dropping packet エラーが発生します。
Linux システムは、各 TCP 接続を維持するためにメモリ空間を割り当てます。この空間のサイズは、nf_conntrack_buckets と nf_conntrack_max パラメーターによって決まります。後者のデフォルト値は前者の値の 4 倍です。したがって、nf_conntrack_max パラメーターの値を増やすことを推奨します。
システム接続の維持には大量のメモリを消費します。システムがアイドル状態で十分なメモリがある場合にのみ、nf_conntrack_max パラメーターの値を増やすことを推奨します。
ソリューション
-
VNC を使用してインスタンスに接続します。
詳細については、「パスワード認証を使用して Linux インスタンスにログイン」をご参照ください。
-
nf_conntrack_maxパラメーターの値を変更します。-
次のコマンドを実行して、
/etc/sysctl.confファイルを開きます:vi /etc/sysctl.conf -
iキーを押して編集モードに入ります。 -
nf_conntrack_maxパラメーターの値を変更します。たとえば、ハッシュテーブルエントリの最大数を
655350に変更します:net.netfilter.nf_conntrack_max = 655350 -
Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。
-
-
タイムアウトパラメーター
nf_conntrack_tcp_timeout_establishedの値を変更します。たとえば、タイムアウトパラメーターの値を 1,200 に変更します。デフォルトのタイムアウトは 432,000 秒です。
net.netfilter.nf_conntrack_tcp_timeout_established = 1200 -
次のコマンドを実行して変更を適用します:
sysctl -p
「Time wait bucket table overflow」エラー
症状
Linux ECS インスタンスの /var/log/messages に「kernel: TCP: time wait bucket table overflow」エラーメッセージが頻繁に表示されます。
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 状態の接続数を制御します。TIME_WAIT 状態にある接続と 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 = 20000 -
net.ipv4.tcp_max_tw_bucketsパラメーターの値を変更します。-
次のコマンドを実行して、
/etc/sysctl.confファイルを開きます:vi /etc/sysctl.conf -
iキーを押して編集モードに入ります。 -
net.ipv4.tcp_max_tw_bucketsパラメーターの値を変更します。たとえば、
net.ipv4.tcp_max_tw_bucketsパラメーターの値を65535に変更します:net.ipv4.tcp_max_tw_buckets = 65535 -
Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。
-
-
次のコマンドを実行して変更を適用します:
sysctl -p
FIN_WAIT2 状態の接続数が多い
症状
Linux ECS インスタンス上の多数の TCP 接続が FIN_WAIT2 状態になっています。
原因
この問題は、以下の理由で発生する可能性があります:
-
HTTP サービスでは、KEEPALIVE タイムアウトなど、特定の理由でサーバーが積極的に接続を閉じることがあります。サーバーが接続を閉じると、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.conf -
iキーを押して編集モードに入ります。 -
net.ipv4.tcp_fin_timeoutパラメーターの値を変更します。たとえば、
net.ipv4.tcp_fin_timeoutパラメーターの値を 10 に変更します:net.ipv4.tcp_fin_timeout = 10 -
Escキーを押し、:wqと入力して Enter キーを押し、ファイルを保存して終了します。
-
-
次のコマンドを実行して変更を適用します:
sysctl -p
CLOSE_WAIT 状態の接続数が多い
症状
Linux ECS インスタンス上の多数の TCP 接続が CLOSE_WAIT 状態になっています。
原因
この問題は、CLOSE_WAIT 状態の接続数が通常の範囲を超えた場合に発生する可能性があります。
TCP は 4 ウェイハンドシェイクを使用して接続を終了します。TCP 接続のどちらの側からでも終了リクエストを開始できます。リモートピアが終了を開始したが、ローカルアプリケーションがソケットの終端を閉じない場合、接続は CLOSE_WAIT 状態に入ります。これは半閉じ状態ですが、接続はもはや通信に使用できず、速やかに終了する必要があります。
ソリューション
アプリケーションロジックを調査して、リモートピアによって閉じられた接続を正しく処理していることを確認することを推奨します。アプリケーションは速やかにソケットを閉じ、チェックを実行する必要があります。
-
ECS インスタンスに接続します。
詳細については、「ECS インスタンスの接続方法の概要」をご参照ください。
-
アプリケーション内で CLOSE_WAIT 状態の TCP 接続を確認し、閉じます。
ほとんどのプログラミング言語の読み取りおよび書き込み関数は、CLOSE_WAIT 状態の接続を検出できます。以下の例は、Java と C で接続を閉じる方法を示しています:
-
Java
-
read()メソッドを使用してストリームの終端を確認します。メソッドが-1を返した場合、ピアが終端を閉じたことを示します。 -
close()メソッドを呼び出して接続を閉じます。
-
-
C
read()システムコールの戻り値を確認します。-
戻り値が 0 の場合、ピアは接続を閉じています。これでソケットを閉じることができます。
-
戻り値が 0 未満の場合、
errnoを確認します。エラーがEAGAINまたはEWOULDBLOCKでない場合、エラーが発生しており、ソケットを閉じる必要があります。
-
-
NAT 設定後のアクセス失敗
症状
クライアント側で NAT を設定した後、クライアントはサーバー側の ECS または ApsaraDB RDS インスタンスにアクセスできません。これには、SNAT が設定された VPC 内の ECS インスタンスも含まれます。
原因
この問題は、サーバー上で net.ipv4.tcp_tw_recycle と net.ipv4.tcp_timestamps の両方のパラメーターが 1 に設定されている場合に発生する可能性があります。
サーバーのカーネルパラメーター net.ipv4.tcp_tw_recycle と net.ipv4.tcp_timestamps の両方が有効 (1 に設定) になっている場合、サーバーは受信する各 TCP パケットのタイムスタンプをチェックします。新しいパケットのタイムスタンプが、そのエンドポイントから最後に記録されたタイムスタンプより大きくない場合、サーバーはパケットを破棄します。
ソリューション
サーバー側のクラウドプロダクトに基づいてソリューションを選択してください。
-
リモートサーバーが ECS インスタンスの場合、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.conf -
iキーを押して編集モードに入ります。 -
net.ipv4.tcp_tw_recycleとnet.ipv4.tcp_timestampsパラメーターの値を 0 に変更します。net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_timestamps=0 -
Escキーを押し、: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 |
ネットワークインターフェースの入力キューにキューイングできるパケットの最大数を指定します。 このキューは、ネットワークインターフェースがカーネルの処理速度よりも速くパケットを受信した場合にパケットを保持します。 |
|
net.core.somaxconn |
各ポートの listen キューの最大長を定義するグローバルパラメーターです。 このパラメーターは |
|
net.core.optmem_max |
ソケットごとに許可される補助バッファーの最大サイズを指定します。 |
|
net.ipv4.tcp_mem |
TCP スタックがメモリ使用量をどのように管理するかを決定します。各値はメモリページ (通常 4 KB) 単位です。
|
|
net.ipv4.tcp_rmem |
TCP 受信バッファー用に予約されるメモリを定義します。
|
|
net.ipv4.tcp_wmem |
TCP 送信バッファー用に予約されるメモリを定義します。
|
|
net.ipv4.tcp_keepalive_time |
接続がまだアクティブであることを確認するために送信される TCP キープアライブプローブ間の間隔 (秒単位)。 |
|
net.ipv4.tcp_keepalive_intvl |
キープアライブプローブが確認応答されない場合のリトライ間隔 (秒単位)。 |
|
net.ipv4.tcp_keepalive_probes |
TCP 接続が切断されたと見なされるまでに送信するキープアライブプローブの最大数。 |
|
net.ipv4.tcp_sack |
選択的確認応答 (SACK) を有効にします。値 1 で有効になります。この機能は、受信者が順序外のパケットを確認応答できるようにすることでパフォーマンスを向上させ、送信者は欠落したセグメントのみを再送します。このオプションはワイドエリアネットワーク (WAN) 通信に推奨されますが、CPU 使用率が増加します。 |
|
net.ipv4.tcp_timestamps |
TCP タイムスタンプを有効にします。これにより、TCP ヘッダーに 12 バイトが追加されます。タイムスタンプにより、再送タイムアウトメカニズムよりも正確なラウンドトリップタイム (RTT) の計算が可能になります (「RFC 1323」をご参照ください)。パフォーマンス向上のためにこのオプションを有効にすることを推奨します。 |
|
net.ipv4.tcp_window_scaling |
「RFC 1323」で定義されているウィンドウスケーリングを有効にします。これを 1 に設定すると、64 KB を超える TCP ウィンドウをサポートし、最大 1 GB まで対応できます。このオプションは、TCP 接続の両端で有効になっている場合にのみ効果があります。 |
|
net.ipv4.tcp_syncookies |
このパラメーターは、TCP SYN Cookie (
|
|
net.ipv4.tcp_tw_reuse |
TIME-WAIT 状態のソケットを新しい TCP 接続に再利用できるようにします。 |
|
net.ipv4.tcp_tw_recycle |
TIME-WAIT ソケットの高速リサイクルを有効にします。 |
|
net.ipv4.tcp_fin_timeout |
ソケットを閉じた後、ローカル側で接続が FIN-WAIT-2 状態に留まる時間 (秒単位)。リモート側は切断したり、接続を閉じなかったり、予期せず終了したりする可能性があります。 |
|
net.ipv4.ip_local_port_range |
TCP/UDP プロトコルが使用できるローカルポート番号の範囲を指定します。 |
|
net.ipv4.tcp_max_syn_backlog |
接続は、システムが SYN パケットを受信し、SYN+ACK 応答を送信した後、3 ウェイハンドシェイクの最終 ACK を待っている間、 |
|
net.ipv4.tcp_westwood |
送信者側で Westwood+ 輻輳制御アルゴリズムを有効にします。利用可能なスループットの推定値を維持することで、帯域幅使用率を最適化します。このオプションは WAN 通信に推奨されます。 |
|
net.ipv4.tcp_bic |
高速で長距離のネットワーク向けに Binary Increase Congestion (BIC) 制御を有効にします。これにより、ギガビット速度のリンクをより有効に活用できます。このオプションは WAN 通信に推奨されます。 |
|
net.ipv4.tcp_max_tw_buckets |
TIME_WAIT 状態のソケットの最大数を設定します。この制限を超えると、すぐに閉じられます。デフォルト値はインスタンスのメモリに依存し、最大値は 262,144 です。 |
|
net.ipv4.tcp_synack_retries |
|
|
net.ipv4.tcp_abort_on_overflow |
1 に設定すると、アプリケーションが短時間で大量の受信リクエストを処理できない場合に、システムはリセット (RST) パケットを送信して接続を終了します。単に接続をリセットするのではなく、アプリケーションのパフォーマンスを最適化することを推奨します。デフォルト値は 0 です。 |
|
net.ipv4.route.max_size |
カーネルルーティングキャッシュの最大サイズ。 |
|
net.ipv4.ip_forward |
インターフェース間のパケット転送を有効にします。 |
|
net.ipv4.ip_default_ttl |
送信パケットのデフォルトの Time To Live (TTL) 値。 |
|
net.netfilter.nf_conntrack_tcp_timeout_established |
アクティビティのない ESTABLISHED TCP 接続のタイムアウト (秒単位)。 |
|
net.netfilter.nf_conntrack_max |
接続追跡テーブルの最大エントリ数。 |