JavaTCPソケット属性

  • Tomcat Version:8.5.23

NIOおよびNIO2実装は、Connectorの共通及びHTTPの標準属性に加えて、次のJava TCPソケット属性をサポートします。

表記説明:必須可否欄 〇:必須 -:任意

属性 必須可否 未指定時の
デフォルト値
初期設定値 説明
socket.rxBufSize - NULL 未指定 (int)ソケット受信バッファ(SO_RCVBUF)のサイズ(バイト単位)。
設定されていない場合はJVMのデフォルトが使用されます。
socket.txBufSize - NULL 未指定 (int)ソケット送信バッファ(SO_SNDBUF)のサイズ(バイト単位)。
設定されていない場合はJVMのデフォルトが使用されます。
socket.tcpNoDelay - true 未指定 (boolean)標準属性tcpNoDelayと同等です。
socket.soKeepAlive - null 未指定 (boolean)ソケットのKeepAlive設定(SO_KEEPALIVE)のブール値。
設定されていない場合はJVMのデフォルトが使用されます。
socket.ooBInline - null 未指定 (boolean)ソケットOOBINLINE設定のブール値。
設定されていない場合はJVMのデフォルトが使用されます。
socket.soReuseAddress - null 未指定 (boolean)ソケット再利用アドレスオプション(SO_REUSEADDR)のブール値。
設定されていない場合はJVMのデフォルトが使用されます。
socket.soLingerOn - null 未指定 (boolean)SO_LINGERオプションを指定します。
linger-on-close タイムアウトを指定するこのオプションは、
TCP ソケットの close() からの即時リターンを無効または有効にします。
soLingerOn属性は、soLongTime属性とペアになっています。
両方の属性が設定されていない場合、JVMのデフォルトが使用されます。
標準属性であるconnectionLingerが0以上を指定されるとこの属性はtrueが設定されます。
connectionLinger属性が0より小さい値を設定されている場合には、falseが設定されます。
socket.soLingerTime - null 未指定 (int)ソケットの(SO_LINGER)オプション時間(秒)。
soLingerOn属性は、soLongTime属性とペアになっています。
両方の属性が設定されていない場合、JVMのデフォルトが使用されます。
標準属性であるconnectionLingerが設定されます。
socket.soTimeout - 20000(20秒) 未指定 (int)ソケットの(SO_TIME)オプション時間(ミリ秒)。
標準属性であるconnectionTimeoutの値が設定されます。
socket.
performanceConnectionTime
- null 未指定 (int)パフォーマンス設定の最初(接続時間の短さの相対的な重要度を表す)の値。
JavaSE JavaAPI Socket」を参照してください。
3つのパフォーマンス属性をすべて設定する必要があります。
それ以外の場合は、JVMのデフォルトが3つすべてに使用されます
socket.
performanceLatency
- null 未指定 (int)パフォーマンス設定の2番目(応答時間の速さの相対的な重要度を表す)の値。
JavaSE JavaAPI Socket」を参照してください。
3つのパフォーマンス属性をすべて設定する必要があります。
それ以外の場合は、JVMのデフォルトが3つすべてに使用されます。
socket.
performanceBandwidth
- null 未指定 (int)パフォーマンス設定の3番目(帯域幅の広さの相対的な重要度を表す)の値。
JavaSE JavaAPI Socket」を参照してください。
3つのパフォーマンス属性をすべて設定する必要があります。
それ以外の場合は、JVMのデフォルトが3つすべてに使用されます。
socket.unlockTimeout - 250(ミリ秒) 未指定 (int)ソケットロック解除のタイムアウトです。
コネクタが停止すると、コネクタを開いてアクセプタスレッドを解放しようとします。

NIO固有属性

以下はNIOコネクタ(connectorのprotocol属性参照)固有の属性です。

表記説明:必須可否欄 〇:必須 -:任意

