第16章 ネットワークのチューニング

目次

16.1. カーネルのソケットバッファの設定
16.2. ネットワークのボトルネック検出とネットワークトラフィックの分析
16.3. netfilter
16.4. さらなる情報

ネットワークサブシステムは比較的複雑な仕組みで、チューニング作業はシステムの 使用シナリオに大きく依存します。それ以外にも、お使いのネットワーク内で利用して いるソフトウエアクライアントやハードウエアコンポーネント (スイッチ、ルータ、 ゲートウエイなど) など外部要因にも大きく依存します。 Linux カーネルでは 信頼性を高め、オーパヘッドの低さやスループットの高さよりも遅延の少なさを 求めた仕組みになっています。その他の設定はセキュリティを危うくする可能性が あるものもありますが、これによって性能を改善することもできます。

16.1. カーネルのソケットバッファの設定

ネットワーク処理は主に、通信時に使用する TCP/IP プロトコルとソケット インターフェイスを基礎にしています。 TCP/IP について、詳しくは 第13章 ネットワークの基礎 (↑リファレンス) をお読みください。 Linux カーネルは ソケットバッファを利用してソケットインターフェイス経由でのデータ送受信を 行ないます。カーネル側のソケットバッファについてチューニングの余地があります。

[Important]TCP の自動チューニングについて

カーネルバージョン 2.6.17 以降では、最大で 4 [MB] までのバッファサイズの 完全自動チューニングが行なわれます。これにより、手作業でのチューニングは ほとんどの場合、ネットワーク性能を改善することにはつながりません。また、 下記に示す変数については何も変更を加えないほうがよりよい結果である場合が あるほか、少なくともチューニング作業はより注意深く行なう必要があります。

古いバージョンのカーネルから更新している場合は、これら手作業による TCP チューニングは、自動チューニング機能を利用する観点から取り除いておくべき 設定です。

/proc ファイルシステム内に存在する特殊なファイル では、カーネルのソケットバッファのサイズと動作を変更することができます。 /proc ファイルシステムについて、詳しくは 2.6項 「/proc ファイルシステム」 をお読みください。ネットワーク関連の ファイルは下記のディレクトリにあります:

/proc/sys/net/core
/proc/sys/net/ipv4
/proc/sys/net/ipv6

一般的な net 以下の変数については、カーネルの ドキュメンテーション (linux/Documentation/sysctl/net.txt) で説明されています。 ipv4 以下の特殊な変数に ついては、 linux/Documentation/networking/ip-sysctl.txtlinux/Documentation/networking/ipvs-sysctl.txt で説明されています。

/proc ファイルシステム内では、たとえばすべての プロトコルに対して最大ソケット受信バッファサイズや最大ソケット送信 バッファサイズを設定することができるほか、 TCP プロトコル (ipv4 内) に対してのみ設定することもできます。 そのほか、すべてのプロトコルに対して上書き設定を行なうこともできます (core) 。

/proc/sys/net/ipv4/tcp_moderate_rcvbuf

/proc/sys/net/ipv4/tcp_moderate_rcvbuf1 に設定されている場合、自動チューニングが有効に 設定され、バッファサイズが自動で調整されます。

/proc/sys/net/ipv4/tcp_rmem

ここで表示される 3 つの値は、それぞれ 1 接続あたりのメモリ受信バッファ サイズの最小値/初期値/最大値を表わします。ここで指定するサイズは、 TCP のウインドウサイズではなく実際のメモリ使用量です。

/proc/sys/net/ipv4/tcp_wmem

tcp_rmem と同じで、こちらは 1 接続あたりのメモリ 送信バッファサイズの最小値/初期値/最大値を設定します。

/proc/sys/net/core/rmem_max

アプリケーション側から要求可能な、受信バッファサイズの最大値を設定します。

/proc/sys/net/core/wmem_max

アプリケーション側から要求可能な、送信バッファサイズの最大値を設定します。

/proc を利用することで、不要な TCP 機能を無効化すること もできます (既定ではすべての TCP 機能が有効に設定されています) 。たとえば 下記のようなファイルがあります:

/proc/sys/net/ipv4/tcp_timestamps

TCP タイムスタンプは RFC1323 で定義されているものです。

/proc/sys/net/ipv4/tcp_window_scaling

TCP のウインドウスケーリングも RFC 1323 で定義されているものです。

/proc/sys/net/ipv4/tcp_sack

選択確認応答 (SACK) の設定を行ないます。

sysctl コマンドを利用することで、 /proc ファイルシステム内にある変数を読み書きすること ができます。 sysctl/etc/sysctl.conf ファイルを読み込む仕組みになっているため、システムの再起動後も設定を持続させ 続けることができるという点で、 cat (読み込み) や echo (書き込み) を利用するよりは適切な方法です。 sysctl を利用すると、すべての変数とその値を読み込むことが 簡単に行なえます。 root で下記のようなコマンドを実行すると、 TCP 関連の設定を一覧表示することができます:

sysctl -a | grep tcp
[Note]ネットワーク変数のチューニングによる派生効果について

ネットワーク関連の変数をチューニングすることで、 CPU やメモリなど 他のシステム資源に影響がある場合があります。

16.2. ネットワークのボトルネック検出とネットワークトラフィックの分析

ネットワークチューニングを行なう前に、ネットワーク側のボトルネックや ネットワークのトラフィックパターンについて、あらかじめそれらを区別しておく ことが重要です。これらのボトルネックを発見するにあたっては、いくつかの ツールを利用するのがよいでしょう。

ネットワークトラフィックの分析には、 netstat, tcpdump, wireshark などのような ツールが便利です。 Wireshark はネットワークトラフィックの分析プログラム です。

16.3. netfilter

Linux のファイアウオールやマスカレード機能は、 netfilter と呼ばれるカーネル モジュールが提供する機能です。これらはルールベースのフレームワークで、高度に カスタマイズすることができます。あるネットワークパケットが特定のルールに該当 すると、 netfilter はルールで設定されているとおりパケットを受け入れたり 拒否したり、もしくはアドレス変換などの特殊な処理 (ターゲット) を行ないます。

netfilter には数多くの設定項目が存在するため、これを考慮しておく必要があります。 そのため、多くのルールが設定されている場合、それだけパケットの処理に時間が かかることになります。また、高度な接続追跡機能 (connection tracking) を 使用している場合は、これも比較的大きな負荷になるため、ネットワーク処理 全体を遅延させる原因になる場合があります。

詳しくは netfilter/iptables プロジェクトの Web ページ http://www.netfilter.org をお読みください。

16.4. さらなる情報


openSUSE システム分析とチューニングガイド 13.1