1

tcmalloc を使用するマルチスレッド アプリケーションのパフォーマンスの問題を修正しようとしています。各スレッドは多数のオブジェクトを作成し、私の分析では、tcmalloc のスレッド キャッシュがメモリを割り当てることができず、中央のページ ヒープからメモリを取得しようとすることがよくあります。 これは、 4 つのスレッドに対してMALLOCSTATS=2を使用した app の私の出力です。

Total size of freelists for per-thread caches,
transfer cache, and central cache, by size class
------------------------------------------------
class   1 [        8 bytes ] :     2046 objs;   0.0 MiB;   0.0 cum MiB
class   2 [       16 bytes ] :     1023 objs;   0.0 MiB;   0.0 cum MiB
class   3 [       32 bytes ] :      507 objs;   0.0 MiB;   0.0 cum MiB
class   5 [       64 bytes ] :      511 objs;   0.0 MiB;   0.1 cum MiB
class   6 [       80 bytes ] :      204 objs;   0.0 MiB;   0.1 cum MiB
class   9 [      128 bytes ] :      128 objs;   0.0 MiB;   0.1 cum MiB
class  15 [      224 bytes ] :       73 objs;   0.0 MiB;   0.1 cum MiB
class  16 [      240 bytes ] :       68 objs;   0.0 MiB;   0.1 cum MiB
class  17 [      256 bytes ] :       64 objs;   0.0 MiB;   0.2 cum MiB
class  19 [      320 bytes ] :       47 objs;   0.0 MiB;   0.2 cum MiB
class  25 [      512 bytes ] :      352 objs;   0.2 MiB;   0.3 cum MiB
class  26 [      576 bytes ] :       28 objs;   0.0 MiB;   0.4 cum MiB
class  33 [     1024 bytes ] :     1072 objs;   1.0 MiB;   1.4 cum MiB
class  39 [     2048 bytes ] :      832 objs;   1.6 MiB;   3.0 cum MiB
class  45 [     4096 bytes ] :      276 objs;   1.1 MiB;   4.1 cum MiB
class  50 [     8192 bytes ] :        2 objs;   0.0 MiB;   4.1 cum MiB
------------------------------------------------
PageHeap: 16 sizes;  713.5 MiB free;    0.0 MiB unmapped
------------------------------------------------
     2 pages *     39 spans ~    0.6 MiB;    0.6 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
     4 pages *     19 spans ~    0.6 MiB;    1.2 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
     6 pages *     17 spans ~    0.8 MiB;    2.0 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
     8 pages *      6 spans ~    0.4 MiB;    2.4 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    10 pages *      4 spans ~    0.3 MiB;    2.7 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    12 pages *      2 spans ~    0.2 MiB;    2.9 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    14 pages *      2 spans ~    0.2 MiB;    3.1 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    16 pages *      2 spans ~    0.2 MiB;    3.3 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    20 pages *      1 spans ~    0.2 MiB;    3.5 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    28 pages *      1 spans ~    0.2 MiB;    3.7 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    30 pages *      2 spans ~    0.5 MiB;    4.2 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    34 pages *      1 spans ~    0.3 MiB;    4.5 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    44 pages *      2 spans ~    0.7 MiB;    5.1 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    76 pages *      1 spans ~    0.6 MiB;    5.7 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
    78 pages *      1 spans ~    0.6 MiB;    6.3 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum
   108 pages *      1 spans ~    0.8 MiB;    7.2 MiB cum; unmapped:    0.0 MiB;    0.0 MiB cum

255 大 * 15 スパン ~ 706.3 MiB; 713.5 MiB 精液; マッピングされていない: 0.0 MiB; 0.0 MiB 兼

これが、どのスレッドキャッシュが使い果たされているかを示しているかどうかはよくわかりません。枯渇するスレッド キャッシュの分析は、GDB で実行されているプログラムを観察し、futex システム コールを呼び出す tcmalloc コードを解釈することに基づいています。

更新また、スレッド数が増減してもスレッドごとのキャッシュが変化しないことに気付きました。成長するのはページヒープです。

4

0 に答える 0