日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
JEMALLOC(3) User Manual JEMALLOC(3)
名称
jemalloc - 汎用メモリ割り付け関数
ライブラリ
このマニュアルは、jemalloc
5.2.1-0-gea6b3e973b477b8061e0076bb257dbd7f3faa756 を説明しています。よ
り多くの情報は、jemalloc ウェブサイト[1] で見つけることができます。
次の設定オプションが、libc 組み込み jemalloc で有効にされます:
--enable-fill, --enable-lazy-lock, --enable-stats, --enable-utrace,
--enable-xmalloc と --with-malloc-conf=abort_conf:false。さらに、
--enable-debug は、(MK_MALLOC_PRODUCTION make 変数によって制御される)
FreeBSD の開発バージョンで有効にされます。
書式
#include <stdlib.h>
#include <malloc_np.h>
標準 API
void *malloc(size_t size);
void *calloc(size_t number, size_t size);
int posix_memalign(void **ptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);
非標準 API
void *mallocx(size_t size, int flags);
void *rallocx(void *ptr, size_t size, int flags);
size_t xallocx(void *ptr, size_t size, size_t extra, int flags);
size_t sallocx(void *ptr, int flags);
void dallocx(void *ptr, int flags);
void sdallocx(void *ptr, size_t size, int flags);
size_t nallocx(size_t size, int flags);
int mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp,
size_t newlen);
int mallctlnametomib(const char *name, size_t *mibp, size_t *miblenp);
int mallctlbymib(const size_t *mib, size_t miblen, void *oldp,
size_t *oldlenp, void *newp, size_t newlen);
void malloc_stats_print(void (*write_cb) (void *, const char *),
void *cbopaque, const char *opts);
size_t malloc_usable_size(const void *ptr);
void (*malloc_message)(void *cbopaque, const char *s);
const char *malloc_conf;
解説
標準 API
malloc() 関数は、size バイトの初期化されていないメモリを割り付けます。
割り付けられた空間は、あらゆるタイプのオブジェクトの記憶域のために (可
能なポインタ強制の後に) 適切に整列されます
calloc() 関数は、各 size バイトの長さの number 個のオブジェクトのための
空間を割り付けます。割り付けてられたメモリが明示的に 0 バイトに初期化さ
れることを除いて、number * size の引数で malloc() を呼び出すことと結果
は、同一です。
posix_memalign() 関数は、割り付けのベースアドレスが alignment の数倍で
あるように size バイトのメモリを割り付け、ptr によって指された値に割り
付けを返します。要求された alignment は、少なくとも sizeof(void *) と同
じ大きさの 2 のべき乗でなければなりません。
aligned_alloc() 関数は、割り付けのベースアドレスが alignment の数倍であ
るように size バイトのメモリを割り付けます。要求された alignment は、2
のべき乗でなければなりません。size が alignment の整数倍でないなら、振
る舞いは、未定義です。
realloc() 関数は、ptr によって参照される以前に割り付けられたメモリのサ
イズを size バイトに変更します。メモリの内容は、新しいサイズのより小さ
い部分と古いサイズの部分は変更されないままです。新しいサイズがより大き
いなら、メモリの新しく割り付けられた部分の内容は、未定義です。成功すれ
ば、ptr によって参考されるメモリは、解放され、新しく割り付けられたメモ
リへのポインタが返されます。realloc() は、ptr とは異なっている返り値の
結果となるように、メモリ割り付けを移動するかもしれないことに注意してく
ださい。ptr が NULL であるなら、realloc() 関数は、指定されたサイズのた
めの malloc() と同じように振る舞います。
free() 関数によって、ptr によって参照される割り付けられたメモリは、将来
の割り付けのために利用可能とされます。ptr が NULL であるなら、何もアク
ションは、取られません。
非標準 API
mallocx(), rallocx(), xallocx(), sallocx(), dallocx(), sdallocx() と
nallocx() 関数は、すべて、オプションを指定するために使用することができ
る flags 引数があります。関数は、文脈的に適切なオプションであるかのみを
チェックします。下記の 1 つ以上を指定するためにビット単位の演算子論理和
(|) 演算子を使用します:
MALLOCX_LG_ALIGN(la)
(1 << la) の倍数であるアドレスで開始するための整列されたメモリ割り
付け。このマクロは、la が有効な範囲内にあるかを確認しません。
MALLOCX_ALIGN(a)
a の倍数であるアドレスで開始するための整列されたメモリ割り付け、こ
こで、a は、2 のべき乗です。このマクロは、a 2 のべき乗であるかを確
認しません。
MALLOCX_ZERO
0 バイトを含むように新しく割り付けられたメモリを初期化します。増大
している再割り付けの場合で、再割り付けに先立った実際のサイズは、変
更されていないバイトと 0 バイトを含むように初期化されるもの間の境界
を定義します。このマクロが存在しないなら、新しく割り付けられたメモ
リは、初期化されません。
MALLOCX_TCACHE(tc)
tcache.create mallctl を通して獲得されなければならない識別子 tc に
よって指定されたスレッド特有のキャッシュ (tcache) を使用します。こ
のマクロは、有効な識別子を指定する、その tc を有効にしません。
MALLOCX_TCACHE_NONE
スレッド特有のキャッシュ (tcache) を使用しません。
MALLOCX_TCACHE(tc) または MALLOCX_TCACHE_NONE が指定されないなら、
自動的に管理された tcache は、多くの状況の下で使用されます。このマ
クロは、MALLOCX_TCACHE(tc) として同じ flags 引数で使用することがで
きません。
MALLOCX_ARENA(a)
インデックス a によって指定されるアリーナを使用します。このマクロに
は、指定されたもの以外のアリーナを通して割り付けられた領域のために
効果がありません。このマクロは、a が有効な範囲のアリーナのインデッ
クスを指定することを確認しません。
mallocx() 関数は、少なくともメモリの size バイトを割り付けて、割り付け
のベースアドレスへのポインタを返します。size が 0 あるなら、振る舞い
は、未定義です。
rallocx() 関数は、少なくとも size バイトであるために ptr で割り付けをリ
サイズし、そのオリジナルの位置から移動したどうか分からない、結果の割ち
付けのベースアドレスへのポインタを返します。size が 0 あるなら、振る舞
いは、未定義です。
xallocx() 関数は、少なくとも size バイトであるための位置に ptr で割り付
けをリサイズし、割り付けの実際のサイズを返します。extra が 0 でないな
ら、少なくとも (size + extra) バイトとなるように割り付けをリサイズ試み
が行われますが、特別の (複数の) バイトを割り付ける能力がないなら、リサ
イズの失敗の結果とはなりません。size が 0 0 であるか、または (size +
extra > SIZE_T_MAX) であるなら、振る舞いは、未定義です。
sallocx() 関数は、ptr で割り付けの実際のサイズを返します。
dallocx() 関数によって ptr によって参照されるメモリは、将来の割り付けの
ために利用可能となります。
sdallocx() 関数は、呼び出し側が最適化として割り付けサイズに渡することが
できる、size パラメータがある dallocx() の拡張です。最小の有効な入力サ
イズは、割り付けのオリジナルの要求されたサイズであり、最大の有効な入力
サイズは、nallocx() または sallocx() によって返された対応している値で
す。
nallocx() 関数は、メモリを割り付けませんが、それは、mallocx() 関数と同
じサイズの計算を行ない、mallocx() 関数呼び出しと同等の結果となる割り付
けの実際のサイズを返すか、または入力が、最大のサポートされたサイズのク
ラスおよび整列を越えているなら、0 を返します。size が 0 であるなら、振
る舞いは、未定義です。
mallctl() 関数は、設定する修正可能なパラメータと引き金を引くアクション
と同様に、メモリアロケータを内歓するための一般的なインタフェースを提供
します。ピリオドで区切られた name 引数は、ツリー構造した名前空間の位置
を指定します。ツリーの内容に関する文書については、「MALLCTL 名前空間」
セクションを参照してください。値を読み込むためには、値を含んでいる適切
な空間への oldp を介したポインタと、oldlenp を介した、その長さへのポイ
ンタを渡します。そうでなければ、NULL と NULL を渡します。同様に、値を書
き込むためには、newp を介した値へのポインタと newlen を介したその長さ渡
します。そうでなければ、NULL と 0 を渡します。
mallctlnametomib() 関数は、mallctlbymib() に繰り返し渡すことができる "
管理情報ベース" (MIB) に名前を変換することによって、名前空間の同じ部分
を繰り返し問い合わせるアプリケーションのために繰り返された名前の検索を
回避する方法を提供します。mallctlnametomib() から成功して返るとき、mibp
は、*miblenp 整数の配列を含んでいます、ここで *miblenp は、name のコン
ポーネントの数と *miblenp の入力値のより小さいものです。したがって、完
全な MIB を構築するための基本として使用することができる部分的な MIB の
結果である、ピリオドで区切られた名前のコンポーネントの数より小さい
*miblenp を渡すことは可能です。整数である名前コンポーネント (例えば、
arenas.bin.2.size の 2) について、対応する MIB のコンポーネントは、常に
その整数になります。したがって、次のようなコードを構築することは正当で
す:
unsigned nbins, i;
size_t mib[4];
size_t len, miblen;
len = sizeof(nbins);
mallctl("arenas.nbins", &nbins, &len, NULL, 0);
miblen = 4;
mallctlnametomib("arenas.bin.0.size", mib, &miblen);
for (i = 0; i < nbins; i++) {
size_t bin_size;
mib[2] = i;
len = sizeof(bin_size);
mallctlbymib(mib, miblen, (void *)&bin_size, &len, NULL, 0);
/* bin_size で何かを行う... */
}
malloc_stats_print() 関数は、write_cb コールバック関数ポインタと
write_cb に渡された cbopaque データ、または write_cb が NULL であるな
ら、malloc_message() によって要約の統計を書き込みます。統計が、JSON 形
式[2] で提示される場合に、統計は、"J" が opts 文字列内の文字として指定
されないなら、人間に読み込み可能な形式で提示されます。この関数を、繰り
返し呼び出すことができます。実行の間に決して変更されない一般的な情報
は、opts 文字列内の文字として "g" を指定することによって省略することが
できます。malloc_stats_print() は、mallctl*() 関数を内部的に使用するの
で、複数のスレッドががこれらの関数を同時に使用するなら、一貫性のない統
計値を報告するかもしれないことに注意してください。--enable-stats が、設
定の間に指定されるなら、それぞれ、マージされたアリーナとアリーナごとの
統計を省略するために "m", "d" と "a" を指定することができます。それぞ
れ、ビン (bin)、大きなオブジェクトのためのサイズクラスごとの統計を省略
するために、"b" と "l" を指定することができます。訳注: ビンは、統計用語
で、値に従って対象をグループ分けして一般化または比較を行うための値の範
囲。すべてのミューテックス (mutex) 統計を省略するために "x" を指定する
ことができます。範囲 (extent) 統計を省略するために "e" を使用することが
できます。認識されない文字は、静かに無視されます。特別のロックがスレッ
ドのキャッシュ操作を追跡するカウンタをマージするように要求されるので、
スレッドのキャッシングは、完全に最新のことからいくつかの統計を防ぐこと
に注意してください。
malloc_usable_size() 関数は、ptr によって指される割り付けの使用可能なサ
イズを返します。返り値は、割り付けの間に要求されたサイズより大きいかも
しれません。malloc_usable_size() 関数は、インプレース (入力データを直接
書き換える) の realloc() のためのメカニズムではありません。どちらかとい
えば、それは、単に内観目的のためのツールとして提供されます。そのような
振る舞いが完全に実装依存であるので、要求された割り付けサイズと
malloc_usable_size() によって報告されたサイズの間のあらゆる相違は、依存
されるべきではありません。
調整
いったん、最初の呼び出しがメモリ割り付けルーチンのうちの 1 つで行われる
とき、アロケータ (割り付けルーチン) は、コンパイル時、または実行時に指
定することができる、様々なオプションの一つに基づいてその内部を初期化し
ます、
--with-malloc-conf を通して指定された文字列、グローバル変数 malloc_conf
によって指された文字列、/etc/malloc.conf で指定されたシンボリックリンク
によって参照されたファイルの "name" と環境変数 MALLOC_CONF の値は、オプ
ションとして左から右の順序で解釈されます。malloc_conf は、main() に入る
前に読み込まれるので、malloc_conf の宣言は、jemalloc によって読み込まれ
る最後の値を含んでいる初期化ルーチン (initializer) を指定するべきである
ことに注意してください。--with-malloc-conf と malloc_conf は、コンパイ
ル時間のメカニズムですが、一方プログラムの呼び出しの前のいつでも
/etc/malloc.conf と MALLOC_CONF を安全に設定することができます。
オプションの文字列は、コンマで区切られた option:value (オプション:値)
のペアのリストです。各 opt.* mallctl に対応する 1 つのキーがあります
(オプションの文書については、「MALLCTL 名前空間」セクションを参照)。例
えば、abort:true,narenas:1 は、opt.abort と opt.narenas オプションを設
定します。いくつかのオプションには、ブール値の値 (真/偽) があり、他のも
のには、整数値 (接頭辞に依存して、8、10、または 16) があり、さらに他の
ものには、生の文字列の値があります。
実装に関する注
伝統的に、アロケータは、最大の使用可能なメモリに関して、競合条件、増強
された断片化と人為的な制限を含んで、いくつかの理由で準最適である、メモ
リを獲得するために sbrk(2) を使用しました。sbrk(2) がオペレーティングシ
ステムによってサポートされているなら、このアロケータは、好みのその順序
で、mmap(2) と sbrk(2) の両方を使用します。そうでなければ、mmap(2) だけ
が使用されます。
このアロケータは、マルチプロセッサのシステムでスレッド化されたプログラ
ムのためのロックの競合を縮小するために複数のアリーナを使用します。これ
は、スレッド化の拡張可能性に関してうまくいきますが、いくらかのコストを
負います。固定のアリーナごとに小さなオーバヘッドがあり、さらに、アリー
ナは、全体的なメモリの断片化の小さな固定された増加を意味する、互いに完
全に独立したメモリを管理します。これらのオーバヘッドは、通常使用される
アリーナの数を考えると、一般的に問題ではありません。デフォルトより実質
的により多くのアリーナを使用することは、主として縮小されたキャッシュの
性能のために、性能を向上しそうにないことに注意してください。しかしなが
ら、アプリケーションがあまり割り付け関数を使用しないなら、アリーナの数
を減らすことは意味があります。
複数のアリーナに加えて、このアロケータは、ほとんどの割り付け要求のため
の同期を完全に回避することを可能にするために、スレッド特有のキャッシュ
をサポートしています。そのようなキャッシングによって、通常の場合に非常
に速い割り付けができますが、各スレッドのキャッシュでオブジェクトの境界
のある数を割り付けたままであるかもしれないので、メモリの使用量と断片化
を増加させます。
メモリは、概念的に範囲 (extent) 分割されます。範囲 (extent) は、常に
ページサイズの倍数に整列されます。この整列は、ユーザオブジェクトのため
のメタデータを速く見つけることを可能にします。ユーザのオブジェクトは、
サイズにしたがって 2 つのカテゴリに分割されます: スモール (small) と
ラージ (large)。ラージ (large) オブジェクトそれぞれが、それらを裏打ちし
ている、それら自体の範囲 (extent) があるのに対して、連続しているスモー
ル (small) オブジェクトは、単一の範囲内にあるスラブ (slab) から成りま
す。
スモールオブジェクトは、スラブ (slab) によってグループで管理されます。
各スラブ (slab) は、どの領域が使用中であるかを追跡するビットマップを維
持しています。(アーキテクチャに依存して、8 または 16) の半分以下の量の
割り付け要求は、少なくとも sizeof(double) である最も近い 2 のべき乗に丸
められます。すべての他のオブジェクトのサイズのクラスは、内部の断片化が
最も小さいサイズのクラスを除いたすべてのための約 20% に制限されるサイズ
の 2 倍ごとに 4 つのサイズのクラスがあるような空間をとる量の倍数です。
スモールサイズのクラスは、ページサイズの 4 倍より小さく、ラージサイズの
クラスは、ページサイズの 4 倍から PTRDIFF_MAX を越えない最も大きなサイ
ズのクラスまで拡張します。
割り付けは、マルチスレッド化されたアプリケーションのために問題となるか
もしれませんが、とともにしっかりパックされます。割り付けがキャッシュラ
イン (cacheline) の共有に悩まされないことを保証する必要があるなら、利用
者の割り付け要求をキャッシュラインサイズの最も近い倍数まで丸めるか、ま
たは割り付けるとき、キャッシュラインの整列を指定します。
realloc(), rallocx() と xallocx() 関数は、制限された状況の下でそれらを
移動せずに割り付けをリサイズします。*allocx() と違って、標準の API は、
最も近いサイズのクラスへの割り付けの使用可能なサイズまで表向き切り上げ
ないので、技術的に、成長する realloc() を呼び出す必要があります、例え
ば、9 バイトの割り付けから 16 バイトに、または 16 バイトの割り付けから
9 バイトに縮小します。成長と縮小は、同じサイズのクラスに切り上げられる
前のサイズと後のサイズの両方と同じくらい長い自明に適切な位置に継承しま
す。他の API 保証は、適切なリサイズに関して行われませんが、また、現在の
実装は、前のサイズと後のサイズの両方がラージである限り、適切にラージの
割り付けをリサイズすることを試みます。成功する縮小について、範囲
(extent) アロケータは、分割をサポートしなければなりません
(arena.<i>.extent_hooks を参照)。後続するメモリが現在利用可能であるな
ら、成長だけは、成功し、範囲 (extent) アロケータは、マージをサポートし
ます。
2 MiB のチャンク、4 KiB ページと 64 ビットのシステムでの 16 バイトの量
を仮定して、各カテゴリのサイズのクラスは、表 1 に表示される通りです。
表 1. サイズクラス
+---------+---------+---------------------+
|カテゴリ | 間隔 | サイズ |
+---------+---------+---------------------+
| | lg | [8] |
| +---------+---------------------+
| | 16 | [16, 32, 48, 64, |
| | | 80, 96, 112, 128] |
| +---------+---------------------+
| | 32 | [160, 192, 224, |
| | | 256] |
| +---------+---------------------+
| | 64 | [320, 384, 448, |
| | | 512] |
| +---------+---------------------+
| | 128 | [640, 768, 896, |
|スモール | | 1024] |
| +---------+---------------------+
| | 256 | [1280, 1536, 1792, |
| | | 2048] |
| +---------+---------------------+
| | 512 | [2560, 3072, 3584, |
| | | 4096] |
| +---------+---------------------+
| | 1 KiB | [5 KiB, 6 KiB, 7 |
| | | KiB, 8 KiB] |
| +---------+---------------------+
| | 2 KiB | [10 KiB, 12 KiB, 14 |
| | | KiB] |
+---------+---------+---------------------+
| | 2 KiB | [16 KiB] |
| +---------+---------------------+
| | 4 KiB | [20 KiB, 24 KiB, 28 |
| | | KiB, 32 KiB] |
| +---------+---------------------+
| | 8 KiB | [40 KiB, 48 KiB, 54 |
| | | KiB, 64 KiB] |
| +---------+---------------------+
| | 16 KiB | [80 KiB, 96 KiB, |
| | | 112 KiB, 128 KiB] |
| +---------+---------------------+
| | 32 KiB | [160 KiB, 192 KiB, |
| | | 224 KiB, 256 KiB] |
| +---------+---------------------+
| | 64 KiB | [320 KiB, 384 KiB, |
| | | 448 KiB, 512 KiB] |
| +---------+---------------------+
| | 128 KiB | [640 KiB, 768 KiB, |
| | | 896 KiB, 1 MiB] |
| +---------+---------------------+
| | 256 KiB | [1280 KiB, 1536 |
| | | KiB, 1792 KiB, 2 |
|ラージ | | MiB] |
| +---------+---------------------+
| | 512 KiB | [2560 KiB, 3 MiB, |
| | | 3584 KiB, 4 MiB] |
| +---------+---------------------+
| | 1 MiB | [5 MiB, 6 MiB, 7 |
| | | MiB, 8 MiB] |
| +---------+---------------------+
| | 2 MiB | [10 MiB, 12 MiB, 14 |
| | | MiB, 16 MiB] |
| +---------+---------------------+
| | 4 MiB | [20 MiB, 24 MiB, 28 |
| | | MiB, 32 MiB] |
| +---------+---------------------+
| | 8 MiB | [40 MiB, 48 MiB, 56 |
| | | MiB, 64 MiB] |
| +---------+---------------------+
| | ... | ... |
| +---------+---------------------+
| | 512 PiB | [2560 PiB, 3 EiB, |
| | | 3584 PiB, 4 EiB] |
| +---------+---------------------+
| | 1 EiB | [5 EiB, 6 EiB, 7 |
| | | EiB] |
+---------+---------+---------------------+
MALLCTL 名前空間
次の名前は、mallctl*() 関数によってアクセス可能な名前空間に定義されてい
ます。値のタイプは、括弧の中に指定され、それらの読み込み可能/書き込み可
能な状態は、rw, r-, -w または -- としてエンコードされ、要求された構築設
定フラグは、もしあるなら、従います。<i> または <j> としてエンコードされ
た名前の要素は、整数の構成要素を示します、ここで整数は、0 から内観に
よって決定されなければならないある上位の値まで変化します。
stats.arenas.<i>.* と arena.<i>.{initialized,purge,decay,dss} の場合
に、すべてのアリーナで動作するか、またはすべてのアリーナから統計の合計
にアクセスするために、MALLCTL_ARENAS_ALL に等しい <i> を使用することが
できます。同様に、すべての破壊されたアリーナから統計の合計にアクセスす
るために、MALLCTL_ARENAS_DESTROYED に等しい <i> を使用することができま
す。これらの定数は、次のような mallctlbymib() が続いている
mallctlnametomib() またはコードを通して利用することができます:
#define STRINGIFY_HELPER(x) #x
#define STRINGIFY(x) STRINGIFY_HELPER(x)
mallctl("arena." STRINGIFY(MALLCTL_ARENAS_ALL) ".decay",
NULL, NULL, NULL, 0);
キャッシュされた動的な統計値のリフレッシュを制御する、epoch mallctl の
特別の注記を取ります。
version (const char *) r
jemalloc バージョンの文字列を返します。
epoch (uint64_t) rw
値が渡されるなら、mallctl*() 関数は、値を報告し、epoch を増加する
データをリフレッシュします。現在の epoch を返します。これは、別のス
レッドがリフレッシュを引き起こしたかどうかを検出するために役に立ち
ます。
background_thread (bool) rw
内部のバックグラウンドのワーカ (worker) スレッドを有効/無効にしま
す。真に設定されるとき、バックグラウンドのスレッドは、要求に応じて
作成されます (バックグラウンドのスレッドの数は、CPU またはアクティ
ブなアリーナの数しかありません)。スレッドが、周期的に実行し、非同期
的に削除を行います。スイッチがオフにされるとき、バックグラウンドの
スレッドは、同時に終了されます。fork(2) 関数の後に、子プロセスの状
態は、親プロセスの状態に関わらず無効にされることに注意してください
関連する状態については、stats.background_thread を参照してくださ
い。デフォルトのオプションを設定するために opt.background_thread を
使用することができます。このオプションは、選択された pthread-based
のプラットフォームでのみ利用可能です。
max_background_threads (size_t) rw
作成されるバックグラウンドのワーカ (worker) スレッドの最大数。この
値は、スタートアップで opt.max_background_threads で制限されます。
config.cache_oblivious (bool) r
--enable-cache-oblivious は、構築設定の間に指定されました。
config.debug (bool) r
--enable-debug は、構築設定の間に指定されました。
config.fill (bool) r
--enable-fill は、構築設定の間に指定されました。
config.lazy_lock (bool) r
--enable-lazy-lock は、構築設定の間に指定されました。
config.malloc_conf (const char *) r
組み込みの設定時に指定された実行時のオプションの文字列、
--with-malloc-conf が構築の設定の間に指定されないなら、空です。
config.prof (bool) r
--enable-prof は、構築設定の間に指定されました。
config.prof_libgcc (bool) r
--disable-prof-libgcc は、構築設定の間に指定されませんでした。
config.prof_libunwind (bool) r
--enable-prof-libunwind は、構築設定の間に指定されました。
config.stats (bool) r
--enable-stats は、構築設定の間に指定されました。
config.utrace (bool) r
--enable-utrace は、構築設定の間に指定されました。
config.xmalloc (bool) r
--enable-xmalloc は、構築設定の間に指定されました。
opt.abort (bool) r
有効にされた/無効にされた警告中のアボート。真であるなら、ほとんどの
警告は、致命的です。実行時オプションの警告が含まれないことに注意し
てください (それについては、opt.abort_conf を参照)。プロセスは、こ
れらの場合に abort(3) を呼び出します。このオプションは、デフォルト
で無効になります、--enable-debug が設定の間に指定されない場合は、デ
フォルトで有効になります。
opt.confirm_conf (bool) r
プログラムの開始時の確認実行時オプション
(confirm-runtime-options-when-program-starts) を有効/無効にします。
真であるなら、--with-malloc-conf を通して指定された文字列、グローバ
ル変数 malloc_conf によって指された文字列、/etc/malloc.conf と名前
が付けられたシンボリックリンクによって参照されたファイルの "name"、
と環境変数 MALLOC_CONF の値は、順番に印刷 (表示) されます。次に、設
定されている各オプションは、個別に印刷 (表示) されます。このオプ
ションは、デフォルトで無効にされます。
opt.abort_conf (bool) r
abort-on-invalid-configuration を有効/無効にします。真であるなら、
不正な実行時オプションは、致命的です。プロセスは、これらの場合に
abort(3) を呼び出します。このオプションは、--enable-debug が設定の
間に指定されないなら、その場合、デフォルトで有効にされます、デフォ
ルトで無効にされます。
opt.metadata_thp (const char *) r
jemalloc が内部のメタデータのための透過的なヒュージページ (THP) を
使用することができるかどうかを制御します (stats.metadata を参照)。
"always" は、そのような使用を許可します。"auto" は、最初に、THP を
使用しませんが、メタデータの使用法が特定のレベルに到達するとき、そ
うすることをはじめます。デフォルトは、"disabled" です。
opt.retain (bool) r
真であるなら、munmap(2) または同等のもの (関連する詳細については、
stats.retained を参照) を呼び出すことによってそれを破壊するのではな
く、後の再利用のための未使用の仮想記憶を保持します。それは、また、1
回でより大きいチャンクのマップして、jemalloc が mmap(2) を使用する
か、またはより最長のマッチを行なう方法で等しくします。このオプショ
ンは、破棄されている仮想メモリが、プラットフォーム特有の性能問題を
引き起こすことが知られていないなら、デフォルトで無効にされます、す
なわち、1) 通常の jemalloc 操作の下で半固定の VM マップの穴を引き起
こす、その仮想メモリの割り付けアルゴリズムに特異なことがある、[64
ビット] の Linux について、そして 2) MEM_RELEASE で、分割する/マー
ジされた領域を許可しない、[64 ビット] の Windows について。同じ問題
は、同様に、32 ビットのプラットフォームで存在するかもしれませんが、
32 ビット Linux と Windows のための保有している仮想メモリは、アドレ
ス空間の使い果たしの実際的な可能性のために、デフォルトで無効にされ
ます。
opt.dss (const char *) r
mmap(2) 割り付けに関連づけられる dss (sbrk(2)) 割り付けの優先順位。
次の設定がサポートされます: 次の設定は、sbrk(2) がオペレーティング
システムによってサポートされるなら、サポートされます: "disabled",
"primary" と "secondary"。そうでなければ、"disabled" だけがサポート
されます。デフォルトは、sbrk(2) がオペレーティングシステムによって
サポートされるなら、"secondary" です。そうでなければ、"disabled" で
す。
opt.narenas (unsigned) r
スレッドとアリーナの自動多重化のために使用するアリーナの最大数。デ
フォルトは、CPU の数の 4 倍、または単一の CPU があるなら、1 です。
opt.oversize_threshold (size_t) r
要求が特大であると考えられるバイト単位のしきい値。より大きいサイズ
がある割り付け要求は、莫大な割り付けと小さい割り付けと混合ぜずにフ
ラグメンテーションを減らすために、(どんなに narenas 内でなく、自動
的に管理される) 専門のアリーナから実行されます。訳注: narenas は、
辞書にない。さらに、崩壊 API は、指定されたしきい値が上書きされるよ
り大きい範囲で保証しています。MALLOCX_ARENA を通して指定されたア
リーナのインデックスがある要求、または明示的なアリーナと関連づけさ
れるスレッドは、考慮されないことに注意してください。デフォルトのし
きい値は、8MiB です。大きなサイズクラス内でない値は、この機能を無効
にします。
opt.percpu_arena (const char *) r
CPU ごとのアリーナモード。アリーナの数を決定するために CPU の数を使
用し、現在、スレッドが実行している CPU に基づく動的なアリーナにス
レッドをバインドするために使用する、この機能を有効にするために、
"percpu" 設定を使用します。"phycpu" 設定は、1 つのアリーナを共有す
る同じ CPU で 2 つのハイパー (hyper) スレッドを意味する、1 つの物理
的な CPU ごとに 1 つのアリーナを使用します。ハイパー (hyper) スレッ
ド化の利用可能性に関する実行時のチェックは、現在のところ行われない
ことに注意してください。
"disabled" (無効にされる) に設定されるとき、アリーナのアソシエー
ション (接続) への narenas とスレッドは、このオプションによって影響
されません。デフォルトは、"disabled" (無効にされる) です。
opt.background_thread (bool) r
有効/無効にされた内部のバックグラウンドのワーカ (worker) スレッド。
有効/無効にされた内部のバックグラウンドのワーカ (worker) スレッド。
潜在的な循環する依存状態のために、このオプションを使用する有効にさ
れたバックグラウンドのスレッドは、クラッシュするか、または初期設定
の間にデッドロックになるかもしれません。この機能を使用する信頼でき
る方法のための、動的な制御オプションと詳細については、
background_thread を参照してください。このオプションは、デフォルト
で無効にされます。
opt.max_background_threads (size_t) r
background_thread が設定されるなら、作成されるバックグラウンドのス
レッドの最大数。デフォルトは、cpu の数です。
opt.dirty_decay_ms (ssize_t) r
未使用のダーティページのセットの作成からミリ秒単位のおおよその時間
は、未使用のダーティページの等しいセットまで、削除され、(すなわち、
例えば、オペレーティングシステムによってサポートされるなら、
madvise(...MADV_FREE)、そうでなければクリーンするための変換を通して
混乱した (muzzy) ページに変換されます) および再利用されます。ダー
ティページは、アプリケーションによって潜在的に書き込まれて以前のよ
うに定義されます、そのために、物理メモリを消費して、まだ、現在の使
用されていません。ページは、0 の削除比率で始まって終わる、S 字状減
少曲線にしたがってじょじょに削除されます。0 の減少時間によって、す
べての未使用のダーティページは、作成時に直ちに削除されます。-1 の減
少時間は、削除をを無効にします。デフォルトの減少時間は、10 秒です。
関連する動的な制御オプションについては、arenas.dirty_decay_ms と
arena.<i>.dirty_decay_ms を参照してください。混乱した (muzzy) ペー
ジの説明については、opt.muzzy_decay_ms を参照してください。
oversize_threshold 機能が有効にされるとき、特大の要求のために予約さ
れたアリーナは、それ自身のデフォルトの腐敗設定があることに注意して
ください。
opt.muzzy_decay_ms (ssize_t) r
未使用の混乱した (muzzy) ページのセットの作成からミリ秒単位のおおよ
その時間は、未使用の混乱した (muzzy) ページの等しいセットまで、削除
され、(すなわち、クリーンにするために変換される) および、再利用され
ます。混乱した (muzzy) ページは、オペレーティングシステムの再利用の
思い付きにしたがってそれらを残す方法で続いて削除される未使用のダー
ティページであったと以前のように定義されます、(例えば、
madvise(...MADV_FREE)) と、したがって確定されない状態)。ページは、0
のパージレートで始まり、終わる sigmoidal decay 曲線にしたがって増加
的に消去されます。0 の decay 時間によって、すべての未使用の汚い
(dirty) ページは、作成時に直ちに消去されます。-1 の減少時間は、削除
をを無効にします。デフォルトの減少時間は、10 秒です。関連する動的な
制御オプションについては、arenas.muzzy_decay_ms と
arena.<i>.muzzy_decay_ms を参照してください。混乱した (muzzy) ペー
ジの説明については、opt.muzzy_decay_ms を参照してください。
opt.lg_extent_max_active_fit (size_t) r
ダーティな範囲を再利用するとき、これは、(それから分割される) 選択さ
れたアクティブな範囲のサイズと要求された割り付けサイズの間の (2 を
低とするログ) 最大比率を決定します。これは、(特に、アクティブでない
範囲のために) 長い実行を越えるフラグメンテーションを減らすことがで
きる、より小さい割り付けのための大きなアクティブな範囲の分割を防止
します少ない値は、特別にアクティブな範囲を犠牲にしてフラグメンテー
ションを減少します。デフォルト値は、64 の最大の比率を与える (2^6)、
6 です。
opt.stats_print (bool) r
終了時に印刷する統計値を有効に/無効にします。有効であるなら、
malloc_stats_print() 関数は、atexit(3) 関数によってプログラムの終了
時に呼び出されます。opt.stats_print_opts は、出力オプションを指定す
るために組み合わせることができます。--enable-stats が設定の間に指定
されるなら、これには、1 つ以上のスレッドがメモリ割り付け関数で実行
している間に、終了するマルチスレッドのプロセスのためのデッドロック
を引き起こす可能性があります。さらに、atexit() は、アプリケーション
の初期化の間にメモリを割り付けて、次に、jemalloc が atexit() を順々
に呼び出すとき、内部的にデッドロック状態になるので、このオプション
は、普遍的に使用可能ではありません (が、アプリケーションは、同等の
機能でそれ自体の atexit() 関数を登録することができます)。したがっ
て、このオプションは、注意して使用されるべきです。それは、主とし
て、アプリケーション開発の間の性能の調整の援助することを目的として
います。このオプションは、デフォルトで無効にされます。
opt.stats_print_opts (const char *) r
出口で malloc_stats_print() に渡されるオプション (opts 文字列)
(opt.stats_print を通して有効にされる)。malloc_stats_print() の利用
可能なオプションを参照してください。opt.stats_print が有効にされな
いなら、効果がありません。デフォルトは、"" です。
opt.junk (const char *) r- [--enable-fill]
ジャンクの詰め物。"alloc" に設定されるなら、初期化されていない割り
付けメモリの各バイトは、0xa5 に初期化されます。"free" に設定される
なら、すべての割り付け解除されたメモリは、0x5a に初期化されます。
"true" に設定されるなら、割り付けられ、割り付け解除されたメモリの両
方は、初期化され、"false" に設定されるなら、ジャンクの詰め物は、完
全に無効にされます。これは、デバッグを対象としていて、性能に悪影響
を与えます。このオプションは、--enable-debug が設定の間に指定されな
いなら、デフォルトで、"false" です、その場合に、それは、デフォルト
で "true" です。
opt.zero (bool) r- [--enable-fill]
有効にされる/無効にされる 0 の詰め物。有効にされるなら、初期化され
ていない割り付けられたメモリの各バイトは、0 で初期化されます。この
初期化は、各バイトに対して一度だけ起こるので、realloc() と
rallocx() 呼び出しは、以前に割り付けられたメモリを 0 にしないことに
注意してください。これはデバッグを意図し、実行に否定的に影響を与え
るでしょう。このオプションは、デフォルトで無効にされます。
opt.utrace (bool) r- [--enable-utrace]
有効にされる/無効にされる utrace(2) に基づいた、割り付けの追跡。こ
のオプションは、デフォルトで無効にされます。
opt.xmalloc (bool) r- [--enable-xmalloc]
有効にされる/無効にされる abort-on-out-of-memory。有効にされるな
ら、任意の割り付け関数のために失敗を返すのではなく、STDERR_FILENO
の診断メッセージを表示して、プログラムが (abort(3) を使用して) コア
を落とします。アプリケーションが、この振る舞いに依存するように設計
されているなら、ソースコードに次を含めることによって、コンパイル時
にオプションを設定します:
malloc_conf = "xmalloc:true";
このオプションは、デフォルトで無効にされます。
opt.tcache (bool) r
有効にされる/無効にされるスレッド特有のキャッシング (tcache)。複数
のスレッドがあるとき、各スレッドは、特定のサイズまで、オブジェクト
のための tcache を使用します。スレッド特有のキャッシングによって、
増加したメモリの使用を犠牲にして、あらゆるスレッドの同期を行なわず
に多くの割り付けを、満足させることができます。関連する調整の情報に
ついては、このオプションは、デフォルトで有効です。
opt.lg_tcache_max (size_t) r
スレッド特有のキャッシュ (tcache) でキャッシュする最大サイズのクラ
ス (2 を底とする対数 (log))。最小では、すべての小さなサイズのクラス
は、キャッシュされ、最大では、すべての大きなサイズのクラスは、
キャッシュされます。デフォルトの最大は、32 KiB (2^15) です。
opt.thp (const char *) r
透過的なヒュージページ (THP) モード。THP がオペレーティングシステム
によってサポートされているなら、"always", "never" と "default" を設
定することが、利用可能です。"always" の設定は、MADV_HUGEPAGE ですべ
てのユーザのメモリのマッピングのための透過的なヒュージページを有効
にします。"never" は、MADV_NOHUGEPAGE で透過的なヒュージページを保
証しません。デフォルトの設定 "default" は、変更を行ないません。次に
注意してください: このオプションは、jemalloc の内部メタデータのため
の THP に影響しません (opt.metadata_thp を参照)。加えて、カスタマイ
ズされた extent_hooks があるアリーナのために、このオプションは、そ
れがデフォルトの範囲のフックの一部として実装されるように、バイパス
されます。
opt.prof (bool) r- [--enable-prof]
有効にされる/無効にされるメモリのプロファイリング。有効にされるな
ら、メモリ割り付けの動作をプロファイルします。オンザフライ
(on-the-fly) の活性化/非活性化については、opt.prof_active オプショ
ンを参照してください。確率的なサンプリングの制御については、
opt.lg_prof_sample オプションを参照してください。累積されたサンプル
報告の制御については、opt.prof_accum オプションを参照してください。
間隔 (interval) の引き金となるプロファイルのダンプの情報について
は、opt.lg_prof_interval オプションを、高水位 (high-water) の引き金
となるプロファイルのダンプの情報については、opt.prof_gdump オプショ
ンを、最終のプロファイルのダンプついては、opt.prof_final オプション
を参照してください。プロファイルの出力は、gperftools パッケージ[3]
の一部として開発された pprof に基づく、jeprof コマンドと互換性があ
ります。ヒーププロファイルの形式の文書については、「ヒーププロファ
イルの形式」を参照してください。
opt.prof_prefix (const char *) r- [--enable-prof]
プロファイルのダンプのためのファイル名の接頭辞。接頭辞が空の文字列
に設定されるなら、自動的にダンプは、起こりません。これは、(また、有
効にされるなら、リークの (leak) 報告を無効にする) 自動的な最終の
ヒープダンプを無効にするために主として役に立ちます。デフォルトの接
頭辞は、jeprof です。
opt.prof_active (bool) r- [--enable-prof]
活性化される/非活性化されるプロファイリング。これは、不活発ですが、
有効にされたプロファイリング (opt.prof オプション参照) でアプリケー
ションを開始することを可能にする二次的制御メカニズムです、次に、
prof.active mallctl でプログラム実行の間にいつでもプロファイリング
を切り替えます。このオプションは、デフォルトで有効にされます。
opt.prof_thread_active_init (bool) r- [--enable-prof]
新しく作成されたスレッドの thread.prof.active のための初期設定。ま
た、新しく作成されたスレッドのための初期設定は、
prof.thread_active_init mallctl を通した実行の間に変更することがで
きます。このオプションは、デフォルトで有効にされます。
opt.lg_prof_sample (size_t) r- [--enable-prof]
割り付け動作のバイト単位で測定された割り付けサンプルの間の平均の間
隔 (2 を底とする対数 (log))。サンプリングの間隔を増加させることは、
プロファイルの忠実性を減少させますが、また、計算のオーバヘッドを減
少させます。デフォルトのサンプル間隔は、512 KiB (2^19 B) です。
opt.prof_accum (bool) r- [--enable-prof]
有効にされる/無効にされるプロファイルダンプの累積されたオブジェク
ト/バイトのカウントの報告。このオプションが有効にされるなら、すべて
のユニークなバックトレース (backtrace) は、実行の継続期間に格納され
なければなりません。アプリケーションによって、これは、大きなメモリ
のオーバヘッドを与えるかもしれません、そして、累積されるカウント
は、必ずしも興味深いとは限りません。このオプションは、デフォルトで
無効にされます。
opt.lg_prof_interval (ssize_t) r- [--enable-prof]
割り付け動作のバイト単位で測定されたメモリプロファイルの間の平均の
間隔 (2 を底とする対数 (log))。ダンプ間の実際の間隔は、分散化された
割り付けカウンタは、同期のボトルネックを回避するために使用されるの
で、散発的であるかもしれません。プロファイルは、パターン
<prefix>.<pid>.<seq>.i<iseq>.heap に従って名前を付けられたファイル
にダンプされます、ここで、<prefix> は、opt.prof_prefix オプションに
よって制御されます。デフォルトで、間隔で引き金となるプロファイルの
ダンプは、(-1 としてエンコードされ) 無効にされます。
opt.prof_gdump (bool) r- [--enable-prof]
有効にされるとき、合計の仮想メモリが前の最高を越えている時ごとにメ
モリプロファイルダンプをトリガされる、prof.gdump の初期の状態を設定
します。このオプションは、デフォルトで無効にされます。
opt.prof_final (bool) r- [--enable-prof]
パターン <prefix>.<pid>.<seq>.f.heap に従って名前を付けられたファイ
ルに最後のメモリ使用量をダンプする atexit(3) 関数を使用します、ここ
で、<prefix> は、opt.prof_prefix オプションによって制御されます。
atexit() は、アプリケーションの初期化の間にメモリを割り付け、次に、
jemalloc が atexit() を順々に呼び出すとき、内部的にデッドロック状態
になるので、このオプションは、普遍的に使用可能ではない (が、アプリ
ケーションは、同等の機能で、それ自体の atexit() 関数を登録すること
ができます) ことに注意してください。このオプションは、デフォルトで
無効にされます。
opt.prof_leak (bool) r- [--enable-prof]
有効にされる/無効にされるリーク (leak) の報告。有効にされるなら、割
り付けサンプリングによって検出されたメモリリークを報告するために
atexit(3) 関数を使用します。ヒープのプロファイル出力の解析に関する
情報については、opt.prof オプションを参照してください。このオプショ
ンは、デフォルトで無効にされます。
thread.arena (unsigned) rw
呼び出しているスレッドに関連するアリーナを取得するか、設定します。
指定されたアリーナがあらかじめ初期化されていないなら
(arena.i.initialized mallctl 参照)、このインタフェースを呼び出す副
作用として自動的に初期化されます。
thread.allocated (uint64_t) r- [--enable-stats]
呼び出しているスレッドによってかつて割り付けられたバイトの合計数を
取得します。このカウンタには、ラップアラウンド (wrap around) する可
能性があります。そのような場合にカウンタを適切に解釈することはアプ
リケーション次第です。
thread.allocatedp (uint64_t *) r- [--enable-stats]
thread.allocated mallctl によって返された値へのポインタを取得しま
す。これは、繰り返された mallctl*() 呼び出しのオーバヘッドを回避す
るのに役に立ちます。
thread.deallocated (uint64_t) r- [--enable-stats]
呼び出しているスレッドよってかつて割り付け解放されたバイトの合計数
を取得します。このカウンタには、ラップアラウンド (wrap around) する
可能性があります。そのような場合に、カウンタを適切に解釈することは
アプリケーション次第です。
thread.deallocatedp (uint64_t *) r- [--enable-stats]
thread.deallocated mallctl によって返された値へのポインタを取得しま
す。これは、繰り返された mallctl*() 呼び出しのオーバヘッドを回避す
るのに役に立ちます。
thread.tcache.enabled (bool) rw
呼び出しているスレッドの tcache を有効に/無効にします。tcache は、
無効になる副作用として暗黙のうちにフラッシュされます
(thread.tcache.flush 参照)。
thread.tcache.flush (void) --
呼び出しているスレッドのスレッド特有のキャッシュ (tcache) をフラッ
シュします。このインタフェースは、呼び出しているスレッドの tcache
に関連したすべてのキャッシュに入れられたオブジェクトと内部データ構
造を解放します。通常、自動的な周期の増加するガーベジコレクションが
生じる、スレッドが終了するとき、スレッドのキャッシュが、自動的に廃
棄されるので、このインタフェースを呼び出す必要はありません。しかし
ながら、ガーベジコレクションは、割り付け動作が引き金となるので、そ
のキャッシュを無期限に保持するために割り付け/割り付け解放を停止する
スレッドに可能です、その場合に、開発者は、手動のフラッシュが役に立
つのが分かります。
thread.prof.name (const char *) r- or -w [--enable-prof]
メモリプロファイルダンプの呼び出しているスレッドと関連した記述的な
名前を取得/設定します。名前の文字列の内部のコピーは、作成されるの
で、入力文字列は、このインタフェースの実行が完成した後に、維持され
る必要はありません。複数の実装の詳細が非同期の文字列の割り付け解除
を起こすかもしれないので、このインタフェースの出力文字列は、短命で
ない使用のためにコピーされるべきです。さらに、このインタフェースの
各呼び出しは、読み込みまたは書き込みだけを行うことができます。同時
の読み込み/書き込みは、文字列の有効期間のためサポートされません。名
前の文字列は、ヌル文字で終わらなければなりません、isgraph(3) と
isblank(3) によって認識される設定の文字だけから成ります。
thread.prof.active (bool) rw [--enable-prof]
サンプリングが呼び出しているスレッドのために現在アクティブであるか
どうかを制御します。これは、prof.active に加えて活性化メカニズムで
す。両方は、呼び出しているスレッドがサンプリングするようにアクティ
ブでなければなりません。このフラグは、デフォルトで有効にされます。
tcache.create (unsigned) r
明示的なスレッド特有のキャッシュ (tcache) を作成し、デフォルトで使
用される自動的に管理されるものではなく、指定されたキャッシュを明示
的に使用する MALLOCX_TCACHE(tc) マクロに渡すことができる識別子を返
します。各明示的なキャッシュは、同時に 1 つのスレッドのみによって使
用することができます。アプリケーションは、この強制が保持されること
を保証しなければなりません。
tcache.flush (unsigned) -w
指定されたスレッド特有のキャッシュ (tcache) をフラッシュします。同
じ考慮は、tcache が決して自動的に破壊されないことを除いて、
thread.tcache.flush に関してこのインタフェースに適用します。
tcache.destroy (unsigned) -w
指定されたスレッド特有のキャッシュ (tcache) をフラッシュし、将来の
tcache 作成の間に使用するために識別子を利用可能にします。
arena.<i>.initialized (bool) r
指定されたアリーナの統計が初期設定されるかどうかにかかわらず取得し
ます (すなわち、アリーナは、現在のエポック (epoch) に先がけて初期化
されました)。また、このインタフェースは、MALLCTL_ARENAS_ALL に対応
しているマージされた統計が初期化されるかどうかを問い合わせるために
通常使用することができます (常に真です)。
arena.<i>.decay (void) --
<i> が MALLCTL_ARENAS_ALL と等しいなら、アリーナ <i>、またはすべて
のアリーナのための未使用のダーティ/混乱した (muzzy) ページの減少
ベースの削除を引き起こします。削除される未使用のダーティ/混乱した
(muzzy) ページの割合は、現在の時刻に依存します。詳細については、
opt.dirty_decay_ms と opt.muzy_decay_ms を参照してください。
arena.<i>.purge (void) --
<i> が MALLCTL_ARENAS_ALL と等しいなら、アリーナ <i>、またはすべて
のアリーナのためのすべての未使用のダーティページを削除します。
arena.<i>.reset (void) --
アリーナの現存の割り付けのすべてを破壊します。このインタフェース
は、arenas.extend によって作成されたアリーナでのみ使用することがで
きます。アリーナの破壊された/キャッシュされた割り付けのいずれも、後
でアクセスされません。この要件の一部として、アリーナとともに割り付
け/割り付け解除のために使用されたすべてのスレッドのキャッシュは、前
もってフラッシュされていなければなりません。
arena.<i>.destroy (void) --
アリーナを破壊します。(すべて同じ制約と副作用で) arena.<i>.reset の
ためのように同じメカニズムを使用してアリーナの現存の割り付けのすべ
てを破壊し、アリーナの状態は、アリーナのインデックス
MALLCTL_ARENAS_DESTROYED でアクセス可能なそれらにマージされ、次に、
アリーナと関連するすべてのメタデータを完全に破壊します。
arenas.create への将来の呼び出しは、アリーナのインデックスをリサイ
クルします。あらゆるスレッドが現在 thread.arena への呼び出しの結果
としてアリーナに関連するなら、破壊は、失敗します。
arena.<i>.dss (const char *) rw
アリーナ <i> の、または <i> が MALLCTL_ARENAS_ALL と等しいなら、す
べてのアリーナの mmap 割り付けに関連づけられる dss 割り付けの優先順
位を設定します。巨大な割り付けの間でさえ、アプリケーションが割り付
けサイズにかかわらず一貫した dss 対 mmap 割り付けに依存することがで
きるように、小さいか、または大きな割り付けのために選択されるアリー
ナから、この設定が読み込まれることに注意してください。サポートされ
る設定については、opt.dss を参照してください。
arena.<i>.dirty_decay_ms (ssize_t) rw
未使用のダーティページの等しいセットが削除され、および再利用される
まで、未使用のダーティページのセットの作成からミリ秒単位の現在ア
リーナごとのおおよその時間。このインタフェースが設定されるたびに、
すべての現在の未使用のダーティページは、完全に減少したと見なされ、
その場合に、減少時間が -1 (すなわち、無効にされた削除) に設定されな
いなら、未使用のダーティページを直ちに削除します。追加の情報につい
ては、opt.dirty_decay_ms を参照してください。
arena.<i>.dirty_decay_ms (ssize_t) rw
未使用のダーティページの等しいセットが削除され、および再利用される
まで、未使用のダーティページのセットの作成からミリ秒単位の現在ア
リーナごとのおおよその時間。このインタフェースが設定されるたびに、
すべての現在の未使用のダーティページは、完全に減少したと見なされ、
その場合に、減少時間が -1 (すなわち、無効にされた削除) に設定されな
いなら、すべての未使用のダーティページを直ちに削除します。追加の情
報については、opt.dirty_decay_ms を参照してください。
arena.<i>.retain_grow_limit (size_t) rw
(opt.retain が有効にされるときのみ関連している) 保有する領域を増大
する最大のサイズ。これは、仮想メモリを拡張するか、または
arena.<i>extent_hooks を通して割り付ける最大の増加を制御します。特
に、カスタマイズされた範囲のフックが物理的なメモリ (例えば、1G の
ヒュージページ) を予約するなら、これは、割り付けフックの入力サイズ
を制御するために役に立ちます。デフォルトは、制限なしです。
arena.<i>.extent_hooks (extent_hooks_t *) rw
アリーナ <i> のための範囲管理フック関数を取得するか、または設定しま
す。関数は、通常、未知の範囲を置き換えられた関数に渡すことによって
アリーナ <i> と関連したすべての実在の範囲で操作する能力がなければな
りません。実際に、割り当てを制御することが、arenas.create すべての
広さが、(アリーナ作成の間にカスタムの範囲のフック関数を指定すること
によって) アプリケーションで供給された範囲アロケータを起源とするす
べての範囲のような arenas.create を通して明示的に作成されたアリーナ
のために実現可能です。しかしながら、自動的に作成されたアリーナのた
めの API の保証は、緩和され -- "最もよい努力" 方法で呼び出されるよ
うにフックは、設定します。さらに、範囲割り付けを引き受ける機会があ
るアプリケーションに先がけて、作成された範囲があります。
typedef extent_hooks_s extent_hooks_t;
struct extent_hooks_s {
extent_alloc_t *alloc;
extent_dalloc_t *dalloc;
extent_destroy_t *destroy;
extent_commit_t *commit;
extent_decommit_t *decommit;
extent_purge_t *purge_lazy;
extent_purge_t *purge_forced;
extent_split_t *split;
extent_merge_t *merge;
};
extent_hooks_t 構造体は、下記の個別に説明された関数ポインタから成っ
ています。jemalloc は、割り付け解除が続いている最も簡単な場合に、
マップされ委任されたメモリの割り付けを始める範囲の生存期間を管理す
るめに、これらの関数を使用します。しかしながら、後の再利用のための
範囲を保持する性能とプラットフォームの理由があります。クリーンアッ
プは、それほど永久的ではない (そして、しばしば高価ではない) 操作を
支持して最も永久的なクリーンアップ操作を拒否する範囲管理関数の機会
を与える、怠惰な削除への強制的な削除への委任を解除する割り付け解除
からのカスケードを試みます。割り付けを除いて、すべての操作は、フッ
クポインタを NULL に設定することによって一般的に抜け出るか、また
は、それを、失敗を返すことによって選択的に抜け出ることができます。
いったん範囲フックが設定されたら、構造は、関連したアリーナによって
直接アクセスされるので、それは、アリーナの全体の存続期間のために有
効であり続けなければならないことに注意してください。
typedef void *(extent_alloc_t)(extent_hooks_t *extent_hooks,
void *new_addr, size_t size,
size_t alignment, bool *zero,
bool *commit, unsigned arena_ind);
範囲の割り付け関数は、extent_alloc_t タイプに適合し、範囲が 0 にさ
れるかどうかを示す *zero と範囲が委任されるかどうかを示す *commit
の設定と同様に、範囲のベースアドレスが、alignment の倍数であるよう
な、成功すれば、アリーナ arena_ind の代わりにマップされたメモリの
size バイトへのポインタを返します。エラーにおいて、関数は、NULL を
返し、*zero と *commit は、修正されないままとします。size パラメー
タは、常にページサイズの倍数です。alignment パラメータは、常に少な
くともページサイズと同じくらいの 2 のべき乗です。*zero が関数の入口
で真であるなら、0 にすることは、強制的です。*commit が関数の入口で
真であるなら、委任することは、強制的です。new_addr が NULL ではない
なら、返されたポインタは、成功すれば、new_addr でエラーの場合は、
NULL でなければなりません。委任されたメモリは、過度な約束を行わない
システムでのような絶対的な用語で、またはソフトページフォルトを通し
て要求に応じて必要とされる物理的なメモリを過度な約束と満足するシス
テムでのような暗黙の用語で、委任されます。デフォルトの範囲の割り付
け関数を置き換えることは、アリーナの arena.<i>.dss の無関係の設定を
行うことに注意してください。
typedef bool (extent_dalloc_t)(extent_hooks_t *extent_hooks,
void *addr, size_t size,
bool committed, unsigned arena_ind);
範囲割り付け解除関数は、extent_dalloc_t タイプに適合し、成功すれば
誤りを返す、アリーナ arena_ind の代わりに、示されたように
committed/委任解除メモリで与えられた addr と size で範囲を割り付け
解除します。関数が真を返すなら、これは、割り付け解除からの見合わせ
ることを示します。仮想メモリのマッピングは、同じ委任状態と将来の使
用のために利用可能な、マップされたままの範囲と関連して、その場合
に、後の再利用のために自動的に保持されます。
typedef void (extent_destroy_t)(extent_hooks_t *extent_hooks,
void *addr, size_t size,
bool committed,
unsigned arena_ind);
範囲破壊関数は、extent_destroy_t タイプに適合し、アリーナ arena_ind
の代わりに、示されるように、committed/委任解除されたメモリで与えら
れた addr と size で無条件に破壊します。この関数は、アリーナ破壊の
間に (arena.<i>.destroy 参照) 保有される範囲を破壊するために呼び出
されます。
typedef bool (extent_commit_t)(extent_hooks_t *extent_hooks,
void *addr, size_t size,
size_t offset, size_t length,
unsigned arena_ind);
範囲委任関数は、extent_commit_t タイプに適合し、成功すれば誤りを返
す、アリーナ arena_ind の代わりに、length のために拡張して、offset
バイトで、与えられた addr と size で範囲内のページを裏打ちする 0 ク
リアされた物理メモリを委任します。委任されたメモリは、過度な約束を
行わないシステムでのような絶対的な用語で、またはソフトページフォル
トを通して要求に応じて必要とされる物理的なメモリを過度な約束と満足
するシステムでのような暗黙の用語で、委任されます。関数が真を返すな
ら、これは、要求を満たす不十分な物理メモリを示します。
typedef bool (extent_decommit_t)(extent_hooks_t *extent_hooks,
void *addr, size_t size,
size_t offset, size_t length,
unsigned arena_ind);
範囲の委任解除関数は、extent_decommit_t タイプと適合し、成功で誤り
を返す、アリーナ arena_ind の代わりに length のために拡張され、
offset バイトで与えられた addr と size の範囲内のページに裏打ちされ
たあらゆる物理メモリを委任解除します。関数が真を返すなら、これは、
委任解除から見合わせることを示します。メモリは、委任されたままで、
将来の使用のために利用可能です、その場合に、後の再利用のために自動
的に保持されます。
typedef bool (extent_purge_t)(extent_hooks_t *extent_hooks,
void *addr, size_t size,
size_t offset, size_t length,
unsigned arena_ind);
範囲削除関数は、extent_purge_t タイプに適合し、アリーナ arena_ind
の代わりに、length のために拡張され、offset バイトで与えられた addr
と size で範囲に関連する仮想メモリマッピング内の物理的なページをで
破壊します。(例えば、madvise(...MADV_FREE) によって実装される) 怠惰
な範囲削除関数は、無制限に削除することを遅延することができ、削除さ
れた仮想メモリ範囲内のページを正確でない状態のままにし、強制される
範囲削除関数が直ちに削除し、次回に仮想メモリ範囲内のページが 0 で満
たされるのに対して、それらは、アクセスされます。関数が真を返すな
ら、これは、削除に失敗することを示します。
typedef bool (extent_split_t)(extent_hooks_t *extent_hooks,
void *addr, size_t size,
size_t size_a, size_t size_b,
bool committed, unsigned arena_ind);
範囲分割関数は、extent_split_t タイプに適合し、成功で誤りを返す、ア
リーナ arena_ind の代わりに、示されるように、committed/委任解除され
たメモリで操作され、最初の size_a バイトと 2 番目 size_b バイトの与
えられた addr と size を、2 つの隣接した範囲にオプションで分割しま
す。関数が真を返すなら、これは、範囲が分割されないままで、そのため
に、全体として操作され続けるべきですであることを示します。
typedef bool (extent_merge_t)(extent_hooks_t *extent_hooks,
void *addr_a, size_t size_a,
void *addr_b, size_t size_b,
bool committed, unsigned arena_ind);
範囲マージ関数は、extent_merge_t タイプに適合し、成功で誤りを返す、
アリーナ arena_ind の代わりに示されるように、committed/委任解除され
たメモリで操作され、与えられた addr_b と size_b を 1 つの隣接してい
る範囲に与えられた addr_a と size_a で、隣接した範囲をオプションで
マージします。関数が真を返すなら、これは、範囲が区別されたマッピン
グのままで、したがって、独立して操作され続けるべきであることを示し
ます。
arenas.narenas (unsigned) r
アリーナの数に関する現在の制限。
arenas.dirty_decay_ms (ssize_t) rw
未使用のダーティページのセットの作成からミリ秒単位の現在のデフォル
トのアリーナごとにおおよその時間は、未使用のダーティページの等しい
セットが削除されるか、または再利用されるまで、アリーナ作成の間に
arena.<i>.dirty_decay_ms を初期化するために使用されます。追加の情報
については、opt.dirty_decay_ms を参照してください。
arenas.muzzy_decay_ms (ssize_t) rw
未使用の混乱した (muzzy) ページのセットの作成からミリ秒単位の現在の
デフォルトのアリーナごとにおおよその時間は、未使用の混乱した
(muzzy) ページの等しいセットが削除されるか、または再利用されるま
で、アリーナ作成の間に arena.<i>.muzzy_decay_ms を初期化するために
使用されます。追加の情報については、opt.muzzy_decay_ms を参照してく
ださい。
arenas.quantum (size_t) r
クオンタム (quantum) サイズ。
arenas.page (size_t) r
ページサイズ。
arenas.tcache_max (size_t) r
最大のスレッドにキャッシュされたサイズのクラス。
arenas.nbins (unsigned) r
bin サイズのクラスの数。
arenas.nhbins (unsigned) r
スレッドのキャッシュ bin サイズのクラスの合計数。
arenas.bin.<i>.size (size_t) r
サイズのクラスによってサポートされた最大のサイズ。
arenas.bin.<i>.nregs (uint32_t) r
スラブ (slab) ごとの領域の数。
arenas.bin.<i>.slab_size (size_t) r
スラブ (slab) ごとのバイトの数。
arenas.nlextents (unsigned) r
ラージ (large) サイズのクラスの合計数。
arenas.lextent.<i>.size (size_t) r
このラージサイズのクラスによってサポートされた最大のサイズ。
arenas.create (unsigned, extent_hooks_t *) rw
オプションで指定された範囲フックと新しいアリーナのインデックスを返
して、自動的に管理されたアリーナの範囲の外側で新しいアリーナを明示
的に作成します。
arenas.lookup (unsigned, void*) rw
割り付けが属しているアリーナのインデックス。
prof.thread_active_init (bool) rw [--enable-prof]
新しく作成されたスレッドの thread.prof.active のための初期設定を制
御します。追加の情報については、opt.prof_thread_active_init オプ
ションを参照してください。
prof.active (bool) rw [--enable-prof]
サンプリングが現在アクティブかどうかを制御します。相互に関係づける
opt.prof_active mallctl と同様に、追加の情報については、
thread.prof.active オプションを参照してください。
prof.dump (const char *) -w [--enable-prof]
指定されたファイルへにメモリのプロファイルをダンプするか、または
NULL が指定されるなら、パターン <prefix>.<pid>.<seq>.m<mseq>.heap
に従ってファイルにダンプします、ここで、<prefix> は、
opt.prof_prefix オプションによって制御されます。
prof.gdump (bool) rw [--enable-prof]
有効にされたとき、合計の仮想メモリが前の最高を越えるたびに、メモリ
プロファイルのダンプをトリガします。プロファイルは、パターン
<prefix>.<pid>.<seq>.u<useq>.heap に従って指定されたファイルにダン
プされます、ここで <prefix> は、opt.prof_prefix オプションによって
制御されます。
prof.reset (size_t) -w [--enable-prof]
すべてのメモリプロファイルの統計をリセットし、オプションで、サンプ
ルレートを更新します (opt.lg_prof_sample と prof.lg_sample を参
照)。
prof.lg_sample (size_t) r- [--enable-prof]
現在のサンプルレートを取得します (opt.lg_prof_sample を参照)。
prof.interval (uint64_t) r- [--enable-prof]
間隔に基づいたプロファイルのダンプの間に割り付けられたバイトの平均
数。追加情報については、opt.lg_prof_interval オプションを参照してく
ださい。
stats.allocated (size_t) r- [--enable-stats]
アプリケーションによって割り付けられたバイトの合計数。
stats.active (size_t) r- [--enable-stats]
アプリケーションによって割り付けられたアクティブなページのバイトの
合計数。これは、ページサイズの倍数で、stats.allocated 以上です。こ
れは、stats.arenas.<i>.pdirty, stats.arenas.<i>.pmuzzy もアロケータ
のメタデータへの完全に向けられたページも含みません。
stats.metadata (size_t) r- [--enable-stats]
ブートストラップに敏感なアロケータのメタデータの構造
(stats.arenas.<i>.base を参照) と内部の割り付け
(stats.arenas.<i>.internal を参照) のために使用された基本的な割り付
けを構成する、メタデータに専用のバイトの合計の数。透過的なヒュージ
ページ (opt.metadata_thp で有効される) の使用法は、考慮されません。
stats.metadata_thp (size_t) r- [--enable-stats]
透過的なヒュージページ (THP) の数は、メタデータのために使用されま
す。詳細については、stats.metadata と opt.metadata_thp を参照してく
ださい。
stats.resident (size_t) r- [--enable-stats]
アロケータのメタデータ、アクティブな割り付けに裏打ちされたページ、
と未使用の汚い (dirty) ページに専門のすべてのページから成る、アロ
ケータによってマップされた常駐しているデータページの物理的なバイト
の最大の数。それらが、まだ変更されていなかった要求され 0 にされた仮
想メモリに対応しているなら、ページが実際に物理的に常駐されていない
ので、これは、正確でなく、最高です。これは、ページサイズの倍数であ
り、stats.active より大きくなります。
stats.mapped (size_t) r- [--enable-stats]
アロケータによってマップされたアクティブな範囲のバイトの合計の数。
これは、stats.active より大きくなります。これは、これと
stats.resident の間の厳密でない順序があることを意味する、未使用の
ダーティページを含む、それらでさえ、アクティブでない範囲を含みませ
ん。
stats.retained (size_t) r- [--enable-stats]
例えば、munmap(2) または同様のものを通してオペレーティングシステム
に返されるのではなく、保持された仮想メモリマッピングの合計バイト
数。保持された仮想メモリは、通常、修正されず、コミット解除される
か、または削除されるので、それには、強く関連した物理メモリがありま
せん (詳細については、拡張フックを参照)。保持されたメモリは、マップ
されたメモリ統計、例えば、stats.mapped から除外されます。
stats.background_thread.num_threads (size_t) r- [--enable-stats]
現在実行しているバックグラウンドのスレッドの数。
stats.background_thread.num_runs (uint64_t) r- [--enable-stats]
すべてのバックグラウンドのスレッドからの実行の合計の数。
stats.background_thread.run_interval (uint64_t) r- [--enable-stats]
バックグラウンドのスレッドのナノ秒単位の平均的な実行の間隔。
stats.mutexes.ctl.{counter}; (counter specific type) r
[--enable-stats]
ctl ミューテックスの統計 (グローバルなスコープ; 関連する mallctl)。
{counter} は、以下のカウンタの 1 つです:
num_ops (uint64_t): このミューテックスのロック獲得操作の合計の
数。
num_spin_acq (uint64_t): ミューテックスが獲得されたスピンであっ
た回数。ミューテックスが現在ロックされ、直ちに獲得できないと
き、jemalloc 内のスピンのリトライの短い期間は、実行されます。コ
ンテンションがライトウェートであり、コンテキストスイッチを引き
起こしないことを意味して、一般的にスピンを通して獲得されます。
num_wait (uint64_t): ミューテックスのコンテンションが、スピンの
リトライによって解決されず、ブロックしている操作が、ミューテッ
クスを獲得するために、たぶん関係することを意味している、ミュー
テックスが獲得されたウェートであった回数。このイベントは、一般
的により高いコスト / より長遅延を意味し、しばしばそれが起こるな
ら、調査されるべきです。
max_wait_time (uint64_t): ナノ秒単位の時間の最大の長さは、ロッ
ク操作で単一の獲得されたウェートで費やしました。共通のパスでプ
ロファイリングのオーバヘッドを避けるために、これは、獲得された
スピンの場合を考慮しないことに注意してください。
total_wait_time (uint64_t): ナノ秒単位の累積している時間は、
ロック操作で獲得されたウェートで費やしました。同様に、獲得され
たスピンの場合は、考慮されません。
max_num_thds (uint32_t): 同時にこのミューテックスでウェートして
いるスレッドの最大の数。同様に、獲得されたスピンの場合は、考慮
されません。
num_owner_switch (uint64_t): 現在のミューテックスの所有者が前の
ものと異なる回数。このイベントは、一般的に問題を意味していませ
ん。むしろ、それは、保護されたデータが、異なったスレッドによっ
て、どのくらいアクセスされるかの指定子です。
stats.mutexes.background_thread.{counter} (counter specific type) r
[--enable-stats]
background_thread ミューテックスの統計 (グローバルなスコープ; 関連
する background_thread)。{counter} は、ミューテックスのプロファイリ
ングカウンタのカウンタの 1 つです。
stats.mutexes.prof.{counter} (counter specific type) r
[--enable-stats]
prof ミューテックスの統計 (グローバルなスコープ; 関連するプロファイ
リング)。{counter} は、ミューテックスのプロファイリングカウンタのカ
ウンタの 1 つです。
stats.mutexes.reset (void) -- [--enable-stats]
グローバルなミューテックス、アリーナのミューテックスと bin のミュー
テックスを含むすべてのミューテックスのプロファイルの統計をリセット
します。
stats.arenas.<i>.dss (const char *) r
mmap(2) 割り付けに関連づけられる dss (sbrk(2)) 割り付けの優先順位。
詳細については、opt.dss を参照してください。
stats.arenas.<i>.dirty_decay_ms (ssize_t) r
未使用のダーティページの等しいセットが削除される、および再利用され
るまで、未使用のダーティページのセットの作成からミリ秒単位のおおよ
その時間。詳細については、opt.dirty_decay_ms を参照してください。
stats.arenas.<i>.muzzy_decay_ms (ssize_t) r
未使用の混乱した (muzzy) ページの等しいセットが削除される、および
再利用されるまで、未使用の混乱した (muzzy) ページのセットの作成か
らミリ秒単位のおおよその時間。詳細については、opt.muzzy_decay_ms を
参照してください。
stats.arenas.<i>.nthreads (unsigned) r
アリーナに現在割り当てられたスレッドの数。
stats.arenas.<i>.uptime (uint64_t) r
アリーナが作成されて以来の経過時間 (ナノ秒単位)。<i> が 0 または
MALLCTL_ARENAS_ALL と等しいなら、これは、malloc 初期化以来の uptime
(システムが起動している時間) です。
stats.arenas.<i>.pactive (size_t) r
アクティブな範囲のページの数。
stats.arenas.<i>.pdirty (size_t) r
潜在的にダーティな未使用の範囲内のページの数と madvise() のための、
またはまたは呼び出されていない類似のもの。ダーティページの説明につ
いては、opt.dirty_decay_ms を参照してください。
stats.arenas.<i>.pmuzzy (size_t) r
混乱した (muzzy) 未使用の範囲内のページの数。混乱した (muzzy) ペー
ジの説明については、opt.muzzy_decay_ms を参照してください。
stats.arenas.<i>.mapped (size_t) r- [--enable-stats]
マップされたバイトの数。
stats.arenas.<i>.retained (size_t) r- [--enable-stats]
保有されるバイト数。詳細については、stats.retained を参照してくださ
い。
stats.arenas.<i>.extent_avail (size_t) r- [--enable-stats]
このアリーナの割り付けられた (しかし未使用である) extent 構造体の番
号。
stats.arenas.<i>.base (size_t) r- [--enable-stats]
ブートストラップの敏感なアロケータのメタデータの構造への専用のバイ
トの数。
stats.arenas.<i>.internal (size_t) r- [--enable-stats]
内部の割り付けに専門のバイトの数。内部の割り当ては、それらが内部の
使用のためであり、それらがヒープのプロファイルから省略されるという
点において、アプリケーションの起源の割り付けと異なります。
stats.arenas.<i>.metadata_thp (size_t) r- [--enable-stats]
透過的なヒュージページ (THP) の数は、メタデータのために使用されま
す。詳細については、opt.metadata_thp を参照してください。
stats.arenas.<i>.resident (size_t) r- [--enable-stats]
アロケータのメタデータ、アクティブな割り付けの裏打ちされたページと
未使用のダーティページへの専門のすべてのページから成る、アリーナに
よってマップされた物理的に常駐しているデータページのバイトの最大の
数。それらが、まだ変更されていなかった要求によって 0 化された仮想メ
モリに対応しているなら、ページが、実際に、物理的に常駐していないの
で、これは、正確ではなく最大です。これは、ページサイズの倍数です。
stats.arenas.<i>.dirty_npurge (uint64_t) r- [--enable-stats]
実行されたダーティページの削除スイープ (sweep) の数。
stats.arenas.<i>.dirty_nmadvise (uint64_t) r- [--enable-stats]
ダーティページを削除するために行われる madvise() または同様の呼び出
しの数。
stats.arenas.<i>.dirty_purged (uint64_t) r- [--enable-stats]
削除されたダーティページの数。
stats.arenas.<i>.muzzy_npurge (uint64_t) r- [--enable-stats]
実行された混乱した (muzzy) ページ削除のスイープ (sweep) の数。
stats.arenas.<i>.muzzy_nmadvise (uint64_t) r- [--enable-stats]
混乱した (muzzy) ページを削除するために行われる madvise() または同
様の呼び出しの数。
stats.arenas.<i>.muzzy_purged (uint64_t) r- [--enable-stats]
削除された混乱した (muzzy) ページの数。
stats.arenas.<i>.small.allocated (size_t) r- [--enable-stats]
小さなオブジェクトによって現在割り付けられたバイトの数。
stats.arenas.<i>.small.nmalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効であるか、そうでなければ、割り付け要求を直接満た
す、関連した tcache を満たすかどうかにかかわらず、小さな割り付けが
アリーナの bin から要求された累積している回数。
stats.arenas.<i>.small.ndalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効であるか、そうでなければ、割り付けを直接割り付け解
除する、関連した tcache をフラッシュするかどうかにかかわらず、小さ
な割り付けがアリーナの bin に要求された累積している回数。
stats.arenas.<i>.small.nrequests (uint64_t) r- [--enable-stats]
すべての bin サイズクラスによって満たされている割り付け要求の累積し
ている数。
stats.arenas.<i>.small.nfills (uint64_t) r- [--enable-stats]
すべての小さいサイズのクラスに満たされた tcache の数を累積します。
stats.arenas.<i>.small.nflushes (uint64_t) r- [--enable-stats]
すべての小さいサイズのクラスによってフラッシュされた tcache の数を
累積します。
stats.arenas.<i>.large.allocated (size_t) r- [--enable-stats]
現在、ラージオブジェクトによって割り付けられたバイトの数。
stats.arenas.<i>.large.nmalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効であり、サイズクラスが、キャッシュされている範囲内
にあるなら、そうでなければ、割り付け要求を直接満たすために、関連し
た tcache を満たすかどうかにかかわらず、ラージ範囲がアリーナから割
り付けられた累積している回数。
stats.arenas.<i>.large.ndalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効であり、サイズクラスが、キャッシュされている範囲内
にあるなら、そうでなければ、割り付けを直接割り付け解除するために、
関連した tcache をフラッシュするかどうかにかかわらず、ラージ範囲が
アリーナに返された累積している回数。
stats.arenas.<i>.large.nrequests (uint64_t) r- [--enable-stats]
すべてのラージサイズクラスによって満たされている割り付け要求の累積
している数。
stats.arenas.<i>.large.nfills (uint64_t) r- [--enable-stats]
すべての大きいサイズのクラスによって満たされる tcache の数を累積し
ます。
stats.arenas.<i>.large.nflushes (uint64_t) r- [--enable-stats]
すべての大きいサイズのクラスによってフラッシュされる tcache の数を
累積します。
stats.arenas.<i>.bins.<j>.nmalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効にされるなら、またはそうでなければ、割り付け要求を
直接満たすために関連した tcache を満たすかどうかにかかわらず、対応
したサイズクラスの bin 領域がアリーナから割り付けられる回数を累積し
ます。
stats.arenas.<i>.bins.<j>.ndalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効であるなら、そうでなければ、割り付けを直接割り付け
解除するために、対応したサイズクラスの bin 領域が、アリーナに返され
た累積している回数。
stats.arenas.<i>.bins.<j>.nrequests (uint64_t) r- [--enable-stats]
対応したサイズクラスの bin 領域によって満たされている割り付け要求の
累積している数。
stats.arenas.<i>.bins.<j>.curregs (size_t) r- [--enable-stats]
このサイズのクラスのための領域の現在の数。
stats.arenas.<i>.bins.<j>.nfills (uint64_t) r
満たされた tcache の累積された数。
stats.arenas.<i>.bins.<j>.nflushes (uint64_t) r
フラッシュされた tcache の累積された数。
stats.arenas.<i>.bins.<j>.nslabs (uint64_t) r- [--enable-stats]
作成されたスラブ (slab) の累積している数。
stats.arenas.<i>.bins.<j>.nreslabs (uint64_t) r- [--enable-stats]
変更された割り付ける現在のスラブ (slab) の累積している数。
stats.arenas.<i>.bins.<j>.curslabs (size_t) r- [--enable-stats]
スラブ (slab) の現在の数。
stats.arenas.<i>.bins.<j>.nonfull_slabs (size_t) r- [--enable-stats]
完全でないスラブ (slab) の現在の数。
stats.arenas.<i>.bins.<j>.mutex.{counter} (counter specific type) r
[--enable-stats]
arena.<i>.bins.<j> ミューテックスの統計 (アリーナ bin スコープ; 関
連する bin 操作)。{counter} は、ミューテックスのプロファイリングカ
ウンタのカウンタの 1 つです。
stats.arenas.<i>.extents.<j>.n{extent_type} (size_t) r
[--enable-stats]
ページサイズのインデックス <j> に対応しているバケツのこのアリーナの
与えられたタイプの範囲の数。範囲タイプは、dirty, muzzy または
retained の 1 つです。
stats.arenas.<i>.extents.<j>.{extent_type}_bytes (size_t) r
[--enable-stats]
ページサイズのインデックス <j> に対応しているバケツのこのアリーナの
与えられたタイプの範囲によって管理されたバイトの合計。範囲タイプ
は、dirty, muzzy または retained の 1 つです。
stats.arenas.<i>.lextents.<j>.nmalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効であり、サイズクラスが、キャッシュされている範囲内
にあるなら、そうでなければ、割り付けを直接満たすために、関連した
tcache を満たすかどうかにかかわらず、対応しているサイズクラスのラー
ジ範囲がアリーナから割り付けられた累積している回数。
stats.arenas.<i>.lextents.<j>.ndalloc (uint64_t) r- [--enable-stats]
opt.tcache が有効であり、サイズクラスが、キャッシュされている範囲内
にあるなら、そうでなければ、割り付けを直接割り付け解除するために、
関連した tcache をフラッシュするかどうかにかかわらず、対応している
サイズクラスのラージ範囲がアリーナに返された累積している回数。
stats.arenas.<i>.lextents.<j>.nrequests (uint64_t) r- [--enable-stats]
対応したサイズクラスのラージ範囲によって満たされる割り付け要求の累
積している数。
stats.arenas.<i>.lextents.<j>.curlextents (size_t) r- [--enable-stats]
このサイズクラスのためのラージ割り付けの現在の数。
stats.arenas.<i>.mutexes.large.{counter} (counter specific type) r
[--enable-stats]
arena.<i>.large ミューテックスの統計 (アリーナのスコープ; 関連する
ラージ割り付け)。{counter} は、ミューテックスのプロファイリングカウ
ンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.extent_avail.{counter} (counter specific type)
r- [--enable-stats]
arena.<i>.extent_avail ミューテックスの統計 (アリーナのスコープ; 関
連する範囲の利点 (avail))。{counter} は、ミューテックスのプロファイ
リングカウンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.extents_dirty.{counter} (counter specific
type) r- [--enable-stats]
arena.<i>.extents_dirty ミューテックスの統計 (アリーナのスコープ;
関連するダーティな範囲)。{counter} は、ミューテックスのプロファイリ
ングカウンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.extents_muzzy.{counter} (counter specific
type) r- [--enable-stats]
arena.<i>.extents_muzzy ミューテックスの統計 (アリーナのスコープ;
関連する混乱した (muzzy) 範囲)。{counter} は、ミューテックスのプロ
ファイリングカウンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.extents_retained.{counter} (counter specific
type) r- [--enable-stats]
arena.<i>.extents_retained ミューテックスの統計 (アリーナのスコー
プ; 関連する保持する範囲)。{counter} は、ミューテックスのプロファイ
リングカウンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.decay_dirty.{counter} (counter specific type)
r- [--enable-stats]
arena.<i>.decay_dirty ミューテックスの統計 (アリーナのスコープ; 関
連するダーティページのための減少)。{counter} は、ミューテックスのプ
ロファイリングカウンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.decay_muzzy.{counter} (counter specific type)
r- [--enable-stats]
arena.<i>.decay_muzzy ミューテックスの統計 (アリーナのスコープ; 関
連する混乱した (muzzy) ページのための減少)。{counter} は、ミュー
テックスのプロファイリングカウンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.base.{counter} (counter specific type) r
[--enable-stats]
arena.<i>.base ミューテックスの統計 (アリーナのスコープ; 関連する基
本的なアロケータ)。{counter} は、ミューテックスのプロファイリングカ
ウンタのカウンタの 1 つです。
stats.arenas.<i>.mutexes.tcache_list.{counter} (counter specific type)
r- [--enable-stats]
arena.<i>.tcache_list ミューテックスの統計 (アリーナのスコープ; 関
連するアリーナのアソシエーション (接続) への tcache)。このミュー
テックスは、それほど頻繁ではありませんがアクセスされることが期待さ
れます。{counter} は、ミューテックスのプロファイリングカウンタのカ
ウンタの 1 つです。
ヒーププロファイルの形式
ヒーププロファイリングの機能は、元々 gperftools package[3] の部分として
開発された pprof コマンドと互換性があるように設計されましたが、追加のス
レッドごとのヒーププロファイリングの機能は、異なったヒーププロファイル
形式を必要としました。ここに説明されたヒーププロファイル形式のサポート
を強化するとともに、jeprof コマンドは、pprof から派生されました。
次の仮定のヒーププロファイルにおいて、[...] は、簡潔さのための省略を示
します。
heap_v2/524288
t*: 28106: 56637512 [0: 0]
[...]
t3: 352: 16777344 [0: 0]
[...]
t99: 17754: 29341640 [0: 0]
[...]
@ 0x5f86da8 0x5f5a1dc [...] 0x29e4d4e 0xa200316 0xabb2988 [...]
t*: 13: 6688 [0: 0]
t3: 12: 6496 [0: ]
t99: 1: 192 [0: 0]
[...]
MAPPED_LIBRARIES:
[...]
次は、上記のヒーププロファイルと一致しますが、ほとんどのトークンは、対
応しているフィールドの説明を示すために、<description> と置き換えられま
す。
<heap_profile_format_version>/<mean_sample_interval>
<aggregate>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
[...]
<thread_3_aggregate>: <curobjs>: <curbytes>[<cumobjs>: <cumbytes>]
[...]
<thread_99_aggregate>: <curobjs>: <curbytes>[<cumobjs>: <cumbytes>]
[...]
@ <top_frame> <frame> [...] <frame> <frame> <frame> [...]
<backtrace_aggregate>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
<backtrace_thread_3>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
<backtrace_thread_99>: <curobjs>: <curbytes> [<cumobjs>: <cumbytes>]
[...]
MAPPED_LIBRARIES:
</proc/<pid>/maps>
MALLOC 問題のデバッグ
デバッグするとき、--enable-debug と --enable-fill オプションで jemalloc
を設定/構築し、適切なオプションとデバッガサポートのためのシンボルでプロ
グラムを再コンパイルすることはよい考えです。したがって、設定するとき、
jemalloc は、double-free、write-after-free、などのようなアプリケーショ
ンエラーをキャッチする様々の実行時アサーションを組込みます。
プログラムは、0 バイトで実際に満たされている、"初期化されていない" メモ
リにしばしば偶然に依存します。ジャンク詰め物 (opt.junk オプション参照)
は、明らかに正しくない結果および/またはコアダンプの形のそのようなバグを
あらわにする傾向があります。反対に、0 の詰め物 (opt.zero オプション参
照) は、そのようなバグの兆候を排除します。これらの 2 つのオプション間
で、そのようなバグをすばやく検出し、診断し、排除するすることは通常可能
です。
この実装は、そのような情報を格納するために性能の影響が抑制されるので、
それが検出する問題に関する詳細を提供しません。
診断メッセージ
メモリ割り付け/割り付け解放関数のいずれかがエラーまたは警告の条件を検出
するなら、メッセージは、ファイル記述子 STDERR_FILENO に印刷されます。エ
ラーは、プロセスがコアをダンプする結果となります。opt.abort オプション
が設定されるなら、ほとんどの警告は、エラーとして扱われます。
malloc_message 変数によって、プログラマは、ある理由のために、
STDERR_FILENO ファイル記述子がこれに適していないなら、エラーと警告を書
式化するテキスト文字列を出力する関数を上書きすることができます。
malloc_message() は、文字列ポインタに続いて、malloc_stats_print() への
呼び出しの引数によって上書きされないなら、NULL である cbopaque ポインタ
引数を取ります。この関数のメモリを割り付けを試みるものを行うことは、た
ぶんクラッシュまたはデッドロックの結果になることに注意してください。
すべてのメッセージは、"<jemalloc>: " が前に付けられます。
戻り値
標準 API
malloc() と calloc() 関数は、成功するなら、割り付けられたメモリへのポイ
ンタを返します。そうでなければ、NULL ポインタが返され、errno は、ENOMEM
に設定されます。
posix_memalign() 関数は、成功するなら、値 0 を返します。そうでなけれ
ば、それは、エラー値を返します。posix_memalign() 関数は、次の場合に失敗
します:
EINVAL
alignment パラメータが、少なくとも sizeof(void *) と同じくらいの大
きさで 2 のべき乗ではありません。
ENOMEM
メモリ割り付けエラー。
aligned_alloc() 関数は、成功するなら、割り付けられたメモリへのポインタ
を返します。そうでなければ、NULL ポインタが返され、errno が設定されま
す。aligned_alloc() 関数は、次の場合に失敗します:
EINVAL
alignment パラメータが、2 のべき乗ではありません。
ENOMEM
メモリ割り付けエラー。
realloc() 関数は、成功するなら、割り付けられたメモリへの (たぶん、ptr
と同一の) ポインタを返します。そうでなければ、NULL ポインタが返され、エ
ラーが割り付け失敗の結果であったなら、errno は、ENOMEM に設定されます。
realloc() 関数は、エラーが生じるとき、常に元のバッファのままにしておき
ます。
free() 関数は、値を返しません。
非標準 API
mallocx() と rallocx() 関数は、成功するなら、割り付けられたメモリへのポ
インタを返します。そうでなければ、十分に連続しているメモリが割り付け要
求をサービスするのに利用可能でなかったことを示すために、NULL ポインタが
返されます。
xallocx() 関数は、割り付けがインプレース (入力データを直接書き換える)
で適切に成長することができないなら、size 未満で値である、ptr によって指
される結果のリサイズされた割り付けの実際のサイズを返します。
sallocx() 関数は、ptr によって指される割り付けの実際のサイズを返しま
す。
nallocx() は、成功した等価な mallocx() 関数呼び出しの結果となる実際のサ
イズを返し、十分なメモリがサイズ計算を行なうのに利用可能でないなら、0
を返します。
mallctl(), mallctlnametomib() と mallctlbymib() 関数は、成功すれば、0
を返します。そうでなければ、それらは、エラー値を返します。関数は、次の
場合に失敗します:
EINVAL
newp が NULL ではなく、newlen が大きすぎるか、または小さすぎます。
また、*oldlenp が大きすぎるか、または小さすぎます。この場合、データ
は、エラーにもかかわらずできるだけ読み込まれます。
ENOENT
name または mib が、未知の値/無効の値を指定しています。
EPERM
無効の値を読み込むかまたは書き込を試みたか、または読み込み専用の値
に書き込む試みをしました。
EAGAIN
メモリ割り付けの失敗が生じました。
EFAULT
副作用があるインタフェースが、mallctl*() 読み込み/書き込み処理と直
接関係しないある方法に失敗しました。
malloc_usable_size() 関数は、ptr によって指される割り付けの使用可能なサ
イズを返します。
環境変数
次の環境変数は、割り付け関数の実行に影響します:
MALLOC_CONF
環境変数 MALLOC_CONF が設定されるなら、それが含んでいる文字は、オプ
ションとして解釈されます。
使用例
問題が生じるときはいつでもコアダンプするためには:
ln -s 'abort:true' /etc/malloc.conf
ほんの 1 つのアリーナが自動的に作成されるべきソースを指定するために:
malloc_conf = "narenas:1";
関連項目
madvise(2), mmap(2), sbrk(2), utrace(2), alloca(3), atexit(3),
getpagesize(3)
規格
malloc(), calloc(), realloc() と free() 関数は、ISO/IEC 9899:1990 ("ISO
C90") に適合しています。
posix_memalign() 関数は、IEEE Std 1003.1-2001 ("POSIX.1") に適合してい
ます。
歴史
malloc_usable_size() と posix_memalign() 関数は、FreeBSD 7.0 ではじめて
登場しました。
aligned_alloc(), malloc_stats_print() と mallctl*() 関数は、FreeBSD
10.0 ではじめて登場しました。
*allocx() 関数は、FreeBSD 11.0 ではじめて登場しました。
作者
Jason Evans
注
1. jemalloc ウェブサイト
http://jemalloc.net/
2. JSON format
http://www.json.org/
3. gperftools パッケージ
http://code.google.com/p/gperftools/
jemalloc 5.2.1-0-gea6b3e973b47 11/10/2019 JEMALLOC(3)