ローマのグシチン (Facebookソフトウェアエンジニア) レジストリ Linuxカーネル開発リストでは、 スラブドライバーのメモリ割り当てアプリケーションへのパッチのセット (メモリコントローラー)。
新しいコントローラーは注目に値します スラブ アカウンティングをメモリ ページ レベルからカーネル オブジェクト レベルに移動することにより、各 c グループに個別のスラブ キャッシュを割り当てるのではなく、異なる c グループ間でスラブ ページを共有できるようになります。
Roman 氏は、既存のスラブ メモリ コントローラーに、彼が「非常に深刻な欠陥」と呼ぶものを発見しました。これが、最近の cgroup の使用率の低下につながっています。
「既存の設計がスラブ使用率の低下につながる本当の理由は単純です。スラブ ページは XNUMX つのメモリ プールによって排他的に使用されるからです。
cgroupによって行われた特定のサイズの割り当てがわずかしかない場合、cgroupが削除された後にアクティブなオブジェクトが残っている場合、またはcgroupに、カーネルオブジェクトをほとんど割り当てていない単一のスレッドアプリケーションが含まれている場合、ただし毎回新しいCPUの場合:これらすべての場合で、結果として得られるスラブの使用率は非常に低くなります。
kmem アカウンティングが無効になっている場合、カーネルはスラブ ページの空き領域を他の割り当てに使用できます。 «
提案されたスラブメモリコントローラー 昨年のRomanoGushchinによると、 効率を上げる スラブの使用の、 使用するメモリのサイズを減らす スラブの場合は 30 ~ 45% 削減され、カーネルの総メモリ消費量が大幅に削減されます。
その上、 実装されたパッチは Facebook はすでにサーバー上の本番環境でコードを使用しており、 フロントエンドWebサーバーで約650〜700MB以上の節約、データベースキャッシング、DNSサーバーなどの賞。
非可動スラブの数を減らすことにより、メモリ断片化削減の分野でもプラスの効果が観察されます。 新しいメモリ コントローラーにより、アカウンティング スラブのコードが大幅に簡素化されます。 また、各 c グループのスラブ キャッシュを動的に作成および削除するための複雑なアルゴリズムは必要ありません。
新しい実装のすべてのメモリ cgroup は、共通のスラブ キャッシュ セットを使用し、スラブ キャッシュの有効期間は、cgroup を通じて設定されたメモリ制約の有効期間に関連付けられなくなりました。
新しいスラブ ドライバーに実装されたより正確なリソース アカウンティングにより、理論的には CPU の負荷が増加するはずですが、実際にはその差は無視できるほどであることが判明しました。
特に 新しいスラブドライバーは Facebook サーバーで数か月間使用されています さまざまな種類の負荷を処理する運用が行われており、これまでのところ重大な後退は検出されていません。
パッチには、半独立した部分がいくつか含まれており、スラブ メモリ コントローラーの外部でも使用できます。
- Subpage Load API。将来的には、percpu 割り当てなど、ページサイズ以外の他のオブジェクトを考慮するために使用できます。
- memcg へのポインターがカウントされる mem_cgroup_ptr API は、ページキャッシュなどの他のオブジェクトの効率的な再親化のために再利用できます。
同時に、 メモリ消費量が大幅に減少します: 一部のホストでは最大 1 GB のメモリを節約できましたが、このフラグは 負荷の性質に大きく依存しますが、 RAMの合計サイズ、CPUの量、およびメモリの操作の特性。
メモリ cgroup ごとに kmem_caches の個別のセットを作成する代わりに、XNUMX つのグローバル プールが使用されます。XNUMX つはアカウント不明のルート プール cgroup 割り当て用のルート プール、もう XNUMX つは他のすべての割り当て用です。 これにより、個々の kmem_caches の有効期間管理が簡素化されます。
最後に、19 個のパッチの新しいセットを知りたい場合は、リストで見つけることができます。 カーネルメール.