Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 1 | #define JEMALLOC_STATS_C_ |
Jason Evans | 376b152 | 2010-02-11 14:45:59 -0800 | [diff] [blame] | 2 | #include "jemalloc/internal/jemalloc_internal.h" |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 3 | |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 4 | #define CTL_GET(n, v, t) do { \ |
| 5 | size_t sz = sizeof(t); \ |
| 6 | xmallctl(n, v, &sz, NULL, 0); \ |
| 7 | } while (0) |
| 8 | |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 9 | #define CTL_M2_GET(n, i, v, t) do { \ |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 10 | size_t mib[6]; \ |
| 11 | size_t miblen = sizeof(mib) / sizeof(size_t); \ |
| 12 | size_t sz = sizeof(t); \ |
| 13 | xmallctlnametomib(n, mib, &miblen); \ |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 14 | mib[2] = (i); \ |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 15 | xmallctlbymib(mib, miblen, v, &sz, NULL, 0); \ |
| 16 | } while (0) |
| 17 | |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 18 | #define CTL_M2_M4_GET(n, i, j, v, t) do { \ |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 19 | size_t mib[6]; \ |
| 20 | size_t miblen = sizeof(mib) / sizeof(size_t); \ |
| 21 | size_t sz = sizeof(t); \ |
| 22 | xmallctlnametomib(n, mib, &miblen); \ |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 23 | mib[2] = (i); \ |
| 24 | mib[4] = (j); \ |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 25 | xmallctlbymib(mib, miblen, v, &sz, NULL, 0); \ |
| 26 | } while (0) |
| 27 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 28 | /******************************************************************************/ |
| 29 | /* Data. */ |
| 30 | |
| 31 | bool opt_stats_print = false; |
| 32 | |
Jason Evans | 0657f12 | 2011-03-18 17:56:14 -0700 | [diff] [blame] | 33 | size_t stats_cactive = 0; |
Jason Evans | 0657f12 | 2011-03-18 17:56:14 -0700 | [diff] [blame] | 34 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 35 | /******************************************************************************/ |
Jason Evans | 00b5c93 | 2010-01-17 15:49:25 -0800 | [diff] [blame] | 36 | /* Function prototypes for non-inline static functions. */ |
| 37 | |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 38 | static void stats_arena_bins_print(void (*write_cb)(void *, const char *), |
| 39 | void *cbopaque, unsigned i); |
| 40 | static void stats_arena_lruns_print(void (*write_cb)(void *, const char *), |
| 41 | void *cbopaque, unsigned i); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 42 | static void stats_arena_hchunks_print( |
| 43 | void (*write_cb)(void *, const char *), void *cbopaque, unsigned i); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 44 | static void stats_arena_print(void (*write_cb)(void *, const char *), |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 45 | void *cbopaque, unsigned i, bool bins, bool large, bool huge); |
Jason Evans | 00b5c93 | 2010-01-17 15:49:25 -0800 | [diff] [blame] | 46 | |
| 47 | /******************************************************************************/ |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 48 | |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 49 | static void |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 50 | stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque, |
| 51 | unsigned i) |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 52 | { |
Jason Evans | 9d4d768 | 2012-04-02 07:15:42 -0700 | [diff] [blame] | 53 | size_t page; |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 54 | bool config_tcache, in_gap; |
| 55 | unsigned nbins, j; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 56 | |
Jason Evans | 9d4d768 | 2012-04-02 07:15:42 -0700 | [diff] [blame] | 57 | CTL_GET("arenas.page", &page, size_t); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 58 | |
| 59 | CTL_GET("config.tcache", &config_tcache, bool); |
| 60 | if (config_tcache) { |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 61 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 62 | "bins: size ind allocated nmalloc" |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 63 | " ndalloc nrequests curregs curruns regs" |
| 64 | " pgs util nfills nflushes newruns" |
| 65 | " reruns\n"); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 66 | } else { |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 67 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 68 | "bins: size ind allocated nmalloc" |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 69 | " ndalloc nrequests curregs curruns regs" |
| 70 | " pgs util newruns reruns\n"); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 71 | } |
| 72 | CTL_GET("arenas.nbins", &nbins, unsigned); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 73 | for (j = 0, in_gap = false; j < nbins; j++) { |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 74 | uint64_t nruns; |
| 75 | |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 76 | CTL_M2_M4_GET("stats.arenas.0.bins.0.nruns", i, j, &nruns, |
| 77 | uint64_t); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 78 | if (nruns == 0) |
| 79 | in_gap = true; |
| 80 | else { |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 81 | size_t reg_size, run_size, curregs, availregs, milli; |
| 82 | size_t curruns; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 83 | uint32_t nregs; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 84 | uint64_t nmalloc, ndalloc, nrequests, nfills, nflushes; |
| 85 | uint64_t reruns; |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 86 | char util[6]; /* "x.yyy". */ |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 87 | |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 88 | if (in_gap) { |
| 89 | malloc_cprintf(write_cb, cbopaque, |
| 90 | " ---\n"); |
| 91 | in_gap = false; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 92 | } |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 93 | CTL_M2_GET("arenas.bin.0.size", j, ®_size, size_t); |
| 94 | CTL_M2_GET("arenas.bin.0.nregs", j, &nregs, uint32_t); |
| 95 | CTL_M2_GET("arenas.bin.0.run_size", j, &run_size, |
| 96 | size_t); |
| 97 | CTL_M2_M4_GET("stats.arenas.0.bins.0.nmalloc", i, j, |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 98 | &nmalloc, uint64_t); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 99 | CTL_M2_M4_GET("stats.arenas.0.bins.0.ndalloc", i, j, |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 100 | &ndalloc, uint64_t); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 101 | CTL_M2_M4_GET("stats.arenas.0.bins.0.curregs", i, j, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 102 | &curregs, size_t); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 103 | CTL_M2_M4_GET("stats.arenas.0.bins.0.nrequests", i, j, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 104 | &nrequests, uint64_t); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 105 | if (config_tcache) { |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 106 | CTL_M2_M4_GET("stats.arenas.0.bins.0.nfills", i, |
| 107 | j, &nfills, uint64_t); |
| 108 | CTL_M2_M4_GET("stats.arenas.0.bins.0.nflushes", |
| 109 | i, j, &nflushes, uint64_t); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 110 | } |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 111 | CTL_M2_M4_GET("stats.arenas.0.bins.0.nreruns", i, j, |
| 112 | &reruns, uint64_t); |
| 113 | CTL_M2_M4_GET("stats.arenas.0.bins.0.curruns", i, j, |
| 114 | &curruns, size_t); |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 115 | |
| 116 | availregs = nregs * curruns; |
| 117 | milli = (availregs != 0) ? (1000 * curregs) / availregs |
| 118 | : 1000; |
| 119 | assert(milli <= 1000); |
| 120 | if (milli < 10) { |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 121 | malloc_snprintf(util, sizeof(util), |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 122 | "0.00%zu", milli); |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 123 | } else if (milli < 100) { |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 124 | malloc_snprintf(util, sizeof(util), "0.0%zu", |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 125 | milli); |
| 126 | } else if (milli < 1000) { |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 127 | malloc_snprintf(util, sizeof(util), "0.%zu", |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 128 | milli); |
| 129 | } else |
| 130 | malloc_snprintf(util, sizeof(util), "1"); |
| 131 | |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 132 | if (config_tcache) { |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 133 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 134 | "%20zu %3u %12zu %12"FMTu64 |
| 135 | " %12"FMTu64" %12"FMTu64" %12zu" |
| 136 | " %12zu %4u %3zu %-5s %12"FMTu64 |
| 137 | " %12"FMTu64" %12"FMTu64" %12"FMTu64"\n", |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 138 | reg_size, j, curregs * reg_size, nmalloc, |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 139 | ndalloc, nrequests, curregs, curruns, nregs, |
| 140 | run_size / page, util, nfills, nflushes, |
| 141 | nruns, reruns); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 142 | } else { |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 143 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 144 | "%20zu %3u %12zu %12"FMTu64 |
| 145 | " %12"FMTu64" %12"FMTu64" %12zu" |
| 146 | " %12zu %4u %3zu %-5s %12"FMTu64 |
| 147 | " %12"FMTu64"\n", |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 148 | reg_size, j, curregs * reg_size, nmalloc, |
Jason Evans | bf8d6a1 | 2014-10-15 16:18:42 -0700 | [diff] [blame] | 149 | ndalloc, nrequests, curregs, curruns, nregs, |
| 150 | run_size / page, util, nruns, reruns); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 151 | } |
| 152 | } |
| 153 | } |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 154 | if (in_gap) { |
| 155 | malloc_cprintf(write_cb, cbopaque, |
| 156 | " ---\n"); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 157 | } |
| 158 | } |
| 159 | |
| 160 | static void |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 161 | stats_arena_lruns_print(void (*write_cb)(void *, const char *), void *cbopaque, |
| 162 | unsigned i) |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 163 | { |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 164 | unsigned nbins, nlruns, j; |
| 165 | bool in_gap; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 166 | |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 167 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 168 | "large: size ind allocated nmalloc ndalloc" |
| 169 | " nrequests curruns\n"); |
| 170 | CTL_GET("arenas.nbins", &nbins, unsigned); |
| 171 | CTL_GET("arenas.nlruns", &nlruns, unsigned); |
| 172 | for (j = 0, in_gap = false; j < nlruns; j++) { |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 173 | uint64_t nmalloc, ndalloc, nrequests; |
Jason Evans | 7468689 | 2012-02-13 15:18:19 -0800 | [diff] [blame] | 174 | size_t run_size, curruns; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 175 | |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 176 | CTL_M2_M4_GET("stats.arenas.0.lruns.0.nmalloc", i, j, &nmalloc, |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 177 | uint64_t); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 178 | CTL_M2_M4_GET("stats.arenas.0.lruns.0.ndalloc", i, j, &ndalloc, |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 179 | uint64_t); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 180 | CTL_M2_M4_GET("stats.arenas.0.lruns.0.nrequests", i, j, |
| 181 | &nrequests, uint64_t); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 182 | if (nrequests == 0) |
| 183 | in_gap = true; |
| 184 | else { |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 185 | CTL_M2_GET("arenas.lrun.0.size", j, &run_size, size_t); |
| 186 | CTL_M2_M4_GET("stats.arenas.0.lruns.0.curruns", i, j, |
| 187 | &curruns, size_t); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 188 | if (in_gap) { |
| 189 | malloc_cprintf(write_cb, cbopaque, |
| 190 | " ---\n"); |
| 191 | in_gap = false; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 192 | } |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 193 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 194 | "%20zu %3u %12zu %12"FMTu64" %12"FMTu64 |
| 195 | " %12"FMTu64" %12zu\n", |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 196 | run_size, nbins + j, curruns * run_size, nmalloc, |
| 197 | ndalloc, nrequests, curruns); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 198 | } |
| 199 | } |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 200 | if (in_gap) { |
| 201 | malloc_cprintf(write_cb, cbopaque, |
| 202 | " ---\n"); |
| 203 | } |
| 204 | } |
| 205 | |
| 206 | static void |
| 207 | stats_arena_hchunks_print(void (*write_cb)(void *, const char *), |
| 208 | void *cbopaque, unsigned i) |
| 209 | { |
| 210 | unsigned nbins, nlruns, nhchunks, j; |
| 211 | bool in_gap; |
| 212 | |
| 213 | malloc_cprintf(write_cb, cbopaque, |
| 214 | "huge: size ind allocated nmalloc ndalloc" |
| 215 | " nrequests curhchunks\n"); |
| 216 | CTL_GET("arenas.nbins", &nbins, unsigned); |
| 217 | CTL_GET("arenas.nlruns", &nlruns, unsigned); |
| 218 | CTL_GET("arenas.nhchunks", &nhchunks, unsigned); |
| 219 | for (j = 0, in_gap = false; j < nhchunks; j++) { |
| 220 | uint64_t nmalloc, ndalloc, nrequests; |
| 221 | size_t hchunk_size, curhchunks; |
| 222 | |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 223 | CTL_M2_M4_GET("stats.arenas.0.hchunks.0.nmalloc", i, j, |
| 224 | &nmalloc, uint64_t); |
| 225 | CTL_M2_M4_GET("stats.arenas.0.hchunks.0.ndalloc", i, j, |
| 226 | &ndalloc, uint64_t); |
| 227 | CTL_M2_M4_GET("stats.arenas.0.hchunks.0.nrequests", i, j, |
| 228 | &nrequests, uint64_t); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 229 | if (nrequests == 0) |
| 230 | in_gap = true; |
| 231 | else { |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 232 | CTL_M2_GET("arenas.hchunk.0.size", j, &hchunk_size, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 233 | size_t); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 234 | CTL_M2_M4_GET("stats.arenas.0.hchunks.0.curhchunks", i, |
| 235 | j, &curhchunks, size_t); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 236 | if (in_gap) { |
| 237 | malloc_cprintf(write_cb, cbopaque, |
| 238 | " ---\n"); |
| 239 | in_gap = false; |
| 240 | } |
| 241 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 242 | "%20zu %3u %12zu %12"FMTu64" %12"FMTu64 |
| 243 | " %12"FMTu64" %12zu\n", |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 244 | hchunk_size, nbins + nlruns + j, |
| 245 | curhchunks * hchunk_size, nmalloc, ndalloc, |
| 246 | nrequests, curhchunks); |
| 247 | } |
| 248 | } |
| 249 | if (in_gap) { |
| 250 | malloc_cprintf(write_cb, cbopaque, |
| 251 | " ---\n"); |
| 252 | } |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 253 | } |
| 254 | |
| 255 | static void |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 256 | stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 257 | unsigned i, bool bins, bool large, bool huge) |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 258 | { |
Jason Evans | 597632b | 2011-03-18 13:41:33 -0700 | [diff] [blame] | 259 | unsigned nthreads; |
Jason Evans | 609ae59 | 2012-10-11 13:53:15 -0700 | [diff] [blame] | 260 | const char *dss; |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 261 | ssize_t lg_dirty_mult, decay_time; |
Jason Evans | 9d4d768 | 2012-04-02 07:15:42 -0700 | [diff] [blame] | 262 | size_t page, pactive, pdirty, mapped; |
Jason Evans | 4581b97 | 2014-11-27 17:22:36 -0200 | [diff] [blame] | 263 | size_t metadata_mapped, metadata_allocated; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 264 | uint64_t npurge, nmadvise, purged; |
| 265 | size_t small_allocated; |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 266 | uint64_t small_nmalloc, small_ndalloc, small_nrequests; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 267 | size_t large_allocated; |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 268 | uint64_t large_nmalloc, large_ndalloc, large_nrequests; |
Jason Evans | e2deab7 | 2014-05-15 22:22:27 -0700 | [diff] [blame] | 269 | size_t huge_allocated; |
| 270 | uint64_t huge_nmalloc, huge_ndalloc, huge_nrequests; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 271 | |
Jason Evans | 9d4d768 | 2012-04-02 07:15:42 -0700 | [diff] [blame] | 272 | CTL_GET("arenas.page", &page, size_t); |
Jason Evans | c66aaf1 | 2010-01-29 11:24:19 -0800 | [diff] [blame] | 273 | |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 274 | CTL_M2_GET("stats.arenas.0.nthreads", i, &nthreads, unsigned); |
Jason Evans | 597632b | 2011-03-18 13:41:33 -0700 | [diff] [blame] | 275 | malloc_cprintf(write_cb, cbopaque, |
| 276 | "assigned threads: %u\n", nthreads); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 277 | CTL_M2_GET("stats.arenas.0.dss", i, &dss, const char *); |
Jason Evans | 609ae59 | 2012-10-11 13:53:15 -0700 | [diff] [blame] | 278 | malloc_cprintf(write_cb, cbopaque, "dss allocation precedence: %s\n", |
| 279 | dss); |
Jason Evans | 562d266 | 2015-03-24 16:36:12 -0700 | [diff] [blame] | 280 | CTL_M2_GET("stats.arenas.0.lg_dirty_mult", i, &lg_dirty_mult, ssize_t); |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 281 | if (opt_purge == purge_mode_ratio) { |
| 282 | if (lg_dirty_mult >= 0) { |
| 283 | malloc_cprintf(write_cb, cbopaque, |
| 284 | "min active:dirty page ratio: %u:1\n", |
| 285 | (1U << lg_dirty_mult)); |
| 286 | } else { |
| 287 | malloc_cprintf(write_cb, cbopaque, |
| 288 | "min active:dirty page ratio: N/A\n"); |
| 289 | } |
| 290 | } |
| 291 | CTL_M2_GET("stats.arenas.0.decay_time", i, &decay_time, ssize_t); |
| 292 | if (opt_purge == purge_mode_decay) { |
| 293 | if (decay_time >= 0) { |
| 294 | malloc_cprintf(write_cb, cbopaque, "decay time: %zd\n", |
| 295 | decay_time); |
| 296 | } else |
| 297 | malloc_cprintf(write_cb, cbopaque, "decay time: N/A\n"); |
Jason Evans | 8d6a3e8 | 2015-03-18 18:55:33 -0700 | [diff] [blame] | 298 | } |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 299 | CTL_M2_GET("stats.arenas.0.pactive", i, &pactive, size_t); |
| 300 | CTL_M2_GET("stats.arenas.0.pdirty", i, &pdirty, size_t); |
| 301 | CTL_M2_GET("stats.arenas.0.npurge", i, &npurge, uint64_t); |
| 302 | CTL_M2_GET("stats.arenas.0.nmadvise", i, &nmadvise, uint64_t); |
| 303 | CTL_M2_GET("stats.arenas.0.purged", i, &purged, uint64_t); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 304 | malloc_cprintf(write_cb, cbopaque, |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 305 | "purging: dirty: %zu, sweeps: %"FMTu64", madvises: %"FMTu64", " |
| 306 | "purged: %"FMTu64"\n", pdirty, npurge, nmadvise, purged); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 307 | |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 308 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 309 | " allocated nmalloc ndalloc" |
| 310 | " nrequests\n"); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 311 | CTL_M2_GET("stats.arenas.0.small.allocated", i, &small_allocated, |
| 312 | size_t); |
| 313 | CTL_M2_GET("stats.arenas.0.small.nmalloc", i, &small_nmalloc, uint64_t); |
| 314 | CTL_M2_GET("stats.arenas.0.small.ndalloc", i, &small_ndalloc, uint64_t); |
| 315 | CTL_M2_GET("stats.arenas.0.small.nrequests", i, &small_nrequests, |
| 316 | uint64_t); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 317 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 318 | "small: %12zu %12"FMTu64" %12"FMTu64 |
| 319 | " %12"FMTu64"\n", |
Jason Evans | 86815df | 2010-03-13 20:32:56 -0800 | [diff] [blame] | 320 | small_allocated, small_nmalloc, small_ndalloc, small_nrequests); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 321 | CTL_M2_GET("stats.arenas.0.large.allocated", i, &large_allocated, |
| 322 | size_t); |
| 323 | CTL_M2_GET("stats.arenas.0.large.nmalloc", i, &large_nmalloc, uint64_t); |
| 324 | CTL_M2_GET("stats.arenas.0.large.ndalloc", i, &large_ndalloc, uint64_t); |
| 325 | CTL_M2_GET("stats.arenas.0.large.nrequests", i, &large_nrequests, |
| 326 | uint64_t); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 327 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 328 | "large: %12zu %12"FMTu64" %12"FMTu64 |
| 329 | " %12"FMTu64"\n", |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 330 | large_allocated, large_nmalloc, large_ndalloc, large_nrequests); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 331 | CTL_M2_GET("stats.arenas.0.huge.allocated", i, &huge_allocated, size_t); |
| 332 | CTL_M2_GET("stats.arenas.0.huge.nmalloc", i, &huge_nmalloc, uint64_t); |
| 333 | CTL_M2_GET("stats.arenas.0.huge.ndalloc", i, &huge_ndalloc, uint64_t); |
| 334 | CTL_M2_GET("stats.arenas.0.huge.nrequests", i, &huge_nrequests, |
| 335 | uint64_t); |
Jason Evans | e2deab7 | 2014-05-15 22:22:27 -0700 | [diff] [blame] | 336 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 337 | "huge: %12zu %12"FMTu64" %12"FMTu64 |
| 338 | " %12"FMTu64"\n", |
Jason Evans | e2deab7 | 2014-05-15 22:22:27 -0700 | [diff] [blame] | 339 | huge_allocated, huge_nmalloc, huge_ndalloc, huge_nrequests); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 340 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 341 | "total: %12zu %12"FMTu64" %12"FMTu64 |
| 342 | " %12"FMTu64"\n", |
Jason Evans | e2deab7 | 2014-05-15 22:22:27 -0700 | [diff] [blame] | 343 | small_allocated + large_allocated + huge_allocated, |
| 344 | small_nmalloc + large_nmalloc + huge_nmalloc, |
| 345 | small_ndalloc + large_ndalloc + huge_ndalloc, |
| 346 | small_nrequests + large_nrequests + huge_nrequests); |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 347 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 348 | "active: %12zu\n", pactive * page); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 349 | CTL_M2_GET("stats.arenas.0.mapped", i, &mapped, size_t); |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 350 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 351 | "mapped: %12zu\n", mapped); |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 352 | CTL_M2_GET("stats.arenas.0.metadata.mapped", i, &metadata_mapped, |
| 353 | size_t); |
| 354 | CTL_M2_GET("stats.arenas.0.metadata.allocated", i, &metadata_allocated, |
Jason Evans | 4581b97 | 2014-11-27 17:22:36 -0200 | [diff] [blame] | 355 | size_t); |
| 356 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 357 | "metadata: mapped: %zu, allocated: %zu\n", |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 358 | metadata_mapped, metadata_allocated); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 359 | |
Jason Evans | eb23981 | 2012-03-13 08:46:12 -0700 | [diff] [blame] | 360 | if (bins) |
| 361 | stats_arena_bins_print(write_cb, cbopaque, i); |
| 362 | if (large) |
| 363 | stats_arena_lruns_print(write_cb, cbopaque, i); |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 364 | if (huge) |
| 365 | stats_arena_hchunks_print(write_cb, cbopaque, i); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 366 | } |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 367 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 368 | void |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 369 | stats_print(void (*write_cb)(void *, const char *), void *cbopaque, |
| 370 | const char *opts) |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 371 | { |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 372 | int err; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 373 | uint64_t epoch; |
| 374 | size_t u64sz; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 375 | bool general = true; |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 376 | bool merged = true; |
| 377 | bool unmerged = true; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 378 | bool bins = true; |
| 379 | bool large = true; |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 380 | bool huge = true; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 381 | |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 382 | /* |
| 383 | * Refresh stats, in case mallctl() was called by the application. |
| 384 | * |
| 385 | * Check for OOM here, since refreshing the ctl cache can trigger |
| 386 | * allocation. In practice, none of the subsequent mallctl()-related |
| 387 | * calls in this function will cause OOM if this one succeeds. |
| 388 | * */ |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 389 | epoch = 1; |
| 390 | u64sz = sizeof(uint64_t); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 391 | err = je_mallctl("epoch", &epoch, &u64sz, &epoch, sizeof(uint64_t)); |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 392 | if (err != 0) { |
| 393 | if (err == EAGAIN) { |
| 394 | malloc_write("<jemalloc>: Memory allocation failure in " |
| 395 | "mallctl(\"epoch\", ...)\n"); |
| 396 | return; |
| 397 | } |
| 398 | malloc_write("<jemalloc>: Failure in mallctl(\"epoch\", " |
| 399 | "...)\n"); |
| 400 | abort(); |
| 401 | } |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 402 | |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 403 | if (opts != NULL) { |
| 404 | unsigned i; |
| 405 | |
| 406 | for (i = 0; opts[i] != '\0'; i++) { |
| 407 | switch (opts[i]) { |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 408 | case 'g': |
| 409 | general = false; |
| 410 | break; |
| 411 | case 'm': |
| 412 | merged = false; |
| 413 | break; |
| 414 | case 'a': |
| 415 | unmerged = false; |
| 416 | break; |
| 417 | case 'b': |
| 418 | bins = false; |
| 419 | break; |
| 420 | case 'l': |
| 421 | large = false; |
| 422 | break; |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 423 | case 'h': |
| 424 | huge = false; |
| 425 | break; |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 426 | default:; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 427 | } |
| 428 | } |
| 429 | } |
| 430 | |
Mike Hommey | 3597e91 | 2012-05-02 13:15:00 +0200 | [diff] [blame] | 431 | malloc_cprintf(write_cb, cbopaque, |
| 432 | "___ Begin jemalloc statistics ___\n"); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 433 | if (general) { |
Jason Evans | 3c2d9c8 | 2010-03-03 17:55:03 -0800 | [diff] [blame] | 434 | const char *cpv; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 435 | bool bv; |
| 436 | unsigned uv; |
| 437 | ssize_t ssv; |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 438 | size_t sv, bsz, usz, ssz, sssz, cpsz; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 439 | |
| 440 | bsz = sizeof(bool); |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 441 | usz = sizeof(unsigned); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 442 | ssz = sizeof(size_t); |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 443 | sssz = sizeof(ssize_t); |
| 444 | cpsz = sizeof(const char *); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 445 | |
Jason Evans | 3c2d9c8 | 2010-03-03 17:55:03 -0800 | [diff] [blame] | 446 | CTL_GET("version", &cpv, const char *); |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 447 | malloc_cprintf(write_cb, cbopaque, "Version: %s\n", cpv); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 448 | CTL_GET("config.debug", &bv, bool); |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 449 | malloc_cprintf(write_cb, cbopaque, "Assertions %s\n", |
| 450 | bv ? "enabled" : "disabled"); |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 451 | malloc_cprintf(write_cb, cbopaque, |
| 452 | "config.malloc_conf: \"%s\"\n", config_malloc_conf); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 453 | |
Jason Evans | a4f124f | 2013-12-08 22:28:27 -0800 | [diff] [blame] | 454 | #define OPT_WRITE_BOOL(n) \ |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 455 | if (je_mallctl("opt."#n, &bv, &bsz, NULL, 0) == 0) { \ |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 456 | malloc_cprintf(write_cb, cbopaque, \ |
| 457 | " opt."#n": %s\n", bv ? "true" : "false"); \ |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 458 | } |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 459 | #define OPT_WRITE_BOOL_MUTABLE(n, m) { \ |
| 460 | bool bv2; \ |
| 461 | if (je_mallctl("opt."#n, &bv, &bsz, NULL, 0) == 0 && \ |
| 462 | je_mallctl(#m, &bv2, &bsz, NULL, 0) == 0) { \ |
| 463 | malloc_cprintf(write_cb, cbopaque, \ |
| 464 | " opt."#n": %s ("#m": %s)\n", bv ? "true" \ |
| 465 | : "false", bv2 ? "true" : "false"); \ |
| 466 | } \ |
| 467 | } |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 468 | #define OPT_WRITE_UNSIGNED(n) \ |
| 469 | if (je_mallctl("opt."#n, &uv, &usz, NULL, 0) == 0) { \ |
| 470 | malloc_cprintf(write_cb, cbopaque, \ |
| 471 | " opt."#n": %zu\n", sv); \ |
| 472 | } |
Jason Evans | a4f124f | 2013-12-08 22:28:27 -0800 | [diff] [blame] | 473 | #define OPT_WRITE_SIZE_T(n) \ |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 474 | if (je_mallctl("opt."#n, &sv, &ssz, NULL, 0) == 0) { \ |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 475 | malloc_cprintf(write_cb, cbopaque, \ |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 476 | " opt."#n": %zu\n", sv); \ |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 477 | } |
Jason Evans | a4f124f | 2013-12-08 22:28:27 -0800 | [diff] [blame] | 478 | #define OPT_WRITE_SSIZE_T(n) \ |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 479 | if (je_mallctl("opt."#n, &ssv, &sssz, NULL, 0) == 0) { \ |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 480 | malloc_cprintf(write_cb, cbopaque, \ |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 481 | " opt."#n": %zd\n", ssv); \ |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 482 | } |
Qinfan Wu | fd5901c | 2015-03-21 10:18:39 -0700 | [diff] [blame] | 483 | #define OPT_WRITE_SSIZE_T_MUTABLE(n, m) { \ |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 484 | ssize_t ssv2; \ |
| 485 | if (je_mallctl("opt."#n, &ssv, &sssz, NULL, 0) == 0 && \ |
| 486 | je_mallctl(#m, &ssv2, &sssz, NULL, 0) == 0) { \ |
| 487 | malloc_cprintf(write_cb, cbopaque, \ |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 488 | " opt."#n": %zd ("#m": %zd)\n", \ |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 489 | ssv, ssv2); \ |
Qinfan Wu | fd5901c | 2015-03-21 10:18:39 -0700 | [diff] [blame] | 490 | } \ |
| 491 | } |
Jason Evans | a4f124f | 2013-12-08 22:28:27 -0800 | [diff] [blame] | 492 | #define OPT_WRITE_CHAR_P(n) \ |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 493 | if (je_mallctl("opt."#n, &cpv, &cpsz, NULL, 0) == 0) { \ |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 494 | malloc_cprintf(write_cb, cbopaque, \ |
| 495 | " opt."#n": \"%s\"\n", cpv); \ |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 496 | } |
| 497 | |
Mike Hommey | 3597e91 | 2012-05-02 13:15:00 +0200 | [diff] [blame] | 498 | malloc_cprintf(write_cb, cbopaque, |
| 499 | "Run-time option settings:\n"); |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 500 | OPT_WRITE_BOOL(abort) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 501 | OPT_WRITE_SIZE_T(lg_chunk) |
Jason Evans | 609ae59 | 2012-10-11 13:53:15 -0700 | [diff] [blame] | 502 | OPT_WRITE_CHAR_P(dss) |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 503 | OPT_WRITE_UNSIGNED(narenas) |
| 504 | OPT_WRITE_CHAR_P(purge) |
| 505 | if (opt_purge == purge_mode_ratio) { |
| 506 | OPT_WRITE_SSIZE_T_MUTABLE(lg_dirty_mult, |
| 507 | arenas.lg_dirty_mult) |
| 508 | } |
| 509 | if (opt_purge == purge_mode_decay) |
| 510 | OPT_WRITE_SSIZE_T_MUTABLE(decay_time, arenas.decay_time) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 511 | OPT_WRITE_BOOL(stats_print) |
Guilherme Goncalves | ec98a44 | 2015-01-23 10:52:13 -0200 | [diff] [blame] | 512 | OPT_WRITE_CHAR_P(junk) |
Jason Evans | 122449b | 2012-04-06 00:35:09 -0700 | [diff] [blame] | 513 | OPT_WRITE_SIZE_T(quarantine) |
| 514 | OPT_WRITE_BOOL(redzone) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 515 | OPT_WRITE_BOOL(zero) |
Jason Evans | b147611 | 2012-04-05 13:36:17 -0700 | [diff] [blame] | 516 | OPT_WRITE_BOOL(utrace) |
Jason Evans | 122449b | 2012-04-06 00:35:09 -0700 | [diff] [blame] | 517 | OPT_WRITE_BOOL(valgrind) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 518 | OPT_WRITE_BOOL(xmalloc) |
| 519 | OPT_WRITE_BOOL(tcache) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 520 | OPT_WRITE_SSIZE_T(lg_tcache_max) |
| 521 | OPT_WRITE_BOOL(prof) |
| 522 | OPT_WRITE_CHAR_P(prof_prefix) |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 523 | OPT_WRITE_BOOL_MUTABLE(prof_active, prof.active) |
| 524 | OPT_WRITE_BOOL_MUTABLE(prof_thread_active_init, |
| 525 | prof.thread_active_init) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 526 | OPT_WRITE_SSIZE_T(lg_prof_sample) |
| 527 | OPT_WRITE_BOOL(prof_accum) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 528 | OPT_WRITE_SSIZE_T(lg_prof_interval) |
| 529 | OPT_WRITE_BOOL(prof_gdump) |
Jason Evans | 0b25fe7 | 2012-04-17 16:39:33 -0700 | [diff] [blame] | 530 | OPT_WRITE_BOOL(prof_final) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 531 | OPT_WRITE_BOOL(prof_leak) |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 532 | |
| 533 | #undef OPT_WRITE_BOOL |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 534 | #undef OPT_WRITE_BOOL_MUTABLE |
Jason Evans | e733970 | 2010-10-23 18:37:06 -0700 | [diff] [blame] | 535 | #undef OPT_WRITE_SIZE_T |
| 536 | #undef OPT_WRITE_SSIZE_T |
| 537 | #undef OPT_WRITE_CHAR_P |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 538 | |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 539 | malloc_cprintf(write_cb, cbopaque, "CPUs: %u\n", ncpus); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 540 | |
| 541 | CTL_GET("arenas.narenas", &uv, unsigned); |
Jason Evans | 609ae59 | 2012-10-11 13:53:15 -0700 | [diff] [blame] | 542 | malloc_cprintf(write_cb, cbopaque, "Arenas: %u\n", uv); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 543 | |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 544 | malloc_cprintf(write_cb, cbopaque, "Pointer size: %zu\n", |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 545 | sizeof(void *)); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 546 | |
| 547 | CTL_GET("arenas.quantum", &sv, size_t); |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 548 | malloc_cprintf(write_cb, cbopaque, "Quantum size: %zu\n", |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 549 | sv); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 550 | |
Jason Evans | ae4c7b4 | 2012-04-02 07:04:34 -0700 | [diff] [blame] | 551 | CTL_GET("arenas.page", &sv, size_t); |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 552 | malloc_cprintf(write_cb, cbopaque, "Page size: %zu\n", sv); |
Jason Evans | ae4c7b4 | 2012-04-02 07:04:34 -0700 | [diff] [blame] | 553 | |
Jason Evans | 7e336e7 | 2015-03-20 18:08:10 -0700 | [diff] [blame] | 554 | CTL_GET("arenas.lg_dirty_mult", &ssv, ssize_t); |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 555 | if (opt_purge == purge_mode_ratio) { |
| 556 | if (ssv >= 0) { |
| 557 | malloc_cprintf(write_cb, cbopaque, |
| 558 | "Min active:dirty page ratio per arena: " |
| 559 | "%u:1\n", (1U << ssv)); |
| 560 | } else { |
| 561 | malloc_cprintf(write_cb, cbopaque, |
| 562 | "Min active:dirty page ratio per arena: " |
| 563 | "N/A\n"); |
| 564 | } |
| 565 | } |
| 566 | CTL_GET("arenas.decay_time", &ssv, ssize_t); |
| 567 | if (opt_purge == purge_mode_decay) { |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 568 | malloc_cprintf(write_cb, cbopaque, |
Christopher Ferris | e429403 | 2016-03-02 14:33:02 -0800 | [diff] [blame] | 569 | "Unused dirty page decay time: %zd%s\n", |
| 570 | ssv, (ssv < 0) ? " (no decay)" : ""); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 571 | } |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 572 | if (je_mallctl("arenas.tcache_max", &sv, &ssz, NULL, 0) == 0) { |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 573 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 574 | "Maximum thread-cached size class: %zu\n", sv); |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 575 | } |
Jason Evans | fc12c0b | 2014-10-03 23:25:30 -0700 | [diff] [blame] | 576 | if (je_mallctl("opt.prof", &bv, &bsz, NULL, 0) == 0 && bv) { |
Jason Evans | 602c8e0 | 2014-08-18 16:22:13 -0700 | [diff] [blame] | 577 | CTL_GET("prof.lg_sample", &sv, size_t); |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 578 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 579 | "Average profile sample interval: %"FMTu64 |
| 580 | " (2^%zu)\n", (((uint64_t)1U) << sv), sv); |
Jason Evans | b9477e7 | 2010-03-01 20:15:26 -0800 | [diff] [blame] | 581 | |
Jason Evans | a02fc08 | 2010-03-31 17:35:51 -0700 | [diff] [blame] | 582 | CTL_GET("opt.lg_prof_interval", &ssv, ssize_t); |
Jason Evans | a02fc08 | 2010-03-31 17:35:51 -0700 | [diff] [blame] | 583 | if (ssv >= 0) { |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 584 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 585 | "Average profile dump interval: %"FMTu64 |
| 586 | " (2^%zd)\n", |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 587 | (((uint64_t)1U) << ssv), ssv); |
| 588 | } else { |
Mike Hommey | 3597e91 | 2012-05-02 13:15:00 +0200 | [diff] [blame] | 589 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | d81e4bd | 2012-03-06 14:57:45 -0800 | [diff] [blame] | 590 | "Average profile dump interval: N/A\n"); |
| 591 | } |
Jason Evans | d34f9e7 | 2010-02-11 13:19:21 -0800 | [diff] [blame] | 592 | } |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 593 | CTL_GET("opt.lg_chunk", &sv, size_t); |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 594 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 595 | "Chunk size: %zu (2^%zu)\n", (ZU(1) << sv), sv); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 596 | } |
| 597 | |
Jason Evans | 7372b15 | 2012-02-10 20:22:09 -0800 | [diff] [blame] | 598 | if (config_stats) { |
Jason Evans | 0657f12 | 2011-03-18 17:56:14 -0700 | [diff] [blame] | 599 | size_t *cactive; |
Jason Evans | 4acd75a | 2015-03-23 17:25:57 -0700 | [diff] [blame] | 600 | size_t allocated, active, metadata, resident, mapped; |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 601 | |
Jason Evans | 0657f12 | 2011-03-18 17:56:14 -0700 | [diff] [blame] | 602 | CTL_GET("stats.cactive", &cactive, size_t *); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 603 | CTL_GET("stats.allocated", &allocated, size_t); |
Jason Evans | c66aaf1 | 2010-01-29 11:24:19 -0800 | [diff] [blame] | 604 | CTL_GET("stats.active", &active, size_t); |
Jason Evans | 4581b97 | 2014-11-27 17:22:36 -0200 | [diff] [blame] | 605 | CTL_GET("stats.metadata", &metadata, size_t); |
Jason Evans | 4acd75a | 2015-03-23 17:25:57 -0700 | [diff] [blame] | 606 | CTL_GET("stats.resident", &resident, size_t); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 607 | CTL_GET("stats.mapped", &mapped, size_t); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 608 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 609 | "Allocated: %zu, active: %zu, metadata: %zu," |
| 610 | " resident: %zu, mapped: %zu\n", |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 611 | allocated, active, metadata, resident, mapped); |
Jason Evans | 0657f12 | 2011-03-18 17:56:14 -0700 | [diff] [blame] | 612 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 5fae7dc | 2015-07-23 13:56:25 -0700 | [diff] [blame] | 613 | "Current active ceiling: %zu\n", |
Jason Evans | 0313607 | 2015-07-07 13:12:05 -0700 | [diff] [blame] | 614 | atomic_read_z(cactive)); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 615 | |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 616 | if (merged) { |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 617 | unsigned narenas; |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 618 | |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 619 | CTL_GET("arenas.narenas", &narenas, unsigned); |
| 620 | { |
Mike Hommey | 8b49971 | 2012-04-24 23:22:02 +0200 | [diff] [blame] | 621 | VARIABLE_ARRAY(bool, initialized, narenas); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 622 | size_t isz; |
| 623 | unsigned i, ninitialized; |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 624 | |
Mike Hommey | c584fc7 | 2012-05-02 21:30:53 +0200 | [diff] [blame] | 625 | isz = sizeof(bool) * narenas; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 626 | xmallctl("arenas.initialized", initialized, |
| 627 | &isz, NULL, 0); |
| 628 | for (i = ninitialized = 0; i < narenas; i++) { |
| 629 | if (initialized[i]) |
| 630 | ninitialized++; |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 631 | } |
Jason Evans | 68ddb67 | 2010-01-24 17:21:47 -0800 | [diff] [blame] | 632 | |
Jason Evans | 551ebc4 | 2014-10-03 10:16:09 -0700 | [diff] [blame] | 633 | if (ninitialized > 1 || !unmerged) { |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 634 | /* Print merged arena stats. */ |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 635 | malloc_cprintf(write_cb, cbopaque, |
Jason Evans | 1366826 | 2010-01-31 03:57:29 -0800 | [diff] [blame] | 636 | "\nMerged arenas stats:\n"); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 637 | stats_arena_print(write_cb, cbopaque, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 638 | narenas, bins, large, huge); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 639 | } |
Jason Evans | 68ddb67 | 2010-01-24 17:21:47 -0800 | [diff] [blame] | 640 | } |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 641 | } |
| 642 | |
| 643 | if (unmerged) { |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 644 | unsigned narenas; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 645 | |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 646 | /* Print stats for each arena. */ |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 647 | |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 648 | CTL_GET("arenas.narenas", &narenas, unsigned); |
| 649 | { |
Mike Hommey | 8b49971 | 2012-04-24 23:22:02 +0200 | [diff] [blame] | 650 | VARIABLE_ARRAY(bool, initialized, narenas); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 651 | size_t isz; |
| 652 | unsigned i; |
| 653 | |
Mike Hommey | c584fc7 | 2012-05-02 21:30:53 +0200 | [diff] [blame] | 654 | isz = sizeof(bool) * narenas; |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 655 | xmallctl("arenas.initialized", initialized, |
| 656 | &isz, NULL, 0); |
| 657 | |
| 658 | for (i = 0; i < narenas; i++) { |
| 659 | if (initialized[i]) { |
Jason Evans | dafde14 | 2010-03-17 16:27:39 -0700 | [diff] [blame] | 660 | malloc_cprintf(write_cb, |
| 661 | cbopaque, |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 662 | "\narenas[%u]:\n", i); |
Jason Evans | 698805c | 2010-03-03 17:45:38 -0800 | [diff] [blame] | 663 | stats_arena_print(write_cb, |
Jason Evans | 3c4d92e | 2014-10-12 22:53:59 -0700 | [diff] [blame] | 664 | cbopaque, i, bins, large, |
| 665 | huge); |
Jason Evans | 3c23435 | 2010-01-27 13:10:55 -0800 | [diff] [blame] | 666 | } |
Jason Evans | b34e868 | 2010-01-17 17:35:19 -0800 | [diff] [blame] | 667 | } |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 668 | } |
| 669 | } |
| 670 | } |
Mike Hommey | 3597e91 | 2012-05-02 13:15:00 +0200 | [diff] [blame] | 671 | malloc_cprintf(write_cb, cbopaque, "--- End jemalloc statistics ---\n"); |
Jason Evans | e476f8a | 2010-01-16 09:53:50 -0800 | [diff] [blame] | 672 | } |