属性 必須可否 未指定時の
デフォルト値
初期設定値 説明
pollerThreadCount - 1(1CPU辺) 未指定 (int)ポーリングイベントの実行に使用されるスレッドの数。
デフォルト値は1プロセッサ当たり1ですが、2以下です。
ソケットを受け入れると、オペレーティングシステムはグローバルロックを保持します。
したがって、2スレッドを上回る利点は急速に減少します。
複数のスレッドを持つことは、接続を非常に迅速に受け入れる必要のあるシステムにとってです。
しかし、通常はacceptCount属性の値を増やすだけで問題は解決します。
この値を大きくすると、大量の送信ファイル操作が行われている場合にも有効です。 (筆者記)ポーリングイベントの実行に使用されるとは、
スレッドプールにおいて、タスク待ちを管理するキューを意味しています。
pollerThreadPriority - 5 未指定 (int)ポーリングイベントの実行に使用されるスレッドの優先順位。
デフォルト値の5は、java.lang.Thread.NORM_PRIORITYを意味します。
この優先順位の意味の詳細については、JavaDocのjava.lang.Threadクラスを参照してください。
selectorTimeout - 1000(ミリ秒) 未指定 (int)ポーラー(タスク待ちを管理するキュー)がselect()でタイムアウトするまでの時間(ミリ秒)です。
この値は重要です。接続のクリーンアップは同じスレッドで行われるため、
この値を非常に高い値に設定しないでください。
useSendfile - true 未指定 (boolean)この属性を使用して、sendfile機能を有効または無効にします。
sendfileを使用すると、Tomcatがレスポンスで実行した可能性のある圧縮が無効になることに注意してください。
socket.directBuffer - false 未指定 (boolean)直接ByteBuffersを使用するか、JavaにマップされたByteBuffersを使用するかを指定します。
trueの場合はバッファを割り当てるためにjava.nio.ByteBuffer.allocateDirect() が使用され、
falseの場合はjava.nio.ByteBuffer.allocate()が使用されます。
ダイレクトバッファを使用する(true指定時)場合は、ダイレクトメモリ領域に適切な量のメモリを割り当ててください。
SunのJDKでは-XX:MaxDirectMemorySize = 256mのようになります。
socket.directSslBuffer - false 未指定 (boolean)SSLバッファリング時に直接ByteBuffersを使用するか、JavaにマップされたByteBuffersを使用するかを指定します。
trueの場合はバッファを割り当てるためにjava.nio.ByteBuffer.allocateDirect() が使用され、
falseの場合はjava.nio.ByteBuffer.allocate()が使用されます。
ダイレクトバッファを使用する(true指定時)場合は、ダイレクトメモリ領域に適切な量のメモリを割り当ててください。
SunのJDKでは-XX:MaxDirectMemorySize = 256mのようになります。
socket.appReadBufSize - 8192(バイト) 未指定 (int)Tomcatで開かれた各接続は、読み込みByteBufferに関連付けられます。
この属性は、このバッファのサイズを制御します。
並行性を低くするには、デフォルト値より値を増やしてより多くのデータをバッファリングします。
極端な量のキープアライブ接続の場合は、この数を減らすか、ヒープサイズを大きくします。
socket.appWriteBufSize - 8192(バイト) 未指定 (int)Tomcatで開かれた各接続は、書込みByteBufferに関連付けられます。
この属性は、このバッファのサイズを制御します。
極端な量のキープアライブ接続の場合は、この数を減らすか、ヒープサイズを大きくします。
ここでのデフォルト値はかなり低く、数万の同時接続を扱っていない場合は上にしてください。
socket.bufferPool - 500 未指定 (int)NIOコネクタは、ソケットにリンクされた要素を保持するNioChannelというクラスを使用します。
ガベージコレクションを減らすために、NIOコネクタはこれらのチャネルオブジェクトをキャッシュします。
この値は、そのキャッシュのサイズを指定します。
デフォルト値は500で、キャッシュには500のNioChannelオブジェクトが格納されていることを表します。
-1:無制限のキャッシュ 0:キャッシュが無い
socket.bufferPoolSize - 1024*1024*100 (100MB) 未指定 (int)NioChannelプールは、オブジェクトベースではなくサイズベースでも構いません。
サイズは次のように計算されます。
NioChannelバッファサイズ = 読み出しバッファサイズ + 書き込みバッファサイズ
SecureNioChannelバッファサイズ = アプリケーション読み出しバッファサイズ + アプリケーション書き込みバッファサイズ
+ ネットワーク読み出しバッファサイズ
+ ネットワーク書き込みバッファサイズ
socket.processorCache - 500 未指定 (int)TomcatはSocketProcessorオブジェクトをキャッシュしてガベージコレクションを減らします。
整数値は、最大でキャッシュに保持するオブジェクトの数を指定します。
-1:無制限のキャッシュ 0:キャッシュが無い場合
socket.keyCache - 500 未指定 (int)TomcatはKeyAttachmentオブジェクトをキャッシュしてガベージコレクションを減らします。
整数値は、最大でキャッシュに保持するオブジェクトの数を指定します。
デフォルトは500です。その他の値は、無制限のキャッシュの場合は-1、キャッシュがない場合は0です。
(筆者記)ソケット関係のデフォルト値は、SocketPropertiesに定義されているのですが、
「keyCache」のキーワードがtomcat8.5.23のソースからは一切存在しません。
過去の古いTomcat6系などは同クラスに定義されていました。
configtest.batによるチェックでも属性が存在しないエラーが出力されます。
本設定はTomcatサーバのデグレによるものだと思います。
属性として利用しないでください。
socket.eventCache - 500 未指定 (int)TomcatはPollerEventオブジェクトをキャッシュしてガベージコレクションを減らします。
整数値は、最大でキャッシュに保持するオブジェクトの数を指定します。 -1:無制限のキャッシュ 0:キャツシュが無い
selectorPool.maxSelectors - 200 未指定 (int)セレクタの競合を減らすために、プールで使用される最大セレクタ。
org.apache.tomcat.util.net.NioSelectorShared
コマンドラインがfalseに設定されている場合、このオプションを使用します。
selectorPool.maxSpareSelectors - -1 未指定 (int)プール内で使用される最大のスペアセレクタで、セレクタの競合を減らします。
セレクタがプールに返されると、システムはそれを保持するか、GCにするかを決めることができます。
org.apache.tomcat.util.net.NioSelectorShared
コマンドラインがfalseに設定されている場合、このオプションを使用します。
デフォルト値の-1は無制限を意味します。
(オプション) - true 未指定 これはserver.xmlのConnectorタグから直接指定できません。
-Dorg.apache.tomcat.util.net.NioSelectorShared = true | false
この設定はJVM起動オプションの引数で-Dオプションを追加指定します。
conf/setenv.shに「JAVA_OPTS=-Dorg.apache.tomcat.util.net.NioSelectorShared=false」形式でJAVA_OPTSに追加します。
スレッドごとにセレクタを使用する場合は、この値をfalseに設定します。
これをfalseに設定すると、selectorPool.maxSelectors属性を使用してセレクタのプールのサイズを制御できます。

