第8章 ネットワーキング

Red Hat Enterprise Linux のネットワークスタックは、長期にわたって数々の自動最適化機能でアップグレードされてきました。ほとんどのワークロードで、自動設定されたネットワーク設定が最適なパフォーマンスを提供します。
ほとんどのケースでは、ネットワークのパフォーマンス問題は実際にはハードウェアの不具合やインフラストラクチャーの障害で引き起こされています。このような原因は本書の対象外となります。本章で説明されているパフォーマンス問題と解決方法は、完全に機能しているシステムの最適化において有効なものです。
ネットワークは繊細なサブシステムで、異なるパーツが敏感な接続で形成されています。オープンソースコミュニティーと Red Hat がネットワークパフォーマンスを自動で最適化する実装方法に多くの努力を注いでいるのは、このためです。それゆえ、ほとんどのワークロードでは、パフォーマンスのためにネットワークを再構成する必要すらない可能性があります。

8.1. ネットワークパフォーマンスの機能強化

Red Hat Enterprise Linux 6.1 では以下のネットワークパフォーマンス機能強化を提供していました。

Receive Packet Steering (RPS)

RPS は、単一 NIC rx キューが受信 softirq ワークロードを複数の CPU に分散することを可能にします。これを行うと、ネットワークトラフィックが単一 NIC ハードウェアキューでボトルネックとなることを防ぐのに役立ちます。
RPS を有効にするには、ターゲットの CPU 名を /sys/class/net/ethX/queues/rx-N/rps_cpus で特定し、ethX を NIC の対応するデバイス名 (例えば eth1eth2 など) で、rx-N を指定された NIC 受信キューで置き換えます。こうすることで、ファイル内で指定された CPU が ethX 上のキュー rx-N からのデータを処理できるようになります。CPU を指定する際には、キューの キャッシュ アフィニティ [4] を考慮します。

Receive Flow Steering (RFS)

RFS は RPS の拡張版で、アプリケーションがデータを受信し、ネットワークスタックが問い合わせる際に自動的に構成されるハッシュテーブルを管理者が設定できます。これは、どのアプリケーションがネットワークデータのどの部分を受信するかを決定します (source:destination ネットワーク情報に基づいて)。
この情報を使って、ネットワークスタックは最適な CPU をスケジュールし、各パケットを受信できます。RFS を設定するには、以下を使います。
/proc/sys/net/core/rps_sock_flow_entries
これは、カーネルが指定された CPU に誘導可能なソケット/フローの最大数を制御します。これはシステム全体での共有制限値です。
/sys/class/net/ethX/queues/rx-N/rps_flow_cnt
これは、NIC (ethX) 上の特定受信キュー (rx-N) に誘導するソケット/フローの最大数を制御します。全 NIC 上のこのファイル用のキューごとの値の合計は、/proc/sys/net/core/rps_sock_flow_entries と同じかそれ以下にすることに留意してください。
RPS と違って、RFS ではパケットフローの処理時に受信キューとアプリケーションの両方が同一 CPU を共有できます。場合によっては、これはパフォーマンス改善につながります。しかし、そのような改善は、キャッシュ階層やアプリケーションロードなどの要素に依存します。

TCP thin-stream の getsockopt サポート

Thin-stream は、アプリケーションがデータを非常な低率で送信し、プロトコルの再送信メカニズムが完全には飽和状態とならない送信プロトコルに使われる用語です。Thin-stream プロトコルを使用するアプリケーションは通常、TCP のような信頼性の高いプロトコル経由で送信します。ほとんどのケースでは、そのようなアプリケーションは時間の影響が大きいサービスを提供します (例: 株の取引、オンラインゲーム、管理システム)。
時間の影響を受けるサービスでは、パケットを失うとサービスの品質に多大な損害をもたらします。これを防ぐために、getsockopt コールが強化されて以下の 2 つのオプションをサポートするようになりました。
TCP_THIN_DUPACK
このブール値は、1 回の dupACK の後に thin stream の再送信の動的タグ付を有効にします。
TCP_THIN_LINEAR_TIMEOUTS
このブール値は、thin stream の linear timeout の動的タグ付を有効にします。
両方のオプションとも、アプリケーションが明確にアクティベートします。これらのオプションについての詳細は、file:///usr/share/doc/kernel-doc-version/Documentation/networking/ip-sysctl.txt を参照してください。thin-stream についての詳細は、file:///usr/share/doc/kernel-doc-version/Documentation/networking/tcp-thin.txt を参照してください。

透過プロキシ (TProxy) のサポート

カーネルはローカル以外でバインドされた IPv4 TCP および UDP ソケットを扱って透過プロキシをサポートするようになっています。これを有効にするには、iptable を適宜設定する必要があります。また、ポリシールーティングを適切に有効化して設定する必要があります。
透過プロキシについての詳細は file:///usr/share/doc/kernel-doc-version/Documentation/networking/tproxy.txt を参照してください。


[4] CPU と NIC の間のキャッシュアフィニティを確保すると、同一の L2 キャッシュを共有する設定になります。詳細は 「パケット受信の概要」 を参照してください。