2

Redisのコードの一部を参照した後、「robj」の作成が「createObject」関数を呼び出すことによって行われていることに気付きました。この関数は「malloc」を呼び出してメモリを割り当てます。したがって、要求が来るたびに(たとえば、SET uid 1234)、メモリ割り当てプロセスが発生します。

私の質問は、メモリ割り当てコストを削減するためにスペースを事前に割り当ててみませんか?オブジェクトサイズが異なるためですか?

4

1 に答える 1

7

私の質問は、メモリ割り当てコストを削減するためにスペースを事前に割り当ててみませんか?オブジェクトサイズが異なるためですか?

あなたが説明するのは、メモリアロケータの仕事です。Redis内でそのようなロジックを構築することは簡単ではありません。

デフォルトでは、RedisはLinuxでjemallocメモリアロケータを使用します。

Jemallocには、メモリ割り当てのオーバーヘッドを削減するためのいくつかの最適化があります。次のリンクを読んで、jemallocがどのように役立つかを学びましょう-

  1. JemallocのFacebookエンジニアリングブログ
  2. 2006年のJemallocPaper

RedisがJemallocを導入したとき、多くのメモリ管理の問題が解消されました。これがantirez(redisの作者)がjemallocの導入について言わなければならなかったことです:

[snip]アロケータは深刻なものです。特別にエンコードされたデータ型を導入して以来、Redisは断片化に悩まされ始めました。問題を解決するためにさまざまなことを試みましたが、基本的にglibcのLinuxデフォルトアロケータは本当に大変です。

Redis内にjemallocを含めることは、大きな勝利でした。この変更により、実際のシステムでの断片化のすべてのケースが修正され、使用されるメモリの量も少し減少しました。

PSあなたはredis-dbメーリングリストでより良くそしてより多くの情報に基づいた答えを得るでしょう

于 2012-10-12T05:56:23.257 に答える