1e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#define JEMALLOC_STATS_C_ 2376b1529a383c39adf4674baf6db83a5e63f97acJason Evans#include "jemalloc/internal/jemalloc_internal.h" 3e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 43c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans#define CTL_GET(n, v, t) do { \ 53c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t sz = sizeof(t); \ 63c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctl(n, v, &sz, NULL, 0); \ 73c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans} while (0) 83c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 93c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans#define CTL_I_GET(n, v, t) do { \ 103c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t mib[6]; \ 113c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t miblen = sizeof(mib) / sizeof(size_t); \ 123c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t sz = sizeof(t); \ 133c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctlnametomib(n, mib, &miblen); \ 143c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans mib[2] = i; \ 153c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctlbymib(mib, miblen, v, &sz, NULL, 0); \ 163c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans} while (0) 173c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 183c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans#define CTL_J_GET(n, v, t) do { \ 193c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t mib[6]; \ 203c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t miblen = sizeof(mib) / sizeof(size_t); \ 213c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t sz = sizeof(t); \ 223c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctlnametomib(n, mib, &miblen); \ 233c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans mib[2] = j; \ 243c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctlbymib(mib, miblen, v, &sz, NULL, 0); \ 253c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans} while (0) 263c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 273c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans#define CTL_IJ_GET(n, v, t) do { \ 283c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t mib[6]; \ 293c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t miblen = sizeof(mib) / sizeof(size_t); \ 303c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t sz = sizeof(t); \ 313c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctlnametomib(n, mib, &miblen); \ 323c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans mib[2] = i; \ 333c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans mib[4] = j; \ 343c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctlbymib(mib, miblen, v, &sz, NULL, 0); \ 353c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans} while (0) 363c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 37e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/ 38e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/* Data. */ 39e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 40e476f8a161d445211fd6e54fe370275196e66bcbJason Evansbool opt_stats_print = false; 41e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 420657f12acd43eb2082a71230341449eca648bc9bJason Evanssize_t stats_cactive = 0; 430657f12acd43eb2082a71230341449eca648bc9bJason Evans 44e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/ 4500b5c9334701d10a798ae86cd142df882f28519cJason Evans/* Function prototypes for non-inline static functions. */ 4600b5c9334701d10a798ae86cd142df882f28519cJason Evans 47698805c5252465ddbdcf7048e5ccf16d02533877Jason Evansstatic void stats_arena_bins_print(void (*write_cb)(void *, const char *), 48698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans void *cbopaque, unsigned i); 49698805c5252465ddbdcf7048e5ccf16d02533877Jason Evansstatic void stats_arena_lruns_print(void (*write_cb)(void *, const char *), 50698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans void *cbopaque, unsigned i); 51698805c5252465ddbdcf7048e5ccf16d02533877Jason Evansstatic void stats_arena_print(void (*write_cb)(void *, const char *), 52eb2398106fd1b43989c12796eb706aea79b11859Jason Evans void *cbopaque, unsigned i, bool bins, bool large); 5300b5c9334701d10a798ae86cd142df882f28519cJason Evans 5400b5c9334701d10a798ae86cd142df882f28519cJason Evans/******************************************************************************/ 55e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 563c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evansstatic void 57698805c5252465ddbdcf7048e5ccf16d02533877Jason Evansstats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, 58698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans unsigned i) 593c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans{ 609d4d76874d888986e611bd9c9a0c905841956c4dJason Evans size_t page; 613c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans bool config_tcache; 623c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans unsigned nbins, j, gap_start; 633c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 649d4d76874d888986e611bd9c9a0c905841956c4dJason Evans CTL_GET("arenas.page", &page, size_t); 653c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 663c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("config.tcache", &config_tcache, bool); 673c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (config_tcache) { 68698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 69b172610317babc7f365584ddd7fdaf4eb8d9d04cJason Evans "bins: bin size regs pgs allocated nmalloc" 706b5974403b673bc8dd9993b67a1403481089d439Jason Evans " ndalloc nrequests nfills nflushes" 71746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans " newruns reruns curruns\n"); 723c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } else { 73698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 74b172610317babc7f365584ddd7fdaf4eb8d9d04cJason Evans "bins: bin size regs pgs allocated nmalloc" 75746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans " ndalloc newruns reruns curruns\n"); 763c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 773c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("arenas.nbins", &nbins, unsigned); 783c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans for (j = 0, gap_start = UINT_MAX; j < nbins; j++) { 793c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans uint64_t nruns; 803c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 813c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_IJ_GET("stats.arenas.0.bins.0.nruns", &nruns, uint64_t); 823c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (nruns == 0) { 833c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (gap_start == UINT_MAX) 843c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans gap_start = j; 853c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } else { 8686815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans size_t reg_size, run_size, allocated; 873c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans uint32_t nregs; 8886815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans uint64_t nmalloc, ndalloc, nrequests, nfills, nflushes; 8986815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans uint64_t reruns; 90746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans size_t curruns; 913c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 923c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (gap_start != UINT_MAX) { 933c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (j > gap_start + 1) { 943c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans /* Gap of more than one size class. */ 95698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 963c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans "[%u..%u]\n", gap_start, 973c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans j - 1); 983c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } else { 993c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans /* Gap of one size class. */ 100698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 1013c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans "[%u]\n", gap_start); 1023c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1033c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans gap_start = UINT_MAX; 1043c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1053c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_J_GET("arenas.bin.0.size", ®_size, size_t); 1063c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_J_GET("arenas.bin.0.nregs", &nregs, uint32_t); 1073c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_J_GET("arenas.bin.0.run_size", &run_size, size_t); 10886815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans CTL_IJ_GET("stats.arenas.0.bins.0.allocated", 10986815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans &allocated, size_t); 11086815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans CTL_IJ_GET("stats.arenas.0.bins.0.nmalloc", 11186815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans &nmalloc, uint64_t); 11286815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans CTL_IJ_GET("stats.arenas.0.bins.0.ndalloc", 11386815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans &ndalloc, uint64_t); 1143c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (config_tcache) { 11586815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans CTL_IJ_GET("stats.arenas.0.bins.0.nrequests", 11686815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans &nrequests, uint64_t); 1173c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_IJ_GET("stats.arenas.0.bins.0.nfills", 1183c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans &nfills, uint64_t); 1193c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_IJ_GET("stats.arenas.0.bins.0.nflushes", 1203c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans &nflushes, uint64_t); 1213c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1223c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_IJ_GET("stats.arenas.0.bins.0.nreruns", &reruns, 1233c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans uint64_t); 1243c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_IJ_GET("stats.arenas.0.bins.0.curruns", &curruns, 1253c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t); 1263c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (config_tcache) { 127698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 128b172610317babc7f365584ddd7fdaf4eb8d9d04cJason Evans "%13u %5zu %4u %3zu %12zu %12"PRIu64 1296b5974403b673bc8dd9993b67a1403481089d439Jason Evans " %12"PRIu64" %12"PRIu64" %12"PRIu64 1306b5974403b673bc8dd9993b67a1403481089d439Jason Evans " %12"PRIu64" %12"PRIu64" %12"PRIu64 131746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans " %12zu\n", 1329d4d76874d888986e611bd9c9a0c905841956c4dJason Evans j, reg_size, nregs, run_size / page, 13386815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans allocated, nmalloc, ndalloc, nrequests, 134746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans nfills, nflushes, nruns, reruns, curruns); 1353c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } else { 136698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 137b172610317babc7f365584ddd7fdaf4eb8d9d04cJason Evans "%13u %5zu %4u %3zu %12zu %12"PRIu64 1386b5974403b673bc8dd9993b67a1403481089d439Jason Evans " %12"PRIu64" %12"PRIu64" %12"PRIu64 139746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans " %12zu\n", 1409d4d76874d888986e611bd9c9a0c905841956c4dJason Evans j, reg_size, nregs, run_size / page, 14186815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans allocated, nmalloc, ndalloc, nruns, reruns, 142746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans curruns); 1433c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1443c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1453c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1463c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (gap_start != UINT_MAX) { 1473c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (j > gap_start + 1) { 1483c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans /* Gap of more than one size class. */ 149698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, "[%u..%u]\n", 1503c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans gap_start, j - 1); 1513c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } else { 1523c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans /* Gap of one size class. */ 153698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, "[%u]\n", gap_start); 1543c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1553c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1563c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans} 1573c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 1583c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evansstatic void 159698805c5252465ddbdcf7048e5ccf16d02533877Jason Evansstats_arena_lruns_print(void (*write_cb)(void *, const char *), void *cbopaque, 160698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans unsigned i) 1613c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans{ 1629d4d76874d888986e611bd9c9a0c905841956c4dJason Evans size_t page, nlruns, j; 1633c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans ssize_t gap_start; 1643c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 1659d4d76874d888986e611bd9c9a0c905841956c4dJason Evans CTL_GET("arenas.page", &page, size_t); 1663c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 167698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 168dafde14e08ddfda747aabb2045b350848b601b2eJason Evans "large: size pages nmalloc ndalloc nrequests" 169746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans " curruns\n"); 170c66aaf1476119c9df2b051a49d5f6bf290bb84dcJason Evans CTL_GET("arenas.nlruns", &nlruns, size_t); 1713c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans for (j = 0, gap_start = -1; j < nlruns; j++) { 172dafde14e08ddfda747aabb2045b350848b601b2eJason Evans uint64_t nmalloc, ndalloc, nrequests; 173746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans size_t run_size, curruns; 1743c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 175dafde14e08ddfda747aabb2045b350848b601b2eJason Evans CTL_IJ_GET("stats.arenas.0.lruns.0.nmalloc", &nmalloc, 176dafde14e08ddfda747aabb2045b350848b601b2eJason Evans uint64_t); 177dafde14e08ddfda747aabb2045b350848b601b2eJason Evans CTL_IJ_GET("stats.arenas.0.lruns.0.ndalloc", &ndalloc, 178dafde14e08ddfda747aabb2045b350848b601b2eJason Evans uint64_t); 1793c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_IJ_GET("stats.arenas.0.lruns.0.nrequests", &nrequests, 1803c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans uint64_t); 1813c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (nrequests == 0) { 1823c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (gap_start == -1) 1833c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans gap_start = j; 1843c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } else { 1853c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_J_GET("arenas.lrun.0.size", &run_size, size_t); 1863c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_IJ_GET("stats.arenas.0.lruns.0.curruns", &curruns, 1873c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t); 1883c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (gap_start != -1) { 189698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, "[%zu]\n", 1903c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans j - gap_start); 1913c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans gap_start = -1; 1923c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 193698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 194dafde14e08ddfda747aabb2045b350848b601b2eJason Evans "%13zu %5zu %12"PRIu64" %12"PRIu64" %12"PRIu64 195746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans " %12zu\n", 1969d4d76874d888986e611bd9c9a0c905841956c4dJason Evans run_size, run_size / page, nmalloc, ndalloc, 197746868929afae3e346b47d0fa8a78d7fb131d5a4Jason Evans nrequests, curruns); 1983c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 1993c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 2003c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (gap_start != -1) 201698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, "[%zu]\n", j - gap_start); 2023c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans} 2033c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 2043c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evansstatic void 205698805c5252465ddbdcf7048e5ccf16d02533877Jason Evansstats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, 206eb2398106fd1b43989c12796eb706aea79b11859Jason Evans unsigned i, bool bins, bool large) 2073c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans{ 208597632be188d2bcc135dad2145cc46ef44897aadJason Evans unsigned nthreads; 209609ae595f0358157b19311b0f9f9591db7cee705Jason Evans const char *dss; 2109d4d76874d888986e611bd9c9a0c905841956c4dJason Evans size_t page, pactive, pdirty, mapped; 2113c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans uint64_t npurge, nmadvise, purged; 2123c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t small_allocated; 21386815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans uint64_t small_nmalloc, small_ndalloc, small_nrequests; 2143c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t large_allocated; 215dafde14e08ddfda747aabb2045b350848b601b2eJason Evans uint64_t large_nmalloc, large_ndalloc, large_nrequests; 21612141150fdbda57651a53ae2fe0edaea4891d814Jason Evans size_t huge_allocated; 21712141150fdbda57651a53ae2fe0edaea4891d814Jason Evans uint64_t huge_nmalloc, huge_ndalloc, huge_nrequests; 2183c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 2199d4d76874d888986e611bd9c9a0c905841956c4dJason Evans CTL_GET("arenas.page", &page, size_t); 220c66aaf1476119c9df2b051a49d5f6bf290bb84dcJason Evans 221597632be188d2bcc135dad2145cc46ef44897aadJason Evans CTL_I_GET("stats.arenas.0.nthreads", &nthreads, unsigned); 222597632be188d2bcc135dad2145cc46ef44897aadJason Evans malloc_cprintf(write_cb, cbopaque, 223597632be188d2bcc135dad2145cc46ef44897aadJason Evans "assigned threads: %u\n", nthreads); 224609ae595f0358157b19311b0f9f9591db7cee705Jason Evans CTL_I_GET("stats.arenas.0.dss", &dss, const char *); 225609ae595f0358157b19311b0f9f9591db7cee705Jason Evans malloc_cprintf(write_cb, cbopaque, "dss allocation precedence: %s\n", 226609ae595f0358157b19311b0f9f9591db7cee705Jason Evans dss); 2273c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.pactive", &pactive, size_t); 2283c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.pdirty", &pdirty, size_t); 2293c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.npurge", &npurge, uint64_t); 2303c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.nmadvise", &nmadvise, uint64_t); 2313c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.purged", &purged, uint64_t); 232698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 2333c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans "dirty pages: %zu:%zu active:dirty, %"PRIu64" sweep%s," 2343c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans " %"PRIu64" madvise%s, %"PRIu64" purged\n", 2353c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans pactive, pdirty, npurge, npurge == 1 ? "" : "s", 2363c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans nmadvise, nmadvise == 1 ? "" : "s", purged); 2373c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 238698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 23986815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans " allocated nmalloc ndalloc nrequests\n"); 2403c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.small.allocated", &small_allocated, size_t); 2413c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.small.nmalloc", &small_nmalloc, uint64_t); 2423c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.small.ndalloc", &small_ndalloc, uint64_t); 24386815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans CTL_I_GET("stats.arenas.0.small.nrequests", &small_nrequests, uint64_t); 244698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 24586815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans "small: %12zu %12"PRIu64" %12"PRIu64" %12"PRIu64"\n", 24686815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans small_allocated, small_nmalloc, small_ndalloc, small_nrequests); 2473c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.large.allocated", &large_allocated, size_t); 2483c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.large.nmalloc", &large_nmalloc, uint64_t); 2493c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.large.ndalloc", &large_ndalloc, uint64_t); 250dafde14e08ddfda747aabb2045b350848b601b2eJason Evans CTL_I_GET("stats.arenas.0.large.nrequests", &large_nrequests, uint64_t); 251698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 25286815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans "large: %12zu %12"PRIu64" %12"PRIu64" %12"PRIu64"\n", 253dafde14e08ddfda747aabb2045b350848b601b2eJason Evans large_allocated, large_nmalloc, large_ndalloc, large_nrequests); 25412141150fdbda57651a53ae2fe0edaea4891d814Jason Evans CTL_I_GET("stats.arenas.0.huge.allocated", &huge_allocated, size_t); 25512141150fdbda57651a53ae2fe0edaea4891d814Jason Evans CTL_I_GET("stats.arenas.0.huge.nmalloc", &huge_nmalloc, uint64_t); 25612141150fdbda57651a53ae2fe0edaea4891d814Jason Evans CTL_I_GET("stats.arenas.0.huge.ndalloc", &huge_ndalloc, uint64_t); 25712141150fdbda57651a53ae2fe0edaea4891d814Jason Evans CTL_I_GET("stats.arenas.0.huge.nrequests", &huge_nrequests, uint64_t); 25812141150fdbda57651a53ae2fe0edaea4891d814Jason Evans malloc_cprintf(write_cb, cbopaque, 25912141150fdbda57651a53ae2fe0edaea4891d814Jason Evans "huge: %12zu %12"PRIu64" %12"PRIu64" %12"PRIu64"\n", 26012141150fdbda57651a53ae2fe0edaea4891d814Jason Evans huge_allocated, huge_nmalloc, huge_ndalloc, huge_nrequests); 261698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 26286815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans "total: %12zu %12"PRIu64" %12"PRIu64" %12"PRIu64"\n", 26312141150fdbda57651a53ae2fe0edaea4891d814Jason Evans small_allocated + large_allocated + huge_allocated, 26412141150fdbda57651a53ae2fe0edaea4891d814Jason Evans small_nmalloc + large_nmalloc + huge_nmalloc, 26512141150fdbda57651a53ae2fe0edaea4891d814Jason Evans small_ndalloc + large_ndalloc + huge_ndalloc, 26612141150fdbda57651a53ae2fe0edaea4891d814Jason Evans small_nrequests + large_nrequests + huge_nrequests); 2679d4d76874d888986e611bd9c9a0c905841956c4dJason Evans malloc_cprintf(write_cb, cbopaque, "active: %12zu\n", pactive * page); 2683c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_I_GET("stats.arenas.0.mapped", &mapped, size_t); 269698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, "mapped: %12zu\n", mapped); 2703c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 271eb2398106fd1b43989c12796eb706aea79b11859Jason Evans if (bins) 272eb2398106fd1b43989c12796eb706aea79b11859Jason Evans stats_arena_bins_print(write_cb, cbopaque, i); 273eb2398106fd1b43989c12796eb706aea79b11859Jason Evans if (large) 274eb2398106fd1b43989c12796eb706aea79b11859Jason Evans stats_arena_lruns_print(write_cb, cbopaque, i); 2753c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans} 2763c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 277e476f8a161d445211fd6e54fe370275196e66bcbJason Evansvoid 278698805c5252465ddbdcf7048e5ccf16d02533877Jason Evansstats_print(void (*write_cb)(void *, const char *), void *cbopaque, 279698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans const char *opts) 280e476f8a161d445211fd6e54fe370275196e66bcbJason Evans{ 281e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans int err; 2823c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans uint64_t epoch; 2833c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t u64sz; 284e476f8a161d445211fd6e54fe370275196e66bcbJason Evans bool general = true; 285b34e8684ec025aa780997c11f847c19fb269755bJason Evans bool merged = true; 286b34e8684ec025aa780997c11f847c19fb269755bJason Evans bool unmerged = true; 287e476f8a161d445211fd6e54fe370275196e66bcbJason Evans bool bins = true; 288e476f8a161d445211fd6e54fe370275196e66bcbJason Evans bool large = true; 289e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 290e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans /* 291e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans * Refresh stats, in case mallctl() was called by the application. 292e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans * 293e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans * Check for OOM here, since refreshing the ctl cache can trigger 294e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans * allocation. In practice, none of the subsequent mallctl()-related 295e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans * calls in this function will cause OOM if this one succeeds. 296e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans * */ 2973c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans epoch = 1; 2983c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans u64sz = sizeof(uint64_t); 2990a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans err = je_mallctl("epoch", &epoch, &u64sz, &epoch, sizeof(uint64_t)); 300e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans if (err != 0) { 301e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans if (err == EAGAIN) { 302e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans malloc_write("<jemalloc>: Memory allocation failure in " 303e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans "mallctl(\"epoch\", ...)\n"); 304e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans return; 305e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans } 306e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans malloc_write("<jemalloc>: Failure in mallctl(\"epoch\", " 307e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans "...)\n"); 308e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans abort(); 309e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans } 3103c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 311e476f8a161d445211fd6e54fe370275196e66bcbJason Evans if (opts != NULL) { 312e476f8a161d445211fd6e54fe370275196e66bcbJason Evans unsigned i; 313e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 314e476f8a161d445211fd6e54fe370275196e66bcbJason Evans for (i = 0; opts[i] != '\0'; i++) { 315e476f8a161d445211fd6e54fe370275196e66bcbJason Evans switch (opts[i]) { 316d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans case 'g': 317d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans general = false; 318d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans break; 319d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans case 'm': 320d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans merged = false; 321d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans break; 322d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans case 'a': 323d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans unmerged = false; 324d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans break; 325d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans case 'b': 326d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans bins = false; 327d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans break; 328d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans case 'l': 329d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans large = false; 330d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans break; 331d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans default:; 332e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 333e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 334e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 335e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 3363597e91482c804592105ea078a0825fdb7c68dffMike Hommey malloc_cprintf(write_cb, cbopaque, 3373597e91482c804592105ea078a0825fdb7c68dffMike Hommey "___ Begin jemalloc statistics ___\n"); 338e476f8a161d445211fd6e54fe370275196e66bcbJason Evans if (general) { 3393c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans int err; 3403c2d9c899c1fdff411e3db2ee2d102373f121f9fJason Evans const char *cpv; 3413c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans bool bv; 3423c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans unsigned uv; 3433c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans ssize_t ssv; 344e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans size_t sv, bsz, ssz, sssz, cpsz; 3453c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 3463c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans bsz = sizeof(bool); 3473c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans ssz = sizeof(size_t); 348e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans sssz = sizeof(ssize_t); 349e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans cpsz = sizeof(const char *); 3503c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 3513c2d9c899c1fdff411e3db2ee2d102373f121f9fJason Evans CTL_GET("version", &cpv, const char *); 352d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, "Version: %s\n", cpv); 3533c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("config.debug", &bv, bool); 354d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, "Assertions %s\n", 355d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans bv ? "enabled" : "disabled"); 3563c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 357a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define OPT_WRITE_BOOL(n) \ 3580a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans if ((err = je_mallctl("opt."#n, &bv, &bsz, NULL, 0)) \ 3590a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans == 0) { \ 360d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, \ 361d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans " opt."#n": %s\n", bv ? "true" : "false"); \ 362e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans } 363a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define OPT_WRITE_SIZE_T(n) \ 3640a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans if ((err = je_mallctl("opt."#n, &sv, &ssz, NULL, 0)) \ 3650a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans == 0) { \ 366d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, \ 367d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans " opt."#n": %zu\n", sv); \ 368e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans } 369a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define OPT_WRITE_SSIZE_T(n) \ 3700a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans if ((err = je_mallctl("opt."#n, &ssv, &sssz, NULL, 0)) \ 3710a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans == 0) { \ 372d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, \ 373d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans " opt."#n": %zd\n", ssv); \ 374e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans } 375a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define OPT_WRITE_CHAR_P(n) \ 3760a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans if ((err = je_mallctl("opt."#n, &cpv, &cpsz, NULL, 0)) \ 3770a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans == 0) { \ 378d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, \ 379d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans " opt."#n": \"%s\"\n", cpv); \ 380e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans } 381e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans 3823597e91482c804592105ea078a0825fdb7c68dffMike Hommey malloc_cprintf(write_cb, cbopaque, 3833597e91482c804592105ea078a0825fdb7c68dffMike Hommey "Run-time option settings:\n"); 384e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(abort) 385e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_SIZE_T(lg_chunk) 386609ae595f0358157b19311b0f9f9591db7cee705Jason Evans OPT_WRITE_CHAR_P(dss) 387e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_SIZE_T(narenas) 388e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_SSIZE_T(lg_dirty_mult) 389e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(stats_print) 390e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(junk) 391122449b073bcbaa504c4f592ea2d733503c272d2Jason Evans OPT_WRITE_SIZE_T(quarantine) 392122449b073bcbaa504c4f592ea2d733503c272d2Jason Evans OPT_WRITE_BOOL(redzone) 393e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(zero) 394b147611b5253921a873191bb0589d3b18f613946Jason Evans OPT_WRITE_BOOL(utrace) 395122449b073bcbaa504c4f592ea2d733503c272d2Jason Evans OPT_WRITE_BOOL(valgrind) 396e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(xmalloc) 397e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(tcache) 398e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_SSIZE_T(lg_tcache_max) 399e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(prof) 400e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_CHAR_P(prof_prefix) 401e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(prof_active) 402e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_SSIZE_T(lg_prof_sample) 403e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(prof_accum) 404e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_SSIZE_T(lg_prof_interval) 405e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(prof_gdump) 4060b25fe79aaf8840a5acda7e3160a053d42349872Jason Evans OPT_WRITE_BOOL(prof_final) 407e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans OPT_WRITE_BOOL(prof_leak) 408e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans 409e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans#undef OPT_WRITE_BOOL 410e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans#undef OPT_WRITE_SIZE_T 411e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans#undef OPT_WRITE_SSIZE_T 412e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans#undef OPT_WRITE_CHAR_P 413e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 414d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, "CPUs: %u\n", ncpus); 4153c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 4163c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("arenas.narenas", &uv, unsigned); 417609ae595f0358157b19311b0f9f9591db7cee705Jason Evans malloc_cprintf(write_cb, cbopaque, "Arenas: %u\n", uv); 4183c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 419d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, "Pointer size: %zu\n", 420d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans sizeof(void *)); 4213c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 4223c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("arenas.quantum", &sv, size_t); 423d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, "Quantum size: %zu\n", sv); 4243c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 425ae4c7b4b4092906c641d69b4bf9fcb4a7d50790dJason Evans CTL_GET("arenas.page", &sv, size_t); 426ae4c7b4b4092906c641d69b4bf9fcb4a7d50790dJason Evans malloc_cprintf(write_cb, cbopaque, "Page size: %zu\n", sv); 427ae4c7b4b4092906c641d69b4bf9fcb4a7d50790dJason Evans 4283c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("opt.lg_dirty_mult", &ssv, ssize_t); 4293c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (ssv >= 0) { 430d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, 431d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "Min active:dirty page ratio per arena: %u:1\n", 432d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans (1U << ssv)); 433e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } else { 4343597e91482c804592105ea078a0825fdb7c68dffMike Hommey malloc_cprintf(write_cb, cbopaque, 435698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans "Min active:dirty page ratio per arena: N/A\n"); 436e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 4370a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans if ((err = je_mallctl("arenas.tcache_max", &sv, &ssz, NULL, 0)) 4380a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans == 0) { 439d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, 440d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "Maximum thread-cached size class: %zu\n", sv); 441dafde14e08ddfda747aabb2045b350848b601b2eJason Evans } 4420a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans if ((err = je_mallctl("opt.prof", &bv, &bsz, NULL, 0)) == 0 && 4430a5489e37da88a1a50fbf8552e0d3a7f8fd93ffcJason Evans bv) { 444992242c545cdd9e6098d16e3426fce1844b0e292Jason Evans CTL_GET("opt.lg_prof_sample", &sv, size_t); 445d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, 446d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "Average profile sample interval: %"PRIu64 447d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans " (2^%zu)\n", (((uint64_t)1U) << sv), sv); 448b9477e782b07afa38c4b1dc0688e053be8a84dd8Jason Evans 449a02fc08ec9dd8479a6430155b6a433da09f6ff10Jason Evans CTL_GET("opt.lg_prof_interval", &ssv, ssize_t); 450a02fc08ec9dd8479a6430155b6a433da09f6ff10Jason Evans if (ssv >= 0) { 451d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, 452d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "Average profile dump interval: %"PRIu64 453d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans " (2^%zd)\n", 454d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans (((uint64_t)1U) << ssv), ssv); 455d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } else { 4563597e91482c804592105ea078a0825fdb7c68dffMike Hommey malloc_cprintf(write_cb, cbopaque, 457d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans "Average profile dump interval: N/A\n"); 458d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans } 459d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans } 4603c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("opt.lg_chunk", &sv, size_t); 461d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans malloc_cprintf(write_cb, cbopaque, "Chunk size: %zu (2^%zu)\n", 462d81e4bdd5c991bd5642c8b859ef1f752b51cd9beJason Evans (ZU(1) << sv), sv); 463e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 464e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 4657372b15a31c63ac5cb9ed8aeabc2a0a3c005e8bfJason Evans if (config_stats) { 4660657f12acd43eb2082a71230341449eca648bc9bJason Evans size_t *cactive; 467c66aaf1476119c9df2b051a49d5f6bf290bb84dcJason Evans size_t allocated, active, mapped; 4684162627757889ea999264c2ddbc3c354768774e2Jason Evans size_t chunks_current, chunks_high; 4693c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans uint64_t chunks_total; 470e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 4710657f12acd43eb2082a71230341449eca648bc9bJason Evans CTL_GET("stats.cactive", &cactive, size_t *); 4723c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("stats.allocated", &allocated, size_t); 473c66aaf1476119c9df2b051a49d5f6bf290bb84dcJason Evans CTL_GET("stats.active", &active, size_t); 4743c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("stats.mapped", &mapped, size_t); 475698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 4760657f12acd43eb2082a71230341449eca648bc9bJason Evans "Allocated: %zu, active: %zu, mapped: %zu\n", 4770657f12acd43eb2082a71230341449eca648bc9bJason Evans allocated, active, mapped); 4780657f12acd43eb2082a71230341449eca648bc9bJason Evans malloc_cprintf(write_cb, cbopaque, 4790657f12acd43eb2082a71230341449eca648bc9bJason Evans "Current active ceiling: %zu\n", atomic_read_z(cactive)); 480e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 481e476f8a161d445211fd6e54fe370275196e66bcbJason Evans /* Print chunk stats. */ 4823c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("stats.chunks.total", &chunks_total, uint64_t); 4833c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("stats.chunks.high", &chunks_high, size_t); 4843c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("stats.chunks.current", &chunks_current, size_t); 4854162627757889ea999264c2ddbc3c354768774e2Jason Evans malloc_cprintf(write_cb, cbopaque, "chunks: nchunks " 4864162627757889ea999264c2ddbc3c354768774e2Jason Evans "highchunks curchunks\n"); 487609ae595f0358157b19311b0f9f9591db7cee705Jason Evans malloc_cprintf(write_cb, cbopaque, 488609ae595f0358157b19311b0f9f9591db7cee705Jason Evans " %13"PRIu64" %12zu %12zu\n", 4894162627757889ea999264c2ddbc3c354768774e2Jason Evans chunks_total, chunks_high, chunks_current); 490e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 491b34e8684ec025aa780997c11f847c19fb269755bJason Evans if (merged) { 4923c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans unsigned narenas; 4933c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 4943c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("arenas.narenas", &narenas, unsigned); 4953c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans { 4968b49971d0ce0819af78aa2a278c26ecb298ee134Mike Hommey VARIABLE_ARRAY(bool, initialized, narenas); 4973c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t isz; 4983c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans unsigned i, ninitialized; 4993c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 500c584fc75bb57ba275605c66522cbae45098d56f0Mike Hommey isz = sizeof(bool) * narenas; 5013c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctl("arenas.initialized", initialized, 5023c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans &isz, NULL, 0); 5033c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans for (i = ninitialized = 0; i < narenas; i++) { 5043c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (initialized[i]) 5053c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans ninitialized++; 506b34e8684ec025aa780997c11f847c19fb269755bJason Evans } 50768ddb6736db319f6714547f2828777399595657eJason Evans 508334cc021422869329f08349e088e7f491318e087Jason Evans if (ninitialized > 1 || unmerged == false) { 5093c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans /* Print merged arena stats. */ 510698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans malloc_cprintf(write_cb, cbopaque, 51113668262d17fb5950e2441bc9d56a15db9c93877Jason Evans "\nMerged arenas stats:\n"); 512698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans stats_arena_print(write_cb, cbopaque, 513eb2398106fd1b43989c12796eb706aea79b11859Jason Evans narenas, bins, large); 5143c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 51568ddb6736db319f6714547f2828777399595657eJason Evans } 516b34e8684ec025aa780997c11f847c19fb269755bJason Evans } 517b34e8684ec025aa780997c11f847c19fb269755bJason Evans 518b34e8684ec025aa780997c11f847c19fb269755bJason Evans if (unmerged) { 5193c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans unsigned narenas; 5203c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 521b34e8684ec025aa780997c11f847c19fb269755bJason Evans /* Print stats for each arena. */ 5223c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 5233c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans CTL_GET("arenas.narenas", &narenas, unsigned); 5243c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans { 5258b49971d0ce0819af78aa2a278c26ecb298ee134Mike Hommey VARIABLE_ARRAY(bool, initialized, narenas); 5263c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans size_t isz; 5273c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans unsigned i; 5283c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 529c584fc75bb57ba275605c66522cbae45098d56f0Mike Hommey isz = sizeof(bool) * narenas; 5303c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans xmallctl("arenas.initialized", initialized, 5313c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans &isz, NULL, 0); 5323c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans 5333c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans for (i = 0; i < narenas; i++) { 5343c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans if (initialized[i]) { 535dafde14e08ddfda747aabb2045b350848b601b2eJason Evans malloc_cprintf(write_cb, 536dafde14e08ddfda747aabb2045b350848b601b2eJason Evans cbopaque, 5373c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans "\narenas[%u]:\n", i); 538698805c5252465ddbdcf7048e5ccf16d02533877Jason Evans stats_arena_print(write_cb, 539eb2398106fd1b43989c12796eb706aea79b11859Jason Evans cbopaque, i, bins, large); 5403c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans } 541b34e8684ec025aa780997c11f847c19fb269755bJason Evans } 542e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 543e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 544e476f8a161d445211fd6e54fe370275196e66bcbJason Evans } 5453597e91482c804592105ea078a0825fdb7c68dffMike Hommey malloc_cprintf(write_cb, cbopaque, "--- End jemalloc statistics ---\n"); 546e476f8a161d445211fd6e54fe370275196e66bcbJason Evans} 547