6. メモリ管理
HAProxy は、シンプルかつ高速なプールベースのメモリ管理を使用します。少数の異なるオブジェクト タイプに依存するため、異なるサイズごとに malloc() を呼び出すよりも、適切なサイズのオブジェクトが既に含まれているプールから新しいオブジェクトを選択する方がはるかに効率的です。プールはスタックまたは LIFO として編成されるため、新しく割り当てられたオブジェクトは、CPU キャッシュ内でまだホットな最近リリースされたオブジェクトから取得されます。メモリの断片化を制限するために、同様のサイズのプールがマージされます。
デフォルトでは、パフォーマンスに重点が置かれているため、解放された各オブジェクトは元のプールに戻され、割り当てられたオブジェクトはすぐに再利用されることが予想されるため、解放されることはありません。
CLI では、「show pools」コマンドを使用して、プールでメモリがどのように使用されているかを確認できます。
プール名は単なる例示であり、このプールを使用する最初のオブジェクト タイプの名前です。括弧内のサイズは、このプール内のオブジェクトのオブジェクト サイズです。オブジェクトのサイズは常に 16 バイトの最も近い倍数に切り上げられます。現在割り当てられているオブジェクトの数とそれに相当するバイト数がレポートされるため、どのプールが最も多くのメモリ使用量を発生させているかを簡単に知ることができます。現在使用中のオブジェクトの数も「used」フィールドにレポートされます。 “allocated” と “used” の差は、オブジェクトが解放され、すぐに使用できるかどうかに対応します。行の末尾のアドレスはプールのアドレスで、次の数字はプール インデックス (存在する場合) であり、インデックスが割り当てられていない場合は -1 として報告されます。
「-m」コマンド ライン オプションに続いてメガバイト数を使用すると、プロセスごとに割り当てられるメモリの量を制限できます。これは、プロセスのアドレス指定可能な空間すべてをカバーするため、スタックだけでなく一部のライブラリで使用されるメモリも含まれますが、リソースに制約のあるシステムを構築する場合には信頼できる制限となります。これがあるシステムでは「ulimit -v」、他のシステムでは「ulimit -d」と同じように機能します。
メモリ制限に達したため、またはシステムに十分なメモリがないためにメモリ割り当てが失敗した場合、HAProxy は、メモリの再割り当てを試みる前に、まずすべてのプールから利用可能なすべてのオブジェクトの解放を開始します。未使用のメモリを解放するこのメカニズムは、HAProxy プロセスに SIGQUIT シグナルを送信することでトリガーできます。
リロード操作中に、グレースフルシャットダウンの状態に切り替わったプロセスは、接続を解放した後に自動的にいくつかのフラッシュを実行するため、すべての可能なメモリが解放されて新しいプロセス用に保存されます。