xref: /redis-3.2.3/deps/jemalloc/test/unit/stats.c (revision 79d2f70f)
1 #include "test/jemalloc_test.h"
2 
3 TEST_BEGIN(test_stats_summary)
4 {
5 	size_t *cactive;
6 	size_t sz, allocated, active, mapped;
7 	int expected = config_stats ? 0 : ENOENT;
8 
9 	sz = sizeof(cactive);
10 	assert_d_eq(mallctl("stats.cactive", &cactive, &sz, NULL, 0), expected,
11 	    "Unexpected mallctl() result");
12 
13 	sz = sizeof(size_t);
14 	assert_d_eq(mallctl("stats.allocated", &allocated, &sz, NULL, 0),
15 	    expected, "Unexpected mallctl() result");
16 	assert_d_eq(mallctl("stats.active", &active, &sz, NULL, 0), expected,
17 	    "Unexpected mallctl() result");
18 	assert_d_eq(mallctl("stats.mapped", &mapped, &sz, NULL, 0), expected,
19 	    "Unexpected mallctl() result");
20 
21 	if (config_stats) {
22 		assert_zu_le(active, *cactive,
23 		    "active should be no larger than cactive");
24 		assert_zu_le(allocated, active,
25 		    "allocated should be no larger than active");
26 		assert_zu_le(active, mapped,
27 		    "active should be no larger than mapped");
28 	}
29 }
30 TEST_END
31 
32 TEST_BEGIN(test_stats_chunks)
33 {
34 	size_t current, high;
35 	uint64_t total;
36 	size_t sz;
37 	int expected = config_stats ? 0 : ENOENT;
38 
39 	sz = sizeof(size_t);
40 	assert_d_eq(mallctl("stats.chunks.current", &current, &sz, NULL, 0),
41 	    expected, "Unexpected mallctl() result");
42 	sz = sizeof(uint64_t);
43 	assert_d_eq(mallctl("stats.chunks.total", &total, &sz, NULL, 0),
44 	    expected, "Unexpected mallctl() result");
45 	sz = sizeof(size_t);
46 	assert_d_eq(mallctl("stats.chunks.high", &high, &sz, NULL, 0), expected,
47 	    "Unexpected mallctl() result");
48 
49 	if (config_stats) {
50 		assert_zu_le(current, high,
51 		    "current should be no larger than high");
52 		assert_u64_le((uint64_t)high, total,
53 		    "high should be no larger than total");
54 	}
55 }
56 TEST_END
57 
58 TEST_BEGIN(test_stats_huge)
59 {
60 	void *p;
61 	uint64_t epoch;
62 	size_t allocated;
63 	uint64_t nmalloc, ndalloc;
64 	size_t sz;
65 	int expected = config_stats ? 0 : ENOENT;
66 
67 	p = mallocx(arena_maxclass+1, 0);
68 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
69 
70 	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
71 	    "Unexpected mallctl() failure");
72 
73 	sz = sizeof(size_t);
74 	assert_d_eq(mallctl("stats.huge.allocated", &allocated, &sz, NULL, 0),
75 	    expected, "Unexpected mallctl() result");
76 	sz = sizeof(uint64_t);
77 	assert_d_eq(mallctl("stats.huge.nmalloc", &nmalloc, &sz, NULL, 0),
78 	    expected, "Unexpected mallctl() result");
79 	assert_d_eq(mallctl("stats.huge.ndalloc", &ndalloc, &sz, NULL, 0),
80 	    expected, "Unexpected mallctl() result");
81 
82 	if (config_stats) {
83 		assert_zu_gt(allocated, 0,
84 		    "allocated should be greater than zero");
85 		assert_u64_ge(nmalloc, ndalloc,
86 		    "nmalloc should be at least as large as ndalloc");
87 	}
88 
89 	dallocx(p, 0);
90 }
91 TEST_END
92 
93 TEST_BEGIN(test_stats_arenas_summary)
94 {
95 	unsigned arena;
96 	void *small, *large;
97 	uint64_t epoch;
98 	size_t sz;
99 	int expected = config_stats ? 0 : ENOENT;
100 	size_t mapped;
101 	uint64_t npurge, nmadvise, purged;
102 
103 	arena = 0;
104 	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
105 	    0, "Unexpected mallctl() failure");
106 
107 	small = mallocx(SMALL_MAXCLASS, 0);
108 	assert_ptr_not_null(small, "Unexpected mallocx() failure");
109 	large = mallocx(arena_maxclass, 0);
110 	assert_ptr_not_null(large, "Unexpected mallocx() failure");
111 
112 	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
113 	    "Unexpected mallctl() failure");
114 
115 	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
116 	    "Unexpected mallctl() failure");
117 
118 	sz = sizeof(size_t);
119 	assert_d_eq(mallctl("stats.arenas.0.mapped", &mapped, &sz, NULL, 0),
120 	    expected, "Unexepected mallctl() result");
121 	sz = sizeof(uint64_t);
122 	assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge, &sz, NULL, 0),
123 	    expected, "Unexepected mallctl() result");
124 	assert_d_eq(mallctl("stats.arenas.0.nmadvise", &nmadvise, &sz, NULL, 0),
125 	    expected, "Unexepected mallctl() result");
126 	assert_d_eq(mallctl("stats.arenas.0.purged", &purged, &sz, NULL, 0),
127 	    expected, "Unexepected mallctl() result");
128 
129 	if (config_stats) {
130 		assert_u64_gt(npurge, 0,
131 		    "At least one purge should have occurred");
132 		assert_u64_le(nmadvise, purged,
133 		    "nmadvise should be no greater than purged");
134 	}
135 
136 	dallocx(small, 0);
137 	dallocx(large, 0);
138 }
139 TEST_END
140 
141 void *
142 thd_start(void *arg)
143 {
144 
145 	return (NULL);
146 }
147 
148 static void
149 no_lazy_lock(void)
150 {
151 	thd_t thd;
152 
153 	thd_create(&thd, thd_start, NULL);
154 	thd_join(thd, NULL);
155 }
156 
157 TEST_BEGIN(test_stats_arenas_small)
158 {
159 	unsigned arena;
160 	void *p;
161 	size_t sz, allocated;
162 	uint64_t epoch, nmalloc, ndalloc, nrequests;
163 	int expected = config_stats ? 0 : ENOENT;
164 
165 	no_lazy_lock(); /* Lazy locking would dodge tcache testing. */
166 
167 	arena = 0;
168 	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
169 	    0, "Unexpected mallctl() failure");
170 
171 	p = mallocx(SMALL_MAXCLASS, 0);
172 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
173 
174 	assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0),
175 	    config_tcache ? 0 : ENOENT, "Unexpected mallctl() result");
176 
177 	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
178 	    "Unexpected mallctl() failure");
179 
180 	sz = sizeof(size_t);
181 	assert_d_eq(mallctl("stats.arenas.0.small.allocated", &allocated, &sz,
182 	    NULL, 0), expected, "Unexpected mallctl() result");
183 	sz = sizeof(uint64_t);
184 	assert_d_eq(mallctl("stats.arenas.0.small.nmalloc", &nmalloc, &sz,
185 	    NULL, 0), expected, "Unexpected mallctl() result");
186 	assert_d_eq(mallctl("stats.arenas.0.small.ndalloc", &ndalloc, &sz,
187 	    NULL, 0), expected, "Unexpected mallctl() result");
188 	assert_d_eq(mallctl("stats.arenas.0.small.nrequests", &nrequests, &sz,
189 	    NULL, 0), expected, "Unexpected mallctl() result");
190 
191 	if (config_stats) {
192 		assert_zu_gt(allocated, 0,
193 		    "allocated should be greater than zero");
194 		assert_u64_gt(nmalloc, 0,
195 		    "nmalloc should be no greater than zero");
196 		assert_u64_ge(nmalloc, ndalloc,
197 		    "nmalloc should be at least as large as ndalloc");
198 		assert_u64_gt(nrequests, 0,
199 		    "nrequests should be greater than zero");
200 	}
201 
202 	dallocx(p, 0);
203 }
204 TEST_END
205 
206 TEST_BEGIN(test_stats_arenas_large)
207 {
208 	unsigned arena;
209 	void *p;
210 	size_t sz, allocated;
211 	uint64_t epoch, nmalloc, ndalloc, nrequests;
212 	int expected = config_stats ? 0 : ENOENT;
213 
214 	arena = 0;
215 	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
216 	    0, "Unexpected mallctl() failure");
217 
218 	p = mallocx(arena_maxclass, 0);
219 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
220 
221 	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
222 	    "Unexpected mallctl() failure");
223 
224 	sz = sizeof(size_t);
225 	assert_d_eq(mallctl("stats.arenas.0.large.allocated", &allocated, &sz,
226 	    NULL, 0), expected, "Unexpected mallctl() result");
227 	sz = sizeof(uint64_t);
228 	assert_d_eq(mallctl("stats.arenas.0.large.nmalloc", &nmalloc, &sz,
229 	    NULL, 0), expected, "Unexpected mallctl() result");
230 	assert_d_eq(mallctl("stats.arenas.0.large.ndalloc", &ndalloc, &sz,
231 	    NULL, 0), expected, "Unexpected mallctl() result");
232 	assert_d_eq(mallctl("stats.arenas.0.large.nrequests", &nrequests, &sz,
233 	    NULL, 0), expected, "Unexpected mallctl() result");
234 
235 	if (config_stats) {
236 		assert_zu_gt(allocated, 0,
237 		    "allocated should be greater than zero");
238 		assert_zu_gt(nmalloc, 0,
239 		    "nmalloc should be greater than zero");
240 		assert_zu_ge(nmalloc, ndalloc,
241 		    "nmalloc should be at least as large as ndalloc");
242 		assert_zu_gt(nrequests, 0,
243 		    "nrequests should be greater than zero");
244 	}
245 
246 	dallocx(p, 0);
247 }
248 TEST_END
249 
250 TEST_BEGIN(test_stats_arenas_bins)
251 {
252 	unsigned arena;
253 	void *p;
254 	size_t sz, allocated, curruns;
255 	uint64_t epoch, nmalloc, ndalloc, nrequests, nfills, nflushes;
256 	uint64_t nruns, nreruns;
257 	int expected = config_stats ? 0 : ENOENT;
258 
259 	arena = 0;
260 	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
261 	    0, "Unexpected mallctl() failure");
262 
263 	p = mallocx(arena_bin_info[0].reg_size, 0);
264 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
265 
266 	assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0),
267 	    config_tcache ? 0 : ENOENT, "Unexpected mallctl() result");
268 
269 	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
270 	    "Unexpected mallctl() failure");
271 
272 	sz = sizeof(size_t);
273 	assert_d_eq(mallctl("stats.arenas.0.bins.0.allocated", &allocated, &sz,
274 	    NULL, 0), expected, "Unexpected mallctl() result");
275 	sz = sizeof(uint64_t);
276 	assert_d_eq(mallctl("stats.arenas.0.bins.0.nmalloc", &nmalloc, &sz,
277 	    NULL, 0), expected, "Unexpected mallctl() result");
278 	assert_d_eq(mallctl("stats.arenas.0.bins.0.ndalloc", &ndalloc, &sz,
279 	    NULL, 0), expected, "Unexpected mallctl() result");
280 	assert_d_eq(mallctl("stats.arenas.0.bins.0.nrequests", &nrequests, &sz,
281 	    NULL, 0), expected, "Unexpected mallctl() result");
282 
283 	assert_d_eq(mallctl("stats.arenas.0.bins.0.nfills", &nfills, &sz,
284 	    NULL, 0), config_tcache ? expected : ENOENT,
285 	    "Unexpected mallctl() result");
286 	assert_d_eq(mallctl("stats.arenas.0.bins.0.nflushes", &nflushes, &sz,
287 	    NULL, 0), config_tcache ? expected : ENOENT,
288 	    "Unexpected mallctl() result");
289 
290 	assert_d_eq(mallctl("stats.arenas.0.bins.0.nruns", &nruns, &sz,
291 	    NULL, 0), expected, "Unexpected mallctl() result");
292 	assert_d_eq(mallctl("stats.arenas.0.bins.0.nreruns", &nreruns, &sz,
293 	    NULL, 0), expected, "Unexpected mallctl() result");
294 	sz = sizeof(size_t);
295 	assert_d_eq(mallctl("stats.arenas.0.bins.0.curruns", &curruns, &sz,
296 	    NULL, 0), expected, "Unexpected mallctl() result");
297 
298 	if (config_stats) {
299 		assert_zu_gt(allocated, 0,
300 		    "allocated should be greater than zero");
301 		assert_u64_gt(nmalloc, 0,
302 		    "nmalloc should be greater than zero");
303 		assert_u64_ge(nmalloc, ndalloc,
304 		    "nmalloc should be at least as large as ndalloc");
305 		assert_u64_gt(nrequests, 0,
306 		    "nrequests should be greater than zero");
307 		if (config_tcache) {
308 			assert_u64_gt(nfills, 0,
309 			    "At least one fill should have occurred");
310 			assert_u64_gt(nflushes, 0,
311 			    "At least one flush should have occurred");
312 		}
313 		assert_u64_gt(nruns, 0,
314 		    "At least one run should have been allocated");
315 		assert_zu_gt(curruns, 0,
316 		    "At least one run should be currently allocated");
317 	}
318 
319 	dallocx(p, 0);
320 }
321 TEST_END
322 
323 TEST_BEGIN(test_stats_arenas_lruns)
324 {
325 	unsigned arena;
326 	void *p;
327 	uint64_t epoch, nmalloc, ndalloc, nrequests;
328 	size_t curruns, sz;
329 	int expected = config_stats ? 0 : ENOENT;
330 
331 	arena = 0;
332 	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
333 	    0, "Unexpected mallctl() failure");
334 
335 	p = mallocx(SMALL_MAXCLASS+1, 0);
336 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
337 
338 	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
339 	    "Unexpected mallctl() failure");
340 
341 	sz = sizeof(uint64_t);
342 	assert_d_eq(mallctl("stats.arenas.0.lruns.0.nmalloc", &nmalloc, &sz,
343 	    NULL, 0), expected, "Unexpected mallctl() result");
344 	assert_d_eq(mallctl("stats.arenas.0.lruns.0.ndalloc", &ndalloc, &sz,
345 	    NULL, 0), expected, "Unexpected mallctl() result");
346 	assert_d_eq(mallctl("stats.arenas.0.lruns.0.nrequests", &nrequests, &sz,
347 	    NULL, 0), expected, "Unexpected mallctl() result");
348 	sz = sizeof(size_t);
349 	assert_d_eq(mallctl("stats.arenas.0.lruns.0.curruns", &curruns, &sz,
350 	    NULL, 0), expected, "Unexpected mallctl() result");
351 
352 	if (config_stats) {
353 		assert_u64_gt(nmalloc, 0,
354 		    "nmalloc should be greater than zero");
355 		assert_u64_ge(nmalloc, ndalloc,
356 		    "nmalloc should be at least as large as ndalloc");
357 		assert_u64_gt(nrequests, 0,
358 		    "nrequests should be greater than zero");
359 		assert_u64_gt(curruns, 0,
360 		    "At least one run should be currently allocated");
361 	}
362 
363 	dallocx(p, 0);
364 }
365 TEST_END
366 
367 int
368 main(void)
369 {
370 
371 	return (test(
372 	    test_stats_summary,
373 	    test_stats_chunks,
374 	    test_stats_huge,
375 	    test_stats_arenas_summary,
376 	    test_stats_arenas_small,
377 	    test_stats_arenas_large,
378 	    test_stats_arenas_bins,
379 	    test_stats_arenas_lruns));
380 }
381