NIO2固有属性

以下はNIO2コネクタ(connectorのprotocol属性参照)固有の属性です。

表記説明:必須可否欄 〇:必須 -:任意

属性 必須可否 未指定時の
デフォルト値
初期設定値 説明
useSendfile - true 未指定 (boolean)この属性を使用して、sendfile機能を有効または無効にします。
sendfileを使用すると、Tomcatがレスポンスで実行した可能性のある圧縮が無効になることに注意してください。
socket.directBuffer - false 未指定 NIO参照のこと
socket.directSslBuffer - false 未指定 NIO参照のこと
socket.appReadBufSize - false 未指定 NIO参照のこと
socket.appWriteBufSize - false 未指定 NIO参照のこと
socket.bufferPool - 500 未指定 (int)NIOコネクタは、ソケットにリンクされた要素を保持するNio2Channelというクラスを使用します。
ガベージコレクションを減らすために、NIO2コネクタはこれらのチャネルオブジェクトをキャッシュします。
この値は、そのキャッシュのサイズを指定します。
デフォルト値は500で、キャッシュには500のNio2Channelオブジェクトが格納されていることを表します。
-1:無制限のキャッシュ 0:キャッシュが無い
socket.processorCache - 500 未指定 NIO参照のこと

APR/native固有属性

以下はAPRI/nativeコネクタ(connectorのprotocol属性参照)固有の属性です。

表記説明:必須可否欄 〇:必須 -:任意

属性 必須可否 未指定時の
デフォルト値
初期設定値 説明
deferAccept - true 未指定 (boolean)このコネクタのリスニングソケットにTCP_DEFER_ACCEPTフラグを設定します。
TCP_DEFER_ACCEPTがオペレーティング・システムでサポートされている場合、
デフォルト値はtrueです。それ以外の場合はfalseです。
ipv6v6only - false 未指定 デュアルスタックシステムでIPv6アドレスをリッスンする場合、
コネクタがIPv6アドレスだけリッスンさせる場合には、trueを指定します。
falseの場合には、コネクターはIPv6とそれに相当する存在したIPv4アドレスをリッスンします。
pollerThreadCount - 1(1CPU辺) 未指定 保存された接続のポーリングに使用されるスレッドの数。
Windowsでは、各スレッドによって管理されるソケットが1024未満になるようにデフォルトが選択されています。
Linuxの場合、デフォルトは1です。
Windowsでデフォルトを変更すると、パフォーマンスが低下する可能性があります。
pollTime - 2000(ミリ秒) 未指定 ミリ秒単位のポーリングコールの期間。
この値を小さくすると、接続のレイテンシが若干低下することがありますが、
ポーリングコールが増えるほどCPUが多く使用されます。
sendfileSize - 1024(バイト) 未指定 非同期に静的ファイルを送信する責任を負うポーラーが所定の時間に保持できるソケットの量。
余分な接続は、データが送信されずにすぐに閉じられます(クライアント側で長さがゼロのファイルになります)。
ほとんどの場合、sendfileはすぐに返される(カーネルによって "同期的に"処理される)呼び出しであり、
sendfileポーラーは使用されないので、並行して送信できる静的ファイルの量は多くなります指定された量よりも大きいです。
threadPriority - 1024(バイト) 未指定 (int)ポーリングイベントの実行に使用されるスレッドの優先順位。
デフォルト値の5は、java.lang.Thread.NORM_PRIORITYを意味します。
この優先順位の意味の詳細については、JavaDocのjava.lang.Threadクラスを参照してください。
useSendfile - true 未指定 (boolean)この属性を使用して、sendfile機能を有効または無効にします。
sendfileを使用すると、Tomcatがレスポンスで実行した可能性のある圧縮が無効になることに注意してください。

各種属性の設定について

本頁に記載された属性は、NIO,NIO2,APRを操作する属性です。
OSコマンドに近い操作に影響を与える設定などが説明から理解して頂けると思います。
各種属性の変更には、ソケット通信、TCP/IP、OS、Java(主にソケットとスレッドプール)の知識が必須です。
インフラチーム等で本設定を明示する場合には、チーム内で指定属性の説明とTomcatのソースファイル上どのような コーディングがされているかを検討して、有識者を踏まえてレビューを実施して下さい。
そして、商用環境にリリースする前の負荷試験環境で設定値1つ1つの妥当性を確認してからリリースして下さい。