Add an option to use malloc for page cache instead of mmap (#13142)
Add an option to switch to using malloc for page cache instead of mmap
Stelios Fragkakis committed
Jun 15, 2022 at 19:41 UTC
e7d7b4ecae6f2c06a7940c00a5a9701c25b33be3
4 files changed
+14
-3
daemon/main.c
+1
@@ -584,6 +584,7 @@ static void get_netdata_configured_variables() {
584
// ------------------------------------------------------------------------
585
// get default Database Engine page cache size in MiB
586
587
+ db_engine_use_malloc = config_get_boolean(CONFIG_SECTION_GLOBAL, "page cache uses malloc", CONFIG_BOOLEAN_NO);
588
default_rrdeng_page_cache_mb = (int) config_get_number(CONFIG_SECTION_GLOBAL, "page cache size", default_rrdeng_page_cache_mb);
589
if(default_rrdeng_page_cache_mb < RRDENG_MIN_PAGE_CACHE_SIZE_MB) {
590
error("Invalid page cache size %d given. Defaulting to %d.", default_rrdeng_page_cache_mb, RRDENG_MIN_PAGE_CACHE_SIZE_MB);
database/engine/rrdengine.c
+11
-3
@@ -16,13 +16,21 @@ static unsigned pages_per_extent = MAX_PAGES_PER_EXTENT;
16
#endif
17
18
void *dbengine_page_alloc() {
19
- void *page = netdata_mmap(NULL, RRDENG_BLOCK_SIZE, MAP_PRIVATE, enable_ksm);
20
- if(!page) fatal("Cannot allocate dbengine page cache page, with mmap()");
19
+ void *page = NULL;
20
+ if (unlikely(db_engine_use_malloc))
21
+ page = mallocz(RRDENG_BLOCK_SIZE);
22
+ else {
23
+ page = netdata_mmap(NULL, RRDENG_BLOCK_SIZE, MAP_PRIVATE, enable_ksm);
24
+ if(!page) fatal("Cannot allocate dbengine page cache page, with mmap()");
25
+ }
26
return page;
27
}
28
29
void dbengine_page_free(void *page) {
25
- munmap(page, RRDENG_BLOCK_SIZE);
30
+ if (unlikely(db_engine_use_malloc))
31
+ freez(page);
32
+ else
33
+ munmap(page, RRDENG_BLOCK_SIZE);
34
}
35
36
static void sanity_check(void)
database/engine/rrdengineapi.c
+1
@@ -4,6 +4,7 @@
4
/* Default global database instance */
5
struct rrdengine_instance multidb_ctx;
6
7
+int db_engine_use_malloc = 0;
8
int default_rrdeng_page_cache_mb = 32;
9
int default_rrdeng_disk_quota_mb = 256;
10
int default_multidb_disk_quota_mb = 256;
database/engine/rrdengineapi.h
+1
@@ -12,6 +12,7 @@
12
13
#define RRDENG_FD_BUDGET_PER_INSTANCE (50)
14
15
+extern int db_engine_use_malloc;
16
extern int default_rrdeng_page_cache_mb;
17
extern int default_rrdeng_disk_quota_mb;
18
extern int default_multidb_disk_quota_mb;