このトピックでは、Elastic Compute Service (ECS) インスタンスの一般的なLinuxカーネルネットワークパラメータについて説明します。 このトピックでは、Linuxカーネルネットワークパラメーターに関するよくある質問に対する回答も提供します。
考慮事項
カーネルパラメーターを変更する前に、次の項目に注意してください。
ビジネス要件と関連データのみに基づいてカーネルパラメーターを変更することを推奨します。
カーネルパラメーターを変更する前に、各パラメーターの目的を理解する必要があります。 カーネルパラメーターの目的は、環境タイプまたはバージョンによって異なります。
ECSインスタンスの重要なデータをバックアップします。 詳細については、「ディスクのスナップショットの作成」をご参照ください。
Linuxインスタンスのカーネルパラメータの照会と変更
/proc/sys/
または /etc/sysctl.conf
を使用して、インスタンスランタイム中にカーネルパラメーターを変更できます。 次のセクションでは、2つのツールの違いについて説明します。
/proc/sys/
は、カーネルパラメータにアクセスするために使用できる仮想ファイルシステムです。 仮想ファイルシステムのnet
ディレクトリには、システムで有効になるすべてのネットワークカーネルパラメーターが格納されます。 インスタンスの実行中にパラメーターを変更できます。 変更はインスタンスの再起動後に無効になります。 仮想ファイルシステムは、変更を一時的に検証するために使用される。/etc/sysctl.conf
は設定ファイルです。 設定ファイルのカーネルパラメータのデフォルト値を変更できます。 インスタンスの再起動後も変更は有効です。
/proc/sys/
ディレクトリ内のファイルは、/etc/sysctl.conf
設定ファイル内のパラメーターの完全名に対応しています。 たとえば、/proc/sys/net/ipv4/tcp_tw_recycle
ファイルは、設定ファイルのnet.ipv4.tcp_tw_recycle
パラメーターに対応しています。 ファイルの内容はパラメータ値です。
Linuxカーネルバージョン4.12以降では、net.ipv4.tcp_tw_recycleパラメーターはsysctl.confファイルから削除されます。 net.ipv4.tcp_tw_recycle
パラメーターは、4.12より前のカーネルバージョンでのみ設定できます。
/proc/sys /ディレクトリ内のファイルを使用してカーネルパラメータを表示および変更する
Linuxオペレーティングシステムを実行しているECSインスタンスにログインします。
詳細については、「接続方法の概要」をご参照ください。
cat
コマンドを実行して、設定ファイルの内容を表示します。たとえば、
net.ipv4.tcp_tw_recycle
パラメーターの値を表示するには、次のコマンドを実行します。cat /proc/sys/net/ipv4/tcp_tw_リサイクル
echo
コマンドを実行して、カーネルパラメーターを含むファイルを変更します。たとえば、
net.ipv4.tcp_tw_recycle
パラメーターの値を0に変更するには、次のコマンドを実行します。echo "0" > /proc/sys/net/ipv4/tcp_tw_リサイクル
/etc/sysctl.conf設定ファイルのカーネルパラメーターの表示と変更
Linuxオペレーティングシステムを実行している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="[$例]"
説明kernel.parameterをカーネルパラメーター名に置き換え、[$Example] をビジネス要件に基づいて特定の値に置き換えます。 たとえば、
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.de fault.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
Esc
キーを押して:wq
と入力し、ファイルを保存して閉じます。設定を有効にするには、次のコマンドを実行します。
/sbin/sysctl -p
Linux ECSインスタンスの共通カーネルネットワークパラメータに関するFAQ
/var/log/messagesログに "Time wait bucket table overflow" エラーメッセージが表示されるのはなぜですか?
クライアントのNATを設定した後、ECSインスタンスまたはApsaraDB RDSインスタンスにアクセスできないのはなぜですか。
Linux ECSインスタンスに接続できず、 /var/log/message
ログに「nf_conntrack: table full, drop packet」というエラーメッセージが表示された場合はどうすればよいですか。
問題の説明
Linux ECSインスタンスに接続できません。 インスタンスをpingすると、pingパケットが破棄されるか、pingが失敗します。 次のエラーメッセージは、/var/log/message
システムログに頻繁に表示されます。
2月6日16:05:07 i-*** カーネル: nf_conntrack: テーブルフル、パケットのドロップ。
2月6日16:05:07 i-*** カーネル: nf_conntrack: テーブルフル、パケットのドロップ。
2月6日16:05:07 i-*** カーネル: nf_conntrack: テーブルフル、パケットのドロップ。
2月6日16:05:07 i-*** カーネル: nf_conntrack: テーブルフル、パケットのドロップ。
原因
ip_conntrackは、LinuxオペレーティングシステムのNATモジュールであり、接続エントリを追跡します。 ip_conntrackモジュールは、ハッシュテーブルを使用して、TCPの確立された接続
エントリを記録する。 ハッシュテーブルがいっぱいになると、新しい接続のパケットは破棄され、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
パラメーターの値を増やすことを推奨します。
解決策
VNC (Virtual Network Computing) を使用してインスタンスに接続します。
詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。
nf_conntrack_max
パラメーターの値を変更します。次のコマンドを実行して、
/etc/sysctl.conf
ファイルを開きます。vi /etc/sysctl.conf
I
キーを押して挿入モードに入ります。nf_conntrack_max
パラメーターの値を変更します。例:
655350
。net.netフィルター。nf_conntrack_max = 655350
Esc
キーを押して:wq
と入力し、ファイルを保存して閉じます。
nf_conntrack_tcp_timeout_established
パラメーターの値を変更します。デフォルト値: 432000 単位は秒です。 例: 1200。
net.netフィルター。nf_conntrack_tcp_timeout_established = 1200
設定を有効にするには、次のコマンドを実行します。
sysctl -p
"Time wait bucket table overflow" エラーメッセージが /var/log/messages
ログに表示されるのはなぜですか?
問題の説明
「kernel: TCP: time wait bucket table overflow」というエラーメッセージは、Linux ECSインスタンスの /var/log/messages
ログに頻繁に表示されます。
2月18日12:28:38 i-*** カーネル: TCP: 時間待ちバケットテーブルのオーバーフロー
2月18日12:28:44 i-*** カーネル: printk: 227メッセージが抑制されました。
2月18日12:28:44 i-*** カーネル: TCP: 時間待ちバケットテーブルのオーバーフロー
2月18日12:28:52 i-*** カーネル: printk: 121メッセージが抑制されました。
2月18日12:28:52 i-*** カーネル: TCP: 時間待ちバケットテーブルのオーバーフロー
2月18日12:28:53 i-*** カーネル: printk: 351メッセージが抑制されました。
2月18日12:28:53 i-*** カーネル: TCP: 時間待ちバケットテーブルのオーバーフロー
2月18日12:28:59 i-*** カーネル: printk: 319メッセージが抑制されました。
原因
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を使用してインスタンスに接続します。
詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。
次のコマンドを実行して、既存のTCP接続数を照会します。
netstat -antp | awk 'NR>2 {print $6}'| 並べ替え | uniq -c
次のコマンド出力は、6,300の接続がTIME_WAIT状態であることを示します。
6300 TIME_WAIT 40 LISTEN 20設立 20接続
次のコマンドを実行して、
net.ipv4.tcp_max_tw_buckets
パラメーターの値を表示します。cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_バケット
次の図に示すコマンド出力は、
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
パラメーターの値を変更します。例:
65535
。net.ipv4.tcp_max_tw_buckets = 65535
Esc
キーを押して:wq
と入力し、ファイルを保存して閉じます。
設定を有効にするには、次のコマンドを実行します。
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を使用してインスタンスに接続します。
詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。
net.ipv4.tcp_fin_timeout
パラメーターの値を変更します。次のコマンドを実行して、
/etc/sysctl.conf
ファイルを開きます。vi /etc/sysctl.conf
I
キーを押して挿入モードに入ります。net.ipv4.tcp_fin_timeout
パラメーターの値を変更します。例: 10。
net.ipv4.tcp_fin_timeout = 10
Esc
キーを押して:wq
と入力し、ファイルを保存して閉じます。
設定を有効にするには、次のコマンドを実行します。
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
メソッドを使用して、入力ストリームと出力ストリームに基づいてファイルの最後を確認します。 戻り値が-1
の場合、ファイルの末尾に達しています。接続を終了するには、
close
メソッドを使用します。
C言語
read
関数の戻り値を確認します。戻り値が0の場合, 接続を終了します。
戻り値が0未満の場合は、エラーメッセージを表示します。 AGAINが表示されない場合は、接続を終了します。
クライアントのNATを設定した後、ECSインスタンスまたはApsaraDB RDSインスタンスにアクセスできないのはなぜですか。
問題の説明
NATが設定されると、クライアントはサーバー側のECSまたはRDSインスタンス (ソースNAT (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インスタンスがリモートサーバーとしてデプロイされている場合、
net.ipv4.tcp_tw_recycle
およびnet.ipv4.tcp_timestamps
パラメーターを0に設定します。ApsaraDB RDSインスタンスがリモートサーバーとしてデプロイされている場合、サーバー上のカーネルパラメーターを変更することはできません。 代わりに、クライアントで
net.ipv4.tcp_tw_recycle
およびnet.ipv4.tcp_timestamps
パラメーターを0に変更できます。
VNCを使用してインスタンスに接続します。
詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。
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
と入力し、ファイルを保存して閉じます。
設定を有効にするには、次のコマンドを実行します。
sysctl -p
一般的なLinuxカーネルパラメーター
項目 | 説明 |
net.core.rmem_default | ソケット受信ウィンドウのデフォルトサイズ。 単位:byte。 |
net.core.rmem_max | ソケット受信ウィンドウの最大サイズ。 単位:byte。 |
net.core.wmem_default | ソケット送信ウィンドウのデフォルトサイズ。 単位:byte。 |
net.core.wmem_max | ソケット送信ウィンドウの最大サイズ。 単位:byte。 |
net.core.net dev_max_backlog | カーネルの処理速度がNIC (network interface controller) の受信速度よりも遅い場合、NICの受信キューに余分なパケットが格納されます。 このパラメーターには、前のシナリオでキューに送信できるパケットの最大数を指定します。 |
net.core.somaxconn | このグローバルパラメータは、各ポートのリスニングキューの最大長を指定します。
|
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_タイムスタンプ | 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_ウェストウッド | このパラメータは、クライアント上で輻輳制御アルゴリズムを有効にする。 輻輳制御アルゴリズムは、スループットの評価を維持し、全体的な帯域幅使用を最適化しようとする。 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 | IPv4パケット転送機能を有効にするかどうかを指定します。 |
net.ipv4.ip_default_ttl | パケットが通過できる最大ホップ数。 |
net.netフィルター。nf_conntrack_tcp_timeout_established | 特定の期間内に確立された接続を介してパケットが送信されない場合、システムはiptablesを使用して接続を終了します。 |
net.netフィルター。nf_conntrack_max | 追跡できる接続数を指定する最大ハッシュ値。 |