APIクライアントのTCP/IPネットワークの最適化

EssbaseのC-APIベースのクライアントはすべて、ネットワーク層を使ってEssbaseサーバーと情報をやりとりします。クライアントのC-APIベースのアプリケーションからEssbaseへの要求では、要求の最初にTCP/IPソケットを開き、要求の終わりにそれを閉じることが必要です。ソケットとは、オペレーティング・システムによって管理されるリソースであり、一定数のそのようなリソースがあります。その数はオペレーティング・システムに特有です。ソケットは、閉じられると、TIME_WAIT状態と呼ばれる休止状態に入ります。その期間は、オペレーティング・システムに特有であり構成可能です。その期間の終わりに、ソケットは、再使用のためにオペレーティング・システムがリープできます。ソケットを開く呼出しが正常終了するかどうかは、どれほど速くオペレーティング・システムが再使用のために閉じたソケットをリープできるかどうかの関数です。

APIクライアントが、非常に多くの接続を非常に速く確立し終了するよう設計されている場合には、利用可能なポートの定数(約64,000)が枯渇したり枯渇しそうになるため、問題が発生する場合があります。使用されたポートはまだTIME_WAIT状態にあるため、利用可能なポートがオペレーティング・システムによって取得されるまで時間がかかり、結果として、接続が拒否されたり、プログラムの動作が緩慢になります。高度な並行処理が期待されている配置で、これらの兆候が発生している場合、オペレーティング・システムのTIME_WAIT遅延を短縮することをお薦めします。たとえば、遅延を4分から30秒に短縮すると、大幅にパフォーマンスが向上する場合があります。

この状況は、コマンド・プロンプト上でコマンドnetstatを実行することにより検出できます。その出力は、TIME_WAIT状態にあるソケットの数を示します。その数が大きいほど、以後のAPI要求が失敗する可能性が高くなります。

この状況を回避するためには、オペレーティング・システムのTIME_WAIT値を小さくすることを検討してください。

Windowsでは、TIME_WAIT値はWindowsレジストリにあります。

UNIXでは、ndd (SolarisとHPUX)、no (AIX)およびecho (Linux)などのシステム・ツールを使用して、カーネル・パラメータを操作します。

SolarisおよびHP-UXでTIME_WAIT値を表示、調整するには、

      ndd -get /dev/tcp tcp_time_wait_interval     
ndd -set /dev/tcp tcp_time_wait_interval 30000
   

AIXでは、次のコマンドが、すべてのパラメータに対する値を表示します:

      /usr/sbin/no -a 
   

AIXで次のコマンドを発行し、TCP_TIMEWAIT状態を30秒に設定します(ただし、すでに30未満である場合は、調整しないでください):

      /usr/sbin/no -o tcp_timewait =2
/usr/sbin/no -o tcp_ephemeral_low = 32768
/usr/sbin/no -o    tcp_ephemeral_high = 65535
   

Linuxでは、次のコマンドを発行して、timeout_timewaitパラメータを30秒に設定します:

      echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout