すべてのプロダクト
Search
ドキュメントセンター

Simple Application Server:Linuxシステムにおける一般的なカーネルネットワークパラメータの紹介と一般的な問題の処理

最終更新日:Dec 24, 2024

このトピックでは、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/ ディレクトリ内のカーネルパラメータの表示と変更

  1. Linuxシンプルアプリケーションサーバーにログオンします。詳細については、Linuxサーバーへの接続を参照してください。

  2. cat コマンドを実行して、構成ファイルの内容を表示します。

    たとえば、net.ipv4.tcp_tw_recycle パラメータの値を表示するには、次のコマンドを実行します。

    cat /proc/sys/net/ipv4/tcp_tw_recycle 
  3. echo コマンドを実行して、カーネルパラメータを含むファイルを変更します。

    たとえば、net.ipv4.tcp_tw_recycle パラメータの値を0に変更するには、次のコマンドを実行します。

    echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle 

/etc/sysctl.conf ファイル内のカーネルパラメータの表示と変更

  1. Linuxシンプルアプリケーションサーバーにログオンします。詳細については、Linuxサーバーへの接続を参照してください。

  2. 次のコマンドを実行して、現在のシステムのすべての有効なパラメータを表示します。

    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
  3. カーネルパラメータを変更します。

    • 次のコマンドを実行して、カーネルパラメータを一時的に変更します。

      /sbin/sysctl -w kernel.parameter="[$Example]"
      説明

      kernel.parameterをカーネルパラメータ名に、[$Example]をビジネス要件に基づいた特定の値に置き換えます。たとえば、sysctl -w net.ipv4.tcp_tw_recycle="0" コマンドを実行して、net.ipv4.tcp_tw_recycle パラメータの値を0に変更します。

    • カーネルパラメータを永続的に変更します。

      1. 次のコマンドを実行して、/etc/sysctl.conf 構成ファイルを開きます。

        vim /etc/sysctl.conf
      2. I キーを押して、挿入モードに切り替えます。

      3. 必要に応じてカーネルパラメータを変更します。

        たとえば、ファイルに次の変更を加えます。

        net.ipv6.conf.all.disable_ipv6 = 1
        net.ipv6.conf.default.disable_ipv6 = 1
        net.ipv6.conf.lo.disable_ipv6 = 1
      4. Esc キーを押し、:wq と入力してファイルを保存して閉じます。

      5. 構成を有効にするには、次のコマンドを実行します。

        /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 パラメータの値を増やすことをお勧めします。

解決策

  1. レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。

  2. nf_conntrack_max パラメータの値を変更します。

    1. 次のコマンドを実行して、/etc/sysctl.conf ファイルを開きます。

      vi /etc/sysctl.conf
    2. I キーを押して、挿入モードに切り替えます。

    3. nf_conntrack_max パラメータの値を変更します。

      例:655350

      net.netfilter.nf_conntrack_max = 655350
    4. Esc キーを押し、:wq と入力してファイルを保存して閉じます。

  3. nf_conntrack_tcp_timeout_established パラメータの値を変更します。

    デフォルト値:432000。単位:秒。例:1200。

    net.netfilter.nf_conntrack_tcp_timeout_established = 1200
  4. 構成を有効にするには、次のコマンドを実行します。

    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 パラメータの値を変更する方法について説明します。

  1. レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。

  2. 次のコマンドを実行して、既存のTCP接続の数をクエリします。

    netstat -antp | awk 'NR>2 {print $6}' | sort | uniq -c

    次のコマンド出力は、6,300個の接続がTIME_WAIT状態であることを示しています。

    6300 TIME_WAIT
     40 LISTEN
     20 ESTABLISHED
     20 CONNECTED
  3. 次のコマンドを実行して、net.ipv4.tcp_max_tw_buckets パラメータの値を表示します。

    cat /etc/sysctl.conf | grep net.ipv4.tcp_max_tw_buckets

    次の図に示すコマンド出力は、net.ipv4.tcp_max_tw_buckets パラメータの値が20000であることを示しています。

    2023-04-02_11-03-24

  4. net.ipv4.tcp_max_tw_buckets パラメータの値を変更します。

    1. 次のコマンドを実行して、/etc/sysctl.conf ファイルを開きます。

      vi /etc/sysctl.conf
    2. I キーを押して、挿入モードに切り替えます。

    3. net.ipv4.tcp_max_tw_buckets パラメータの値を変更します。

      例: 65535.

      net.ipv4.tcp_max_tw_buckets = 65535
    4. Esc キーを押し、:wq と入力してファイルを保存して閉じます。

  5. 構成を有効にするには、次のコマンドを実行します。

    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接続の終了を高速化できます。

  1. レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。

  2. net.ipv4.tcp_fin_timeout パラメータの値を変更します。

    1. 次のコマンドを実行して、/etc/sysctl.conf ファイルを開きます。

      vi /etc/sysctl.conf
    2. I キーを押して、挿入モードに切り替えます。

    3. net.ipv4.tcp_fin_timeout パラメータの値を変更します。

      例: 10。

      net.ipv4.tcp_fin_timeout = 10
    4. Esc キーを押し、:wq と入力してファイルを保存して閉じます。

  3. 構成を有効にするには、次のコマンドを実行します。

    sysctl -p

Linuxシンプルアプリケーションサーバーで多数のTCP接続がCLOSE_WAIT状態になっているのはなぜですか?

問題の説明

