TCP遅延肯定応答タイマーのタイムアウト値の変更UNIX処方箋

Solaris 8とSolaris 9のクライアントが混在する環境で、Solaris 9のクライアントだけNFSサーバの反応が悪い。そんなときは、TCP遅延肯定応答(DACK)タイマーを疑ってみるとよい。

» 2007年11月12日 04時10分 公開
[ITmedia]

NFSサーバを用いて、Solaris 8のクライアントとSolaris 9のクライアントからファイル共有を行っています。サーバとクライアントともに同一ネットワーク内にあるのですが、Solaris 9のクライアントだけにパフォーマンスの低下が見られます。Solaris 8とSolaris 9では、仕様上の変更などがあるのでしょうか?


過去の事例を確認したところ、TCP遅延肯定応答(DACK)タイマーのタイムアウトが発生し、パフォーマンスが低下したケースがありました。この現象は、ネットワークトラフィックが大量発生する環境ほど起こりやすいようです。

DACKタイマーのタイムアウト値

 Solaris 8とSolaris 9では、ホストに対するDACKタイマーのタイムアウト値(ミリ秒)の仕様が変更されており、パラメータのデフォルト値が異なっています(表1)

表1 表1 DACK関連パラメータのデフォルト値(単位はミリ秒) ※同一ネットワークセグメント内の通信はtcp_local_dack_intervalパラメータ、異なるネットワークセグメントへの通信はtcp_deferred_ack_intervalパラメータで設定

 Solaris 8のタイムアウト値はtcp_deferred_ack_intervalパラメータのみで設定していましたが、Solaris 9では同一ネットワーク用と異なるネットワーク用の2パラメータが用意されています。

 質問のケースは同一ネットワーク内の通信なので、Solaris 8とSolaris 9のデフォルト値が異なっており、後者は前者の半分となります。Solaris 8で問題ないことを考えると、デフォルト値の違いがパフォーマンスの低下に影響を与えているはずなので、Solaris 9のtcp_local_dack_intervalパラメータの値を100ミリ秒に変更するとよいでしょう。

nddコマンドによるパラメータの設定

tcp_local_dack_intervalパラメータの値を変更するには、nddコマンドの「-set」オプションでパラメータと値を指定します*

# ndd -set /dev/tcp tcp_local_dack_interval 100


 正確に設定できたかどうかは、「-set」オプションと設定値を省略すれば確認可能です。

# ndd /dev/tcp tcp_local_dack_interval

100 ←現在の設定値


 この結果、Solaris 8と同じ設定値になったはずです。

起動スクリプトファイルの作成

 nddコマンドで設定値を変更しても、システムを再起動するとデフォルト値に戻ってしまいます。システム再起動後もパラメータの設定を有効にするには、nddコマンドの実行内容をシステム起動スクリプトで指定します。

 システム起動スクリプトの詳細についてはサン・マイクロシステムズのWebページを参照していただくとして、ここではnddコマンドの設定例だけを紹介します。

 まずは、/etc/rc2.dディレクトリ以下に次のような内容の起動スクリプトファイルS70nddを作成します。

#!/sbin/sh

ndd -set /dev/tcp tcp_local_dack_interval 100


 作成したファイルのアクセス権限は、chmodコマンドで「744」に変更しておきましょう。

# chmod 744 /etc/rc2.d/S70ndd

# ls -l /etc/rc2.d/S70ndd

-rwxr--r--1 root other 57 ... /etc/rc2.d/S70ndd


 最後に、システムを再起動し、OSの起動後にnddコマンドで設定値を確認します。

# ndd /dev/tcp tcp_local_dack_interval

100


 設定が完了したら、NFS通信のパフォーマンスを確認しながら微調整を行うとよいでしょう。

このページで出てきた専門用語

nddコマンドの「-set」オプションでパラメータと値を指定します

tcp_local_dack_intervalパラメータの値は、500ミリ秒を超えないように設定する必要がある。


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