このトピックでは、Elastic Compute Service (ECS) インスタンスの一般的なLinuxカーネルネットワークパラメータについて説明します。また、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シンプルアプリケーションサーバーにログオンします。詳細については、Linuxサーバーへの接続を参照してください。
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シンプルアプリケーションサーバーにログオンします。詳細については、Linuxサーバーへの接続を参照してください。
次のコマンドを実行して、現在のシステムのすべての有効なパラメータを表示します。
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と入力してファイルを保存して閉じます。構成を有効にするには、次のコマンドを実行します。
/sbin/sysctl -p
カーネルネットワークパラメータに関するFAQ
Linuxシンプルアプリケーションサーバーに接続できず、/var/log/message ログに「nf_conntrack: table full, drop packet」というエラーメッセージが表示されます。どうすればよいですか?
問題の説明
シンプルアプリケーションサーバーに接続できません。サーバーにpingを実行すると、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 は、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 パラメータの値を増やすことをお勧めします。
解決策
レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。
nf_conntrack_maxパラメータの値を変更します。次のコマンドを実行して、
/etc/sysctl.confファイルを開きます。vi /etc/sysctl.confIキーを押して、挿入モードに切り替えます。nf_conntrack_maxパラメータの値を変更します。例:
655350。net.netfilter.nf_conntrack_max = 655350Escキーを押し、:wqと入力してファイルを保存して閉じます。
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」というエラーメッセージが表示されるのはなぜですか?
問題の説明
Linuxシンプルアプリケーションサーバーで、「kernel: TCP: time wait bucket table overflow」というエラーメッセージが /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接続の数を調整するために使用されます。シンプルアプリケーションサーバー内の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 パラメータの値を変更する方法について説明します。
レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。
次のコマンドを実行して、既存の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.confIキーを押して、挿入モードに切り替えます。net.ipv4.tcp_max_tw_bucketsパラメータの値を変更します。例:
65535.net.ipv4.tcp_max_tw_buckets = 65535Escキーを押し、:wqと入力してファイルを保存して閉じます。
構成を有効にするには、次のコマンドを実行します。
sysctl -p
Linuxシンプルアプリケーションサーバーで多数のTCP接続がFIN_WAIT2状態になっているのはなぜですか?
問題の説明
Linuxシンプルアプリケーションサーバーで、多数の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接続の終了を高速化できます。
レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。
net.ipv4.tcp_fin_timeoutパラメータの値を変更します。次のコマンドを実行して、
/etc/sysctl.confファイルを開きます。vi /etc/sysctl.confIキーを押して、挿入モードに切り替えます。net.ipv4.tcp_fin_timeoutパラメータの値を変更します。例: 10。
net.ipv4.tcp_fin_timeout = 10Escキーを押し、:wqと入力してファイルを保存して閉じます。
構成を有効にするには、次のコマンドを実行します。
sysctl -p
Linuxシンプルアプリケーションサーバーで多数のTCP接続がCLOSE_WAIT状態になっているのはなぜですか?
問題の説明
Linuxシンプルアプリケーションサーバーで、多数のTCP接続がCLOSE_WAIT状態になっています。
原因
CLOSE_WAIT状態のTCP接続の数が範囲外であるため、この問題が発生する可能性があります。
TCPは、接続を終了するために4ウェイハンドシェイクを使用します。TCP接続の両端は、接続を終了するためのリクエストを開始できます。ピアが接続を終了したが、ローカルエンドが終了していない場合、接続はCLOSE_WAIT状態になります。ローカルエンドはこのハーフオープン接続を介してピアと通信できず、できるだけ早く接続を終了する必要があります。
解決策
プログラムでピアによって接続が終了していることを確認することをお勧めします。
レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。
プログラムでCLOSE_WAIT状態のTCP接続を確認して終了します。
プログラミング言語の読み取り関数と書き込み関数を使用して、CLOSE_WAIT状態のTCP接続を監視できます。JavaまたはC言語で接続を終了するには、次のいずれかの方法を使用できます。
Java言語
readメソッドを使用して、入力ストリームと出力ストリームに基づいてファイルの終わりを確認します。戻り値が-1の場合、ファイルの終わりに達しています。closeメソッドを使用して接続を終了します。
C言語
read関数の戻り値を確認します。戻り値が0の場合は、接続を終了します。
戻り値が0未満の場合は、エラーメッセージを表示します。AGAINが表示されない場合は、接続を終了します。
一般的な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 | このグローバルパラメータは、各ポートのリスニングキューの最大長を指定します。
|
net.core.optmem_max | 各ソケットの最大バッファサイズ。 |
net.ipv4.tcp_mem | このパラメータは、TCPスタックのメモリ使用量を反映します。単位はメモリページで、ほとんどの場合4KBです。
|
net.ipv4.tcp_rmem | 受信バッファサイズ。このパラメータは、ソケットが自動構成に使用するメモリのサイズを指定します。
|
net.ipv4.tcp_wmem | 送信バッファサイズ。このパラメータは、ソケットが自動構成に使用するメモリのサイズを指定します。
|
net.ipv4.tcp_keepalive_time | TCPがTCP接続が有効かどうかを確認するためにkeepaliveメッセージを送信する間隔。単位:秒。 |
net.ipv4.tcp_keepalive_intvl | 応答が返されない場合にTCPがkeepaliveメッセージを再送信する間隔。単位:秒。 |
net.ipv4.tcp_keepalive_probes | TCP接続が無効と見なされる前に送信できるkeepaliveメッセージの最大数。 |
net.ipv4.tcp_sack | このパラメータは、TCP選択的確認応答(SACK)を有効にするかどうかを指定します。値1は、TCP SACKが有効になっていることを示します。TCP SACK機能により、サーバーは不足しているパケットのみを送信できるため、パフォーマンスが向上します。ワイドエリアネットワーク(WAN)通信には、この機能を有効にすることをお勧めします。この機能により、CPU使用率が増加することに注意してください。 |
net.ipv4.tcp_timestamps | TCPタイムスタンプ。サイズは12バイトで、TCPヘッダーに含まれています。タイムスタンプは、再送信タイムアウト方式よりも正確な方法でラウンドトリップ時間(RTT)の計算をトリガーするために使用されます(RFC 1323)。パフォーマンスを向上させるには、このオプションを有効にすることをお勧めします。 |
net.ipv4.tcp_window_scaling | このパラメータは、RFC 1323で定義されているウィンドウスケーリングを有効にするかどうかを指定します。システムが64KBを超えるTCPウィンドウを使用できるようにするには、値を1に設定してウィンドウスケーリングを有効にします。TCPウィンドウの最大サイズは1GBです。このパラメータは、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 | このパラメータは、IPv4パケット転送機能が有効になっているかどうかを指定します。 |
net.ipv4.ip_default_ttl | パケットが通過できるホップの最大数。 |
net.netfilter.nf_conntrack_tcp_timeout_established | 確立された接続で一定期間パケットが送信されない場合、システムはiptablesを使用して接続を終了します。 |
net.netfilter.nf_conntrack_max | 追跡できる接続の数を指定する最大ハッシュ値。 |