Facebookは、Linuxのスラブメモリコントローラーを改善するパッチをリリースしました

ロマーノ・グシュチン氏(Facebookのソフトウェアエンジニア)は、Linuxカーネル開発メーリングリストに、スラブドライバのメモリ割り当てアプリケーション(メモリコントローラ)に対する一連のパッチを投稿した。

新しいドライバの注目すべき点は、スラブのアカウンティングをメモリページレベルからカーネルオブジェクトレベルに移行したことで、各cグループごとに個別のスラブキャッシュを割り当てるのではなく、異なるcグループ間でスラブページを共有できるようになったことです。

Roman 氏は、既存のスラブ メモリ コントローラーに、彼が「非常に深刻な欠陥」と呼ぶものを発見しました。これが、最近の cgroup の使用率の低下につながっています。

「既存の設計がスラブ使用率の低下につながる本当の理由は単純です。スラブ ページは XNUMX つのメモリ プールによって排他的に使用されるからです。

cgroupによって行われた特定のサイズの割り当てがわずかしかない場合、cgroupが削除された後にアクティブなオブジェクトが残っている場合、またはcgroupに、カーネルオブジェクトをほとんど割り当てていない単一のスレッドアプリケーションが含まれている場合、ただし毎回新しいCPUの場合:これらすべての場合で、結果として得られるスラブの使用率は非常に低くなります。

kmem アカウンティングが無効になっている場合、カーネルはスラブ ページの空き領域を他の割り当てに使用できます。 «

昨年ロマーノ・グシュチン氏が提案したスラブメモリコントローラは、スラブの使用効率を高め、スラブに使用されるメモリサイズを30~45%削減し、コア全体のメモリ消費量を大幅に削減できるため、非常に有望である。

さらに、実装されたパッチから、 Facebookは既に自社サーバー上でこのコードを本番環境で使用しており、フロントエンドWebサーバー、データベースキャッシュ、DNSサーバーなどで約650~700MB以上の容量を節約していることが明らかになった。

移動不可能なスラブの数を減らすことは、メモリ断片化の抑制にもプラスの効果をもたらします。新しいメモリコントローラは、スラブの管理コードを大幅に簡素化し、各cグループごとにスラブキャッシュを動的に作成および削除するための複雑なアルゴリズムを不要にします。

新しい実装のすべてのメモリ cgroup は、共通のスラブ キャッシュ セットを使用し、スラブ キャッシュの有効期間は、cgroup を通じて設定されたメモリ制約の有効期間に関連付けられなくなりました。

新しいスラブ ドライバーに実装されたより正確なリソース アカウンティングにより、理論的には CPU の負荷が増加するはずですが、実際にはその差は無視できるほどであることが判明しました。

特に、新しいスラブコントローラーは、さまざまな種類の負荷を処理するFacebookの稼働中のサーバーで数か月間使用されており、これまでのところ重大な不具合は検出されていません。

パッチには、半独立した部分がいくつか含まれており、スラブ メモリ コントローラーの外部でも使用できます。

  • Subpage Load API。将来的には、percpu 割り当てなど、ページサイズ以外の他のオブジェクトを考慮するために使用できます。
  • memcg へのポインターがカウントされる mem_cgroup_ptr API は、ページキャッシュなどの他のオブジェクトの効率的な再親化のために再利用できます。

同時に、メモリ消費量も大幅に減少しました。一部のホストでは最大1GBのメモリを節約できましたが、この数値は負荷の性質、 RAMの総容量、CPUの容量、メモリ操作の特性に大きく依存します。

メモリ cgroup ごとに kmem_caches の個別のセットを作成する代わりに、XNUMX つのグローバル プールが使用されます。XNUMX つはアカウント不明のルート プール cgroup 割り当て用のルート プール、もう XNUMX つは他のすべての割り当て用です。 これにより、個々の kmem_caches の有効期間管理が簡素化されます。

最後に、新しい19個のパッチセットについて知りたい場合は、カーネルメーリングリストで確認できます。


Googleで優先ソースとして追加する