Linuxシンプルアプリケーションサーバーで、多数のTCP接続がCLOSE_WAIT状態になっています。

原因

CLOSE_WAIT状態のTCP接続の数が範囲外であるため、この問題が発生する可能性があります。

TCPは、接続を終了するために4ウェイハンドシェイクを使用します。TCP接続の両端は、接続を終了するためのリクエストを開始できます。ピアが接続を終了したが、ローカルエンドが終了していない場合、接続はCLOSE_WAIT状態になります。ローカルエンドはこのハーフオープン接続を介してピアと通信できず、できるだけ早く接続を終了する必要があります。

解決策

プログラムでピアによって接続が終了していることを確認することをお勧めします。

  1. レスキュー機能を使用してシンプルアプリケーションサーバーに接続します。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。

  2. プログラムでCLOSE_WAIT状態のTCP接続を確認して終了します。

    プログラミング言語の読み取り関数と書き込み関数を使用して、CLOSE_WAIT状態のTCP接続を監視できます。JavaまたはC言語で接続を終了するには、次のいずれかの方法を使用できます。

    • Java言語

      1. read メソッドを使用して、入力ストリームと出力ストリームに基づいてファイルの終わりを確認します。戻り値が -1 の場合、ファイルの終わりに達しています。

      2. 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.ipv4.tcp_max_syn_backlog パラメータは、3ウェイハンドシェイク中のハーフオープン接続の最大数を指定します。このパラメータとは異なり、net.core.somaxconnパラメータは確立状態の接続の最大数を指定します。ECSインスタンスのビジネストラフィックが多い場合は、net.core.somaxconnパラメータの値を増やします。listen(2) 関数の backlog パラメータも、リスニングポートで確立状態の接続の最大数を指定します。backlog 値が net.core.somaxconn 値よりも大きい場合、net.core.somaxconn 値が優先されます。

net.core.optmem_max

各ソケットの最大バッファサイズ。

net.ipv4.tcp_mem

このパラメータは、TCPスタックのメモリ使用量を反映します。単位はメモリページで、ほとんどの場合4KBです。

  • 最初の値は、メモリ使用量の下限です。

  • 2番目の値は、ストレステストを実行するときにバッファが耐えることができる最大ストレスです。

  • 3番目の値は、メモリ使用量の上限です。メモリ使用量が上限を超えると、システムはパケットを破棄してメモリ使用量を削減します。帯域幅遅延積(BDP)の大きいネットワークの場合は、値を増やすことができます。単位はバイトではなくメモリページです。

net.ipv4.tcp_rmem

受信バッファサイズ。このパラメータは、ソケットが自動構成に使用するメモリのサイズを指定します。

  • 最初の値は、ソケット受信バッファの最小サイズです。単位:バイト。

  • 2番目の値はデフォルト値で、rmem_default値を上書きできます。システムのビジネストラフィックが少ない場合は、デフォルト値を使用できます。単位:バイト。

  • 3番目の値は、ソケット受信バッファの最大サイズで、rmem_max値を上書きできます。単位:バイト。

net.ipv4.tcp_wmem

送信バッファサイズ。このパラメータは、ソケットが自動構成に使用するメモリのサイズを指定します。

  • 最初の値は、ソケット送信バッファの最小サイズです。単位:バイト。

  • 2番目の値はデフォルト値で、wmem_default値を上書きできます。システムのビジネストラフィックが少ない場合は、デフォルト値を使用できます。単位:バイト。

  • 3番目の値は、ソケット受信バッファの最大サイズで、wmem_maxの値を上書きすることはできません。単位:バイト。

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(SYN_COOKIES)を有効にするかどうかを指定します。カーネル用にCONFIG_SYN_COOKIESを有効にしてコンパイルする必要があります。SYN_COOKIESは、ソケットが多数の接続リクエストを受信したときにソケットが過負荷になるのを防ぐことができます。

  • デフォルト値は0で、TCP SYN cookie機能が無効になっていることを示します。

  • このパラメータが1に設定されていて、SYN_RECV キューがいっぱいになると、カーネルはSYNパケットへの応答でSYN-ACKパケットに初期シーケンス番号を追加します。SYNパケットに基づいて計算されたシーケンス番号を追加する代わりにです。初期シーケンス番号には、送信元IPアドレス、送信元ポート番号、宛先IPアドレス、宛先ポート番号、およびタイムスタンプに基づいて計算されたフィールドが含まれています。このようにして、クライアントは初期シーケンス番号を使用して、ACKパケットで異なるシーケンス番号を計算し、期待どおりにSYN-ACKパケットに応答します。攻撃者はSYN-ACKパケットを誤って識別するか、ACKパケットで応答できません。net.ipv4.tcp_syncookies が有効になると、net.ipv4.tcp_max_syn_backlog は無視されます。

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

SYN_RECV 状態のTCP接続の数。

SYN_RECV 状態では、サーバーはクライアントからのACKパケットを待機して予期します。クライアントへの接続の確立中に、サーバーはSYNパケットを受信し、SYN-ACKパケットで応答し、次にACKパケットを受信して3ウェイハンドシェイクを実装します。このパラメータは、キューに格納できる接続の最大数も示します。サーバーが頻繁に過負荷になる場合は、net.ipv4.tcp_max_syn_backlogパラメータの値を増やします。デフォルト値は、インスタンスのメモリサイズによって異なります。デフォルトの最大値は2048です。

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

追跡できる接続の数を指定する最大ハッシュ値。

参考文献