Skip to content

Commit 2d4cf3a

Browse files
authoredJul 24, 2024
[Enhancement] Mallctl of jemalloc support setting the memory of retain pages to not dump (StarRocks#48796)
Signed-off-by: trueeyu <[email protected]>
1 parent b4826a8 commit 2d4cf3a

File tree

2 files changed

+223
-0
lines changed

2 files changed

+223
-0
lines changed
 

‎thirdparty/download-thirdparty.sh

+1
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ cd $TP_SOURCE_DIR/$JEMALLOC_SOURCE
406406
if [ ! -f $PATCHED_MARK ] && [ $JEMALLOC_SOURCE = "jemalloc-5.3.0" ]; then
407407
patch -p0 < $TP_PATCH_DIR/jemalloc_hook.patch
408408
patch -p0 < $TP_PATCH_DIR/jemalloc_nallocx.patch
409+
patch -p0 < $TP_PATCH_DIR/jemalloc_nodump.patch
409410
touch $PATCHED_MARK
410411
fi
411412
cd -
+222
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
diff --git include/jemalloc/internal/arena_externs.h include/jemalloc/internal/arena_externs.h
2+
index e6fceaaf..0feeb051 100644
3+
--- include/jemalloc/internal/arena_externs.h
4+
+++ include/jemalloc/internal/arena_externs.h
5+
@@ -60,6 +60,7 @@ uint64_t arena_time_until_deferred(tsdn_t *tsdn, arena_t *arena);
6+
void arena_do_deferred_work(tsdn_t *tsdn, arena_t *arena);
7+
void arena_reset(tsd_t *tsd, arena_t *arena);
8+
void arena_destroy(tsd_t *tsd, arena_t *arena);
9+
+void arena_dontdump(tsdn_t *tsdn, arena_t *arena);
10+
void arena_cache_bin_fill_small(tsdn_t *tsdn, arena_t *arena,
11+
cache_bin_t *cache_bin, cache_bin_info_t *cache_bin_info, szind_t binind,
12+
const unsigned nfill);
13+
diff --git include/jemalloc/internal/extent.h include/jemalloc/internal/extent.h
14+
index 1d51d410..1e77caa4 100644
15+
--- include/jemalloc/internal/extent.h
16+
+++ include/jemalloc/internal/extent.h
17+
@@ -29,6 +29,7 @@ void ecache_dalloc(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
18+
ecache_t *ecache, edata_t *edata);
19+
edata_t *ecache_evict(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
20+
ecache_t *ecache, size_t npages_min);
21+
+void ecache_dontdump(tsdn_t *tsdn, ecache_t *ecache);
22+
23+
void extent_gdump_add(tsdn_t *tsdn, const edata_t *edata);
24+
void extent_record(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
25+
diff --git include/jemalloc/internal/pa.h include/jemalloc/internal/pa.h
26+
index 4748a05b..41fefafb 100644
27+
--- include/jemalloc/internal/pa.h
28+
+++ include/jemalloc/internal/pa.h
29+
@@ -164,6 +164,7 @@ void pa_shard_reset(tsdn_t *tsdn, pa_shard_t *shard);
30+
* last step in destroying the shard.
31+
*/
32+
void pa_shard_destroy(tsdn_t *tsdn, pa_shard_t *shard);
33+
+void pa_shard_dontdump_retain(tsdn_t *tsdn, pa_shard_t *shard);
34+
35+
/* Gets an edata for the given allocation. */
36+
edata_t *pa_alloc(tsdn_t *tsdn, pa_shard_t *shard, size_t size,
37+
diff --git include/jemalloc/internal/pac.h include/jemalloc/internal/pac.h
38+
index 01c4e6af..c5103fec 100644
39+
--- include/jemalloc/internal/pac.h
40+
+++ include/jemalloc/internal/pac.h
41+
@@ -175,5 +175,6 @@ ssize_t pac_decay_ms_get(pac_t *pac, extent_state_t state);
42+
43+
void pac_reset(tsdn_t *tsdn, pac_t *pac);
44+
void pac_destroy(tsdn_t *tsdn, pac_t *pac);
45+
+void pac_dontdump_retain(tsdn_t *tsdn, pac_t *pac);
46+
47+
#endif /* JEMALLOC_INTERNAL_PAC_H */
48+
diff --git include/jemalloc/internal/typed_list.h include/jemalloc/internal/typed_list.h
49+
index 6535055a..77c019ce 100644
50+
--- include/jemalloc/internal/typed_list.h
51+
+++ include/jemalloc/internal/typed_list.h
52+
@@ -50,6 +50,10 @@ list_type##_empty(list_type##_t *list) { \
53+
static inline void \
54+
list_type##_concat(list_type##_t *list_a, list_type##_t *list_b) { \
55+
ql_concat(&list_a->head, &list_b->head, linkage); \
56+
+} \
57+
+static inline el_type* \
58+
+list_type##_next(list_type##_t *list, el_type *item) { \
59+
+ return ql_next(&list->head, item, linkage) ; \
60+
}
61+
62+
#endif /* JEMALLOC_INTERNAL_TYPED_LIST_H */
63+
diff --git src/arena.c src/arena.c
64+
index 857b27c5..fba416f6 100644
65+
--- src/arena.c
66+
+++ src/arena.c
67+
@@ -792,6 +792,12 @@ arena_prepare_base_deletion(tsd_t *tsd, base_t *base_to_destroy) {
68+
}
69+
#undef ARENA_DESTROY_MAX_DELAYED_MTX
70+
71+
+void
72+
+arena_dontdump(tsdn_t *tsdn, arena_t *arena) {
73+
+ pa_shard_dontdump_retain(tsdn, &arena->pa_shard);
74+
+ // TODO: dontdump dirty or muzzy?
75+
+}
76+
+
77+
void
78+
arena_destroy(tsd_t *tsd, arena_t *arena) {
79+
assert(base_ind_get(arena->base) >= narenas_auto);
80+
diff --git src/ctl.c src/ctl.c
81+
index 135271ba..cd6f8e9f 100644
82+
--- src/ctl.c
83+
+++ src/ctl.c
84+
@@ -162,6 +162,7 @@ CTL_PROTO(arena_i_decay)
85+
CTL_PROTO(arena_i_purge)
86+
CTL_PROTO(arena_i_reset)
87+
CTL_PROTO(arena_i_destroy)
88+
+CTL_PROTO(arena_i_dontdump)
89+
CTL_PROTO(arena_i_dss)
90+
CTL_PROTO(arena_i_oversize_threshold)
91+
CTL_PROTO(arena_i_dirty_decay_ms)
92+
@@ -494,6 +495,7 @@ static const ctl_named_node_t arena_i_node[] = {
93+
{NAME("purge"), CTL(arena_i_purge)},
94+
{NAME("reset"), CTL(arena_i_reset)},
95+
{NAME("destroy"), CTL(arena_i_destroy)},
96+
+ {NAME("dontdump"), CTL(arena_i_dontdump)},
97+
{NAME("dss"), CTL(arena_i_dss)},
98+
/*
99+
* Undocumented for now, since we anticipate an arena API in flux after
100+
@@ -2678,6 +2680,67 @@ arena_i_reset_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp,
101+
return ret;
102+
}
103+
104+
+static void
105+
+arena_i_dontdump(tsdn_t *tsdn, unsigned arena_ind) {
106+
+ malloc_mutex_lock(tsdn, &ctl_mtx);
107+
+ {
108+
+ unsigned narenas = ctl_arenas->narenas;
109+
+ /*
110+
+ * Access via index narenas is deprecated, and scheduled for
111+
+ * removal in 6.0.0.
112+
+ */
113+
+ if (arena_ind == MALLCTL_ARENAS_ALL || arena_ind == narenas) {
114+
+ unsigned i;
115+
+ VARIABLE_ARRAY(arena_t *, tarenas, narenas);
116+
+ for (i = 0; i < narenas; i++) {
117+
+ tarenas[i] = arena_get(tsdn, i, false);
118+
+ }
119+
+
120+
+ /*
121+
+ * No further need to hold ctl_mtx, since narenas and
122+
+ * tarenas contain everything needed below.
123+
+ */
124+
+ malloc_mutex_unlock(tsdn, &ctl_mtx);
125+
+
126+
+ for (i = 0; i < narenas; i++) {
127+
+ if (tarenas[i] != NULL) {
128+
+ arena_dontdump(tsdn, tarenas[i]);
129+
+ }
130+
+ }
131+
+ } else {
132+
+ arena_t *tarena;
133+
+
134+
+ assert(arena_ind < narenas);
135+
+
136+
+ tarena = arena_get(tsdn, arena_ind, false);
137+
+
138+
+ /* No further need to hold ctl_mtx. */
139+
+ malloc_mutex_unlock(tsdn, &ctl_mtx);
140+
+
141+
+ if (tarena != NULL) {
142+
+ arena_dontdump(tsdn, tarena);
143+
+ }
144+
+ }
145+
+ }
146+
+
147+
+}
148+
+
149+
+static int
150+
+arena_i_dontdump_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp,
151+
+ size_t *oldlenp, void *newp, size_t newlen) {
152+
+
153+
+ int ret = 0;
154+
+ unsigned arena_ind;
155+
+ NEITHER_READ_NOR_WRITE();
156+
+ MIB_UNSIGNED(arena_ind, 1);
157+
+
158+
+ arena_i_dontdump(tsd_tsdn(tsd), arena_ind);
159+
+
160+
+label_return:
161+
+ return ret;
162+
+}
163+
+
164+
+
165+
static int
166+
arena_i_destroy_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp,
167+
size_t *oldlenp, void *newp, size_t newlen) {
168+
diff --git src/extent.c src/extent.c
169+
index cf3d1f31..adf0d574 100644
170+
--- src/extent.c
171+
+++ src/extent.c
172+
@@ -147,6 +147,21 @@ ecache_dalloc(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, ecache_t *ecache,
173+
extent_record(tsdn, pac, ehooks, ecache, edata);
174+
}
175+
176+
+void
177+
+ecache_dontdump(tsdn_t *tsdn, ecache_t *ecache) {
178+
+ malloc_mutex_lock(tsdn, &ecache->mtx);
179+
+
180+
+ eset_t *eset = &ecache->eset;
181+
+ edata_t *edata = edata_list_inactive_first(&eset->lru);
182+
+
183+
+ while (edata != NULL) {
184+
+ pages_dontdump(edata_base_get(edata), edata_size_get(edata));
185+
+ edata = edata_list_inactive_next(&eset->lru, edata);
186+
+ }
187+
+
188+
+ malloc_mutex_unlock(tsdn, &ecache->mtx);
189+
+}
190+
+
191+
edata_t *
192+
ecache_evict(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks,
193+
ecache_t *ecache, size_t npages_min) {
194+
diff --git src/pa.c src/pa.c
195+
index eb7e4620..40555a2f 100644
196+
--- src/pa.c
197+
+++ src/pa.c
198+
@@ -112,6 +112,10 @@ pa_shard_destroy(tsdn_t *tsdn, pa_shard_t *shard) {
199+
}
200+
}
201+
202+
+void pa_shard_dontdump_retain(tsdn_t *tsdn, pa_shard_t *shard) {
203+
+ pac_dontdump_retain(tsdn, &shard->pac);
204+
+}
205+
+
206+
static pai_t *
207+
pa_get_pai(pa_shard_t *shard, edata_t *edata) {
208+
return (edata_pai_get(edata) == EXTENT_PAI_PAC
209+
diff --git src/pac.c src/pac.c
210+
index 53e3d823..f843d5a7 100644
211+
--- src/pac.c
212+
+++ src/pac.c
213+
@@ -585,3 +585,8 @@ pac_destroy(tsdn_t *tsdn, pac_t *pac) {
214+
extent_destroy_wrapper(tsdn, pac, ehooks, edata);
215+
}
216+
}
217+
+
218+
+void
219+
+pac_dontdump_retain(tsdn_t *tsdn, pac_t *pac) {
220+
+ ecache_dontdump(tsdn, &pac->ecache_retained);
221+
+}
222+
+

0 commit comments

Comments
 (0)
Please sign in to comment.