第8章 ルーティングの最適化
8.1. OpenShift Container Platform HAProxy ルーターのスケーリング
8.1.1. ベースラインのパフォーマンス
OpenShift Container Platform「ルーター」は、宛て先が OpenShift Container Platform サービスの外部トラフィックすべてに対する受信ポイントとなります。
1 秒に処理される HTTP 要求について、単一の HAProxy ルーターのパフォーマンスを評価する場合に、パフォーマンスは、以下を含む多くの要因によって変動します。
- HTTP keep-alive/close モード
- ルートタイプ
- TLS セッション再開のクライアントサポート
- ターゲットルートごとの同時接続数
- ターゲットルート数
- バックエンドサーバーのページサイズ
- 基礎となるインフラストラクチャー (ネットワーク/SDN ソリューション、CPU など)
個別の環境でのパフォーマンスは異なりますが、ラボは、サイズが 4 vCPU/16GB RAM のパブリッククラウドインスタンスでテストします。単一の HAProxy ルーターは、ルート 100 個を処理し、1kB 静的ページに対応するバックエンドで終端されますが、以下を処理できます。
HTTP keep-alive モードのシナリオの場合:
暗号化 | 秒ごとの HTTP(s) 要求 |
---|---|
なし |
22577 |
edge |
11642 |
passthrough |
33335 |
re-encrypt |
11521 |
HTTP close (keep-alive なし) のシナリオの場合:
暗号化 | 秒ごとの HTTP(s) 要求 |
---|---|
なし |
5771 |
edge |
1780 |
passthrough |
3488 |
re-encrypt |
1248 |
TLS セッション再開は、暗号化ルートに使用されていました。HTTP keep-alive の場合は、単一の HAProxy ルーターがページサイズが 8kB でも、1 Gbit の NIC を飽和させることができます。
最新のプロセッサーが搭載されたベアメタルで実行する場合は、上記のパブリッククラウドインスタンスのパフォーマンスの約 2 倍のパフォーマンスになることを予想できます。このオーバーヘッドは、パブリッククラウドにある仮想化層により発生し、これは多くの場合、プライベートクラウドベースの仮想化にも適用できます。以下の表は、ルーターの背後で使用するアプリケーション数についてのガイドです。
アプリケーション数 | アプリケーションタイプ |
---|---|
5-10 |
静的なファイル/Web サーバーまたはキャッシュプロキシー |
100-1000 |
動的なコンテンツを生成するアプリケーション |
通常、HAProxy は使用する技術によって異なりますが、約 5-1000 のアプリケーションでルートの負荷分散を行うことができます。静的なコンテンツのみにサービスを提供するアプリケーションの場合は、この数字は通常少なくなります。
アプリケーションに対して、より多くのルートを提供し、ルーティング層の水平スケーリングを図る場合には、ルーターのシャード を使用する必要があります。
8.1.2. パフォーマンスの最適化
8.1.2.1. 最大接続数の設定
HAProxy のスケーラビリティーで最も重要でチューニング可能なパラメーターの 1 つに、maxconn
パラメーターがあります。このパラメーターは、プロセス別の最大同時接続数を特定の値に設定します。このパラメーターを調節するには、OpenShift Container Platform HAProxy ルーターのデプロイメント設定ファイルにある ROUTER_MAX_CONNECTIONS
環境変数を編集してください。
接続にはフロントエンドおよび内部バックエンドが含まれます。これは 2 つの接続としてカウントされます。必ず ROUTER_MAX_CONNECTIONS
の値を作成しようとしている接続数の 2 倍以上になるように設定してください。
8.1.2.2. CPU および割り込みアフィニティー
OpenShift Container Platform では、HAProxy ルーターは単一のプロセスのとして実行されます。OpenShift Container Platform HAProxy ルーターは通常、周波数が低く、数の多いコアを持つ対称型マルチプロセッシング (SMP) よりも、周波数が高く、数の少ないコアが搭載されたシステムでより優れたパフォーマンスを実現します。
HAProxy プロセスを 1 つの CPU コアに、また別の CPU コアにネットワーク割り込みをピニングすると、ネットワークパフォーマンスが向上する傾向にあります。同じ Non-Uniform Memory Access (NUMA) ノードにプロセスと割り込みを配置すると、共有 L3 キャッシュを確保してメモリーアクセスを回避しやすくなります。ただし、このレベルの制御は、パブリッククラウド環境では一般的に不可能です。ベアメタルホストでは、irqbalance
は、割り込み要求線 (IRQ) があれば、自動的に PCI (peripheral component interconnect) ローカリティーと NUMA アフィニティーを処理します。クラウド環境では、このレベルの情報は一般的にオペレーティングシステムには提供されません。
CPU ピニングは taskset
または HAProxy の cpu-map
パラメーターを使用して実行されます。このディレクティブは、プロセス ID と CPU コア ID の 2 つの引数を取ります。たとえば、HAProxy プロセス 1
を CPU コア 0
にピニングするには、以下の行を HAProxy の設定ファイルの Global セクションに追加します。
cpu-map 1 0
HAProxy 設定ファイルの変更については、「カスタマイズされた HAProxy ルーターのデプロイ」を参照してください。
8.1.2.3. バッファー増加の影響
OpenShift Container Platform HAProxy ルーター要求のバッファー設定で、アプリケーションからの受信要求や応答のヘッダーサイズを制限します。HAProxy パラメーター tune.bufsize
を増やして、より大きいヘッダーを処理し、多くのパブリッククラウドプロバイダーが提供するロードバランサーで許可されるアプリケーションなど、非常に大きい cookie を使用するアプリケーションを機能させることができます。ただし、これにより、多数の接続が開放されている場合など、合計のメモリー使用率に影響があります。非常に多くの接続が開かれている場合には、メモリー使用率は、このチューニング可能なパラメーターの増加とほぼ比例します。
8.1.2.4. HAProxy 再読み込みの最適化
Websocket 接続などの長時間続く接続が、長いクライアント/サーバー HAProxy タイムアウトと短い HAProxy 再読み込み間隔と組み合わされると、HAProxy プロセスが多数インスタンス化されてしまう可能性があります。これらのプロセスは、HAProxy 設定が再読み込みされる前に開始されていた古い接続を処理する必要があります。これらの数多くのプロセスは、システムに不必要な負荷がかかり、メモリー不足の状態などの問題につながる可能性があるために理想的とは言えません。
この動作に影響を与えるルーターの環境変数は、特に ROUTER_DEFAULT_TUNNEL_TIMEOUT
、ROUTER_DEFAULT_CLIENT_TIMEOUT
、ROUTER_DEFAULT_SERVER_TIMEOUT
および RELOAD_INTERVAL
などです。