summaryrefslogtreecommitdiffstats
path: root/collectors/ebpf.plugin
diff options
context:
space:
mode:
authorthiagoftsm <thiagoftsm@gmail.com>2023-02-27 12:38:15 +0000
committerGitHub <noreply@github.com>2023-02-27 12:38:15 +0000
commit33d9fcb642322d6450b3b61ef47287c95111d9a6 (patch)
tree41239eadec68bb882b70b70518e2e64e85427bbe /collectors/ebpf.plugin
parent919239f3d4b886bcb2f0c1a8b9e38c93be34c80a (diff)
Use vector allocation whenever is possible (eBPF) (#14591)
Diffstat (limited to 'collectors/ebpf.plugin')
-rw-r--r--collectors/ebpf.plugin/ebpf.c29
-rw-r--r--collectors/ebpf.plugin/ebpf.h1
-rw-r--r--collectors/ebpf.plugin/ebpf_apps.c21
-rw-r--r--collectors/ebpf.plugin/ebpf_cachestat.c53
-rw-r--r--collectors/ebpf.plugin/ebpf_cachestat.h1
-rw-r--r--collectors/ebpf.plugin/ebpf_dcstat.c52
-rw-r--r--collectors/ebpf.plugin/ebpf_dcstat.h1
-rw-r--r--collectors/ebpf.plugin/ebpf_fd.c53
-rw-r--r--collectors/ebpf.plugin/ebpf_fd.h1
-rw-r--r--collectors/ebpf.plugin/ebpf_shm.c53
-rw-r--r--collectors/ebpf.plugin/ebpf_shm.h1
-rw-r--r--collectors/ebpf.plugin/ebpf_socket.c53
-rw-r--r--collectors/ebpf.plugin/ebpf_socket.h1
-rw-r--r--collectors/ebpf.plugin/ebpf_vfs.c56
-rw-r--r--collectors/ebpf.plugin/ebpf_vfs.h1
15 files changed, 341 insertions, 36 deletions
diff --git a/collectors/ebpf.plugin/ebpf.c b/collectors/ebpf.plugin/ebpf.c
index 6e3b522f36..87c613796b 100644
--- a/collectors/ebpf.plugin/ebpf.c
+++ b/collectors/ebpf.plugin/ebpf.c
@@ -457,6 +457,35 @@ char *btf_path = NULL;
/*****************************************************************
*
+ * FUNCTIONS USED TO ALLOCATE APPS/CGROUP MEMORIES (ARAL)
+ *
+ *****************************************************************/
+
+/**
+ * Allocate PID ARAL
+ *
+ * Allocate memory using ARAL functions to speed up processing.
+ *
+ * @param name the internal name used for allocated region.
+ * @param size size of each element inside allocated space
+ *
+ * @return It returns the address on success and NULL otherwise.
+ */
+ARAL *ebpf_allocate_pid_aral(char *name, size_t size)
+{
+ static size_t max_elements = NETDATA_EBPF_ALLOC_MAX_PID;
+ if (max_elements < NETDATA_EBPF_ALLOC_MIN_ELEMENTS) {
+ error("Number of elements given is too small, adjusting it for %d", NETDATA_EBPF_ALLOC_MIN_ELEMENTS);
+ max_elements = NETDATA_EBPF_ALLOC_MIN_ELEMENTS;
+ }
+
+ return aral_create(name, size,
+ 0, max_elements,
+ NULL, NULL, NULL, false, false);
+}
+
+/*****************************************************************
+ *
* FUNCTIONS USED TO CLEAN MEMORY AND OPERATE SYSTEM FILES
*
*****************************************************************/
diff --git a/collectors/ebpf.plugin/ebpf.h b/collectors/ebpf.plugin/ebpf.h
index a05c6d6db4..4333e1506d 100644
--- a/collectors/ebpf.plugin/ebpf.h
+++ b/collectors/ebpf.plugin/ebpf.h
@@ -292,6 +292,7 @@ void ebpf_write_chart_obsolete(char *type, char *id, char *title, char *units, c
char *charttype, char *context, int order, int update_every);
void write_histogram_chart(char *family, char *name, const netdata_idx_t *hist, char **dimensions, uint32_t end);
void ebpf_update_disabled_plugin_stats(ebpf_module_t *em);
+ARAL *ebpf_allocate_pid_aral(char *name, size_t size);
extern ebpf_filesystem_partitions_t localfs[];
extern ebpf_sync_syscalls_t local_syscalls[];
extern int ebpf_exit_plugin;
diff --git a/collectors/ebpf.plugin/ebpf_apps.c b/collectors/ebpf.plugin/ebpf_apps.c
index 2442c55dbf..54bd6bee11 100644
--- a/collectors/ebpf.plugin/ebpf_apps.c
+++ b/collectors/ebpf.plugin/ebpf_apps.c
@@ -22,13 +22,10 @@ void ebpf_aral_init(void)
max_elements = NETDATA_EBPF_ALLOC_MIN_ELEMENTS;
}
- ebpf_aral_apps_pid_stat = aral_create("ebpf-pid_stat", sizeof(struct ebpf_pid_stat),
- 0, max_elements,
- NULL, NULL, NULL, false, false);
+ ebpf_aral_apps_pid_stat = ebpf_allocate_pid_aral("ebpf-pid_stat", sizeof(struct ebpf_pid_stat));
+
+ ebpf_aral_process_stat = ebpf_allocate_pid_aral("ebpf-proc_stat", sizeof(ebpf_process_stat_t));
- ebpf_aral_process_stat = aral_create("ebpf-proc_stat", sizeof(ebpf_process_stat_t),
- 0, max_elements,
- NULL, NULL, NULL, false, false);
#ifdef NETDATA_DEV_MODE
info("Plugin is using ARAL with values %d", NETDATA_EBPF_ALLOC_MAX_PID);
#endif
@@ -1021,19 +1018,19 @@ void cleanup_variables_from_other_threads(uint32_t pid)
{
// Clean socket structures
if (socket_bandwidth_curr) {
- freez(socket_bandwidth_curr[pid]);
+ ebpf_socket_release(socket_bandwidth_curr[pid]);
socket_bandwidth_curr[pid] = NULL;
}
// Clean cachestat structure
if (cachestat_pid) {
- freez(cachestat_pid[pid]);
+ ebpf_cachestat_release(cachestat_pid[pid]);
cachestat_pid[pid] = NULL;
}
// Clean directory cache structure
if (dcstat_pid) {
- freez(dcstat_pid[pid]);
+ ebpf_dcstat_release(dcstat_pid[pid]);
dcstat_pid[pid] = NULL;
}
@@ -1045,19 +1042,19 @@ void cleanup_variables_from_other_threads(uint32_t pid)
// Clean vfs structure
if (vfs_pid) {
- freez(vfs_pid[pid]);
+ ebpf_vfs_release(vfs_pid[pid]);
vfs_pid[pid] = NULL;
}
// Clean fd structure
if (fd_pid) {
- freez(fd_pid[pid]);
+ ebpf_fd_release(fd_pid[pid]);
fd_pid[pid] = NULL;
}
// Clean shm structure
if (shm_pid) {
- freez(shm_pid[pid]);
+ ebpf_shm_release(shm_pid[pid]);
shm_pid[pid] = NULL;
}
}
diff --git a/collectors/ebpf.plugin/ebpf_cachestat.c b/collectors/ebpf.plugin/ebpf_cachestat.c
index 58c075230c..5b53804bcb 100644
--- a/collectors/ebpf.plugin/ebpf_cachestat.c
+++ b/collectors/ebpf.plugin/ebpf_cachestat.c
@@ -3,6 +3,10 @@
#include "ebpf.h"
#include "ebpf_cachestat.h"
+// ----------------------------------------------------------------------------
+// ARAL vectors used to speed up processing
+ARAL *ebpf_aral_cachestat_pid;
+
netdata_publish_cachestat_t **cachestat_pid;
static char *cachestat_counter_dimension_name[NETDATA_CACHESTAT_END] = { "ratio", "dirty", "hit",
@@ -366,6 +370,46 @@ static void ebpf_cachestat_exit(void *ptr)
/*****************************************************************
*
+ * ARAL FUNCTIONS
+ *
+ *****************************************************************/
+
+/**
+ * eBPF Cachestat Aral init
+ *
+ * Initiallize array allocator that will be used when integration with apps is enabled.
+ */
+static inline void ebpf_cachestat_aral_init()
+{
+ ebpf_aral_cachestat_pid = ebpf_allocate_pid_aral("ebpf-cachestat", sizeof(netdata_publish_cachestat_t));
+}
+
+/**
+ * eBPF publish cachestat get
+ *
+ * Get a netdata_publish_cachestat_t entry to be used with a specific PID.
+ *
+ * @return it returns the address on success.
+ */
+netdata_publish_cachestat_t *ebpf_publish_cachestat_get(void)
+{
+ netdata_publish_cachestat_t *target = aral_mallocz(ebpf_aral_cachestat_pid);
+ memset(target, 0, sizeof(netdata_publish_cachestat_t));
+ return target;
+}
+
+/**
+ * eBPF cachestat release
+ *
+ * @param stat Release a target after usage.
+ */
+void ebpf_cachestat_release(netdata_publish_cachestat_t *stat)
+{
+ aral_freez(ebpf_aral_cachestat_pid, stat);
+}
+
+/*****************************************************************
+ *
* COMMON FUNCTIONS
*
*****************************************************************/
@@ -502,7 +546,7 @@ static void cachestat_fill_pid(uint32_t current_pid, netdata_cachestat_pid_t *pu
{
netdata_publish_cachestat_t *curr = cachestat_pid[current_pid];
if (!curr) {
- curr = callocz(1, sizeof(netdata_publish_cachestat_t));
+ curr = ebpf_publish_cachestat_get();
cachestat_pid[current_pid] = curr;
cachestat_save_pid_values(curr, publish);
@@ -1167,10 +1211,11 @@ static void ebpf_create_memory_charts(ebpf_module_t *em)
*/
static void ebpf_cachestat_allocate_global_vectors(int apps)
{
- if (apps)
+ if (apps) {
cachestat_pid = callocz((size_t)pid_max, sizeof(netdata_publish_cachestat_t *));
-
- cachestat_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_cachestat_pid_t));
+ ebpf_cachestat_aral_init();
+ cachestat_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_cachestat_pid_t));
+ }
cachestat_values = callocz((size_t)ebpf_nprocs, sizeof(netdata_idx_t));
diff --git a/collectors/ebpf.plugin/ebpf_cachestat.h b/collectors/ebpf.plugin/ebpf_cachestat.h
index 15b06511ec..aaee1ecca9 100644
--- a/collectors/ebpf.plugin/ebpf_cachestat.h
+++ b/collectors/ebpf.plugin/ebpf_cachestat.h
@@ -82,6 +82,7 @@ typedef struct netdata_publish_cachestat {
} netdata_publish_cachestat_t;
void *ebpf_cachestat_thread(void *ptr);
+void ebpf_cachestat_release(netdata_publish_cachestat_t *stat);
extern struct config cachestat_config;
extern netdata_ebpf_targets_t cachestat_targets[];
diff --git a/collectors/ebpf.plugin/ebpf_dcstat.c b/collectors/ebpf.plugin/ebpf_dcstat.c
index 3f26ce6d84..a223511e51 100644
--- a/collectors/ebpf.plugin/ebpf_dcstat.c
+++ b/collectors/ebpf.plugin/ebpf_dcstat.c
@@ -3,6 +3,10 @@
#include "ebpf.h"
#include "ebpf_dcstat.h"
+// ----------------------------------------------------------------------------
+// ARAL vectors used to speed up processing
+ARAL *ebpf_aral_dcstat_pid;
+
static char *dcstat_counter_dimension_name[NETDATA_DCSTAT_IDX_END] = { "ratio", "reference", "slow", "miss" };
static netdata_syscall_stat_t dcstat_counter_aggregated_data[NETDATA_DCSTAT_IDX_END];
static netdata_publish_syscall_t dcstat_counter_publish_aggregated[NETDATA_DCSTAT_IDX_END];
@@ -329,6 +333,46 @@ static void ebpf_dcstat_exit(void *ptr)
/*****************************************************************
*
+ * ARAL FUNCTIONS
+ *
+ *****************************************************************/
+
+/**
+ * eBPF directory cache Aral init
+ *
+ * Initiallize array allocator that will be used when integration with apps is enabled.
+ */
+static inline void ebpf_dcstat_aral_init()
+{
+ ebpf_aral_dcstat_pid = ebpf_allocate_pid_aral("ebpf-dcstat", sizeof(netdata_publish_dcstat_t));
+}
+
+/**
+ * eBPF publish dcstat get
+ *
+ * Get a netdata_publish_dcstat_t entry to be used with a specific PID.
+ *
+ * @return it returns the address on success.
+ */
+netdata_publish_dcstat_t *ebpf_publish_dcstat_get(void)
+{
+ netdata_publish_dcstat_t *target = aral_mallocz(ebpf_aral_dcstat_pid);
+ memset(target, 0, sizeof(netdata_publish_dcstat_t));
+ return target;
+}
+
+/**
+ * eBPF dcstat release
+ *
+ * @param stat Release a target after usage.
+ */
+void ebpf_dcstat_release(netdata_publish_dcstat_t *stat)
+{
+ aral_freez(ebpf_aral_dcstat_pid, stat);
+}
+
+/*****************************************************************
+ *
* APPS
*
*****************************************************************/
@@ -432,7 +476,7 @@ static void dcstat_fill_pid(uint32_t current_pid, netdata_dcstat_pid_t *publish)
{
netdata_publish_dcstat_t *curr = dcstat_pid[current_pid];
if (!curr) {
- curr = callocz(1, sizeof(netdata_publish_dcstat_t));
+ curr = ebpf_publish_dcstat_get();
dcstat_pid[current_pid] = curr;
}
@@ -1064,10 +1108,12 @@ static void ebpf_create_filesystem_charts(int update_every)
*/
static void ebpf_dcstat_allocate_global_vectors(int apps)
{
- if (apps)
+ if (apps) {
+ ebpf_dcstat_aral_init();
dcstat_pid = callocz((size_t)pid_max, sizeof(netdata_publish_dcstat_t *));
+ dcstat_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_dcstat_pid_t));
+ }
- dcstat_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_dcstat_pid_t));
dcstat_values = callocz((size_t)ebpf_nprocs, sizeof(netdata_idx_t));
memset(dcstat_counter_aggregated_data, 0, NETDATA_DCSTAT_IDX_END * sizeof(netdata_syscall_stat_t));
diff --git a/collectors/ebpf.plugin/ebpf_dcstat.h b/collectors/ebpf.plugin/ebpf_dcstat.h
index 201fc8a029..875c7c322d 100644
--- a/collectors/ebpf.plugin/ebpf_dcstat.h
+++ b/collectors/ebpf.plugin/ebpf_dcstat.h
@@ -75,6 +75,7 @@ typedef struct netdata_publish_dcstat {
void *ebpf_dcstat_thread(void *ptr);
void ebpf_dcstat_create_apps_charts(struct ebpf_module *em, void *ptr);
+void ebpf_dcstat_release(netdata_publish_dcstat_t *stat);
extern struct config dcstat_config;
extern netdata_ebpf_targets_t dc_targets[];
extern ebpf_local_maps_t dcstat_maps[];
diff --git a/collectors/ebpf.plugin/ebpf_fd.c b/collectors/ebpf.plugin/ebpf_fd.c
index a542b02efc..7ea92a4630 100644
--- a/collectors/ebpf.plugin/ebpf_fd.c
+++ b/collectors/ebpf.plugin/ebpf_fd.c
@@ -3,6 +3,10 @@
#include "ebpf.h"
#include "ebpf_fd.h"
+// ----------------------------------------------------------------------------
+// ARAL vectors used to speed up processing
+ARAL *ebpf_aral_fd_pid;
+
static char *fd_dimension_names[NETDATA_FD_SYSCALL_END] = { "open", "close" };
static char *fd_id_names[NETDATA_FD_SYSCALL_END] = { "do_sys_open", "__close_fd" };
@@ -396,6 +400,46 @@ static void ebpf_fd_exit(void *ptr)
/*****************************************************************
*
+ * ARAL FUNCTIONS
+ *
+ *****************************************************************/
+
+/**
+ * eBPF file descriptor Aral init
+ *
+ * Initiallize array allocator that will be used when integration with apps is enabled.
+ */
+static inline void ebpf_fd_aral_init()
+{
+ ebpf_aral_fd_pid = ebpf_allocate_pid_aral("ebpf-fd", sizeof(netdata_fd_stat_t));
+}
+
+/**
+ * eBPF publish file descriptor get
+ *
+ * Get a netdata_fd_stat_t entry to be used with a specific PID.
+ *
+ * @return it returns the address on success.
+ */
+netdata_fd_stat_t *ebpf_fd_stat_get(void)
+{
+ netdata_fd_stat_t *target = aral_mallocz(ebpf_aral_fd_pid);
+ memset(target, 0, sizeof(netdata_fd_stat_t));
+ return target;
+}
+
+/**
+ * eBPF file descriptor release
+ *
+ * @param stat Release a target after usage.
+ */
+void ebpf_fd_release(netdata_fd_stat_t *stat)
+{
+ aral_freez(ebpf_aral_fd_pid, stat);
+}
+
+/*****************************************************************
+ *
* MAIN LOOP
*
*****************************************************************/
@@ -479,7 +523,7 @@ static void fd_fill_pid(uint32_t current_pid, netdata_fd_stat_t *publish)
{
netdata_fd_stat_t *curr = fd_pid[current_pid];
if (!curr) {
- curr = callocz(1, sizeof(netdata_fd_stat_t));
+ curr = ebpf_fd_stat_get();
fd_pid[current_pid] = curr;
}
@@ -1070,10 +1114,11 @@ static void ebpf_create_fd_global_charts(ebpf_module_t *em)
*/
static void ebpf_fd_allocate_global_vectors(int apps)
{
- if (apps)
+ if (apps) {
+ ebpf_fd_aral_init();
fd_pid = callocz((size_t)pid_max, sizeof(netdata_fd_stat_t *));
-
- fd_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_fd_stat_t));
+ fd_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_fd_stat_t));
+ }
fd_values = callocz((size_t)ebpf_nprocs, sizeof(netdata_idx_t));
}
diff --git a/collectors/ebpf.plugin/ebpf_fd.h b/collectors/ebpf.plugin/ebpf_fd.h
index e6545d79c4..bc5dca2cbb 100644
--- a/collectors/ebpf.plugin/ebpf_fd.h
+++ b/collectors/ebpf.plugin/ebpf_fd.h
@@ -80,6 +80,7 @@ enum fd_close_syscall {
void *ebpf_fd_thread(void *ptr);
void ebpf_fd_create_apps_charts(struct ebpf_module *em, void *ptr);
+void ebpf_fd_release(netdata_fd_stat_t *stat);
extern struct config fd_config;
extern netdata_fd_stat_t **fd_pid;
extern netdata_ebpf_targets_t fd_targets[];
diff --git a/collectors/ebpf.plugin/ebpf_shm.c b/collectors/ebpf.plugin/ebpf_shm.c
index c2ec943369..0007af12ee 100644
--- a/collectors/ebpf.plugin/ebpf_shm.c
+++ b/collectors/ebpf.plugin/ebpf_shm.c
@@ -3,6 +3,10 @@
#include "ebpf.h"
#include "ebpf_shm.h"
+// ----------------------------------------------------------------------------
+// ARAL vectors used to speed up processing
+ARAL *ebpf_aral_shm_pid;
+
static char *shm_dimension_name[NETDATA_SHM_END] = { "get", "at", "dt", "ctl" };
static netdata_syscall_stat_t shm_aggregated_data[NETDATA_SHM_END];
static netdata_publish_syscall_t shm_publish_aggregated[NETDATA_SHM_END];
@@ -320,6 +324,46 @@ static void ebpf_shm_exit(void *ptr)
}
/*****************************************************************
+ *
+ * ARAL FUNCTIONS
+ *
+ *****************************************************************/
+
+/**
+ * eBPF shared memory Aral init
+ *
+ * Initiallize array allocator that will be used when integration with apps is enabled.
+ */
+static inline void ebpf_shm_aral_init()
+{
+ ebpf_aral_shm_pid = ebpf_allocate_pid_aral("ebpf-shm", sizeof(netdata_publish_shm_t));
+}
+
+/**
+ * eBPF shared memory get
+ *
+ * Get a netdata_publish_shm_t entry to be used with a specific PID.
+ *
+ * @return it returns the address on success.
+ */
+netdata_publish_shm_t *ebpf_shm_stat_get(void)
+{
+ netdata_publish_shm_t *target = aral_mallocz(ebpf_aral_shm_pid);
+ memset(target, 0, sizeof(netdata_publish_shm_t));
+ return target;
+}
+
+/**
+ * eBPF shared memory release
+ *
+ * @param stat Release a target after usage.
+ */
+void ebpf_shm_release(netdata_publish_shm_t *stat)
+{
+ aral_freez(ebpf_aral_shm_pid, stat);
+}
+
+/*****************************************************************
* COLLECTOR THREAD
*****************************************************************/
@@ -355,7 +399,7 @@ static void shm_fill_pid(uint32_t current_pid, netdata_publish_shm_t *publish)
{
netdata_publish_shm_t *curr = shm_pid[current_pid];
if (!curr) {
- curr = callocz(1, sizeof(netdata_publish_shm_t));
+ curr = ebpf_shm_stat_get( );
shm_pid[current_pid] = curr;
}
@@ -945,10 +989,11 @@ void ebpf_shm_create_apps_charts(struct ebpf_module *em, void *ptr)
*/
static void ebpf_shm_allocate_global_vectors(int apps)
{
- if (apps)
+ if (apps) {
+ ebpf_shm_aral_init();
shm_pid = callocz((size_t)pid_max, sizeof(netdata_publish_shm_t *));
-
- shm_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_publish_shm_t));
+ shm_vector = callocz((size_t)ebpf_nprocs, sizeof(netdata_publish_shm_t));
+ }
shm_values = callocz((size_t)ebpf_nprocs, sizeof(netdata_idx_t));
diff --git a/collectors/ebpf.plugin/ebpf_shm.h b/collectors/ebpf.plugin/ebpf_shm.h
index b06a4a5d1e..7f31b96010 100644
--- a/collectors/ebpf.plugin/ebpf_shm.h
+++ b/collectors/ebpf.plugin/ebpf_shm.h
@@ -54,6 +54,7 @@ extern netdata_publish_shm_t **shm_pid;
void *ebpf_shm_thread(void *ptr);
void ebpf_shm_create_apps_charts(struct ebpf_module *em, void *ptr);
+void ebpf_shm_release(netdata_publish_shm_t *stat);
extern netdata_ebpf_targets_t shm_targets[];
extern struct config shm_config;
diff --git a/collectors/ebpf.plugin/ebpf_socket.c b/collectors/ebpf.plugin/ebpf_socket.c
index 6b359888d0..450f8cf383 100644
--- a/collectors/ebpf.plugin/ebpf_socket.c
+++ b/collectors/ebpf.plugin/ebpf_socket.c
@@ -5,6 +5,10 @@
#include "ebpf.h"
#include "ebpf_socket.h"
+// ----------------------------------------------------------------------------
+// ARAL vectors used to speed up processing
+ARAL *ebpf_aral_socket_pid;
+
/*****************************************************************
*
* GLOBAL VARIABLES
@@ -431,6 +435,46 @@ static inline int ebpf_socket_load_and_attach(struct socket_bpf *obj, ebpf_modul
/*****************************************************************
*
+ * ARAL FUNCTIONS
+ *
+ *****************************************************************/
+
+/**
+ * eBPF socket Aral init
+ *
+ * Initiallize array allocator that will be used when integration with apps is enabled.
+ */
+static inline void ebpf_socket_aral_init()
+{
+ ebpf_aral_socket_pid = ebpf_allocate_pid_aral("ebpf-socket", sizeof(ebpf_socket_publish_apps_t));
+}
+
+/**
+ * eBPF socket get
+ *
+ * Get a ebpf_socket_publish_apps_t entry to be used with a specific PID.
+ *
+ * @return it returns the address on success.
+ */
+ebpf_socket_publish_apps_t *ebpf_socket_stat_get(void)
+{
+ ebpf_socket_publish_apps_t *target = aral_mallocz(ebpf_aral_socket_pid);
+ memset(target, 0, sizeof(ebpf_socket_publish_apps_t));
+ return target;
+}
+
+/**
+ * eBPF socket release
+ *
+ * @param stat Release a target after usage.
+ */
+void ebpf_socket_release(ebpf_socket_publish_apps_t *stat)
+{
+ aral_freez(ebpf_aral_socket_pid, stat);
+}
+
+/*****************************************************************
+ *
* FUNCTIONS TO CLOSE THE THREAD
*
*****************************************************************/
@@ -2227,7 +2271,7 @@ void ebpf_socket_fill_publish_apps(uint32_t current_pid, ebpf_bandwidth_t *eb)
{
ebpf_socket_publish_apps_t *curr = socket_bandwidth_curr[current_pid];
if (!curr) {
- curr = callocz(1, sizeof(ebpf_socket_publish_apps_t));
+ curr = ebpf_socket_stat_get();
socket_bandwidth_curr[current_pid] = curr;
}
@@ -2947,10 +2991,11 @@ static void ebpf_socket_allocate_global_vectors(int apps)
memset(socket_publish_aggregated, 0 ,NETDATA_MAX_SOCKET_VECTOR * sizeof(netdata_publish_syscall_t));
socket_hash_values = callocz(ebpf_nprocs, sizeof(netdata_idx_t));
- if (apps)
+ if (apps) {
+ ebpf_socket_aral_init();
socket_bandwidth_curr = callocz((size_t)pid_max, sizeof(ebpf_socket_publish_apps_t *));
-
- bandwidth_vector = callocz((size_t)ebpf_nprocs, sizeof(ebpf_bandwidth_t));
+ bandwidth_vector = callocz((size_t)ebpf_nprocs, sizeof(ebpf_bandwidth_t));
+ }
socket_values = callocz((size_t)ebpf_nprocs, sizeof(netdata_socket_t));
if (network_viewer_opt.enabled) {
diff --git a/collectors/ebpf.plugin/ebpf_socket.h b/collectors/ebpf.plugin/ebpf_socket.h
index 63b1e107ba..a509b40faf 100644
--- a/collectors/ebpf.plugin/ebpf_socket.h
+++ b/collectors/ebpf.plugin/ebpf_socket.h
@@ -363,6 +363,7 @@ void update_listen_table(uint16_t value, uint16_t proto, netdata_passive_connect
void parse_network_viewer_section(struct config *cfg);
void ebpf_fill_ip_list(ebpf_network_viewer_ip_list_t **out, ebpf_network_viewer_ip_list_t *in, char *table);
void parse_service_name_section(struct config *cfg);
+void ebpf_socket_release(ebpf_socket_publish_apps_t *stat);
extern ebpf_socket_publish_apps_t **socket_bandwidth_curr;
extern struct config socket_config;
diff --git a/collectors/ebpf.plugin/ebpf_vfs.c b/collectors/ebpf.plugin/ebpf_vfs.c
index e22c0cade1..ed7c07d9e5 100644
--- a/collectors/ebpf.plugin/ebpf_vfs.c
+++ b/collectors/ebpf.plugin/ebpf_vfs.c
@@ -5,6 +5,10 @@
#include "ebpf.h"
#include "ebpf_vfs.h"
+// ----------------------------------------------------------------------------
+// ARAL vectors used to speed up processing
+ARAL *ebpf_aral_vfs_pid;
+
static char *vfs_dimension_names[NETDATA_KEY_PUBLISH_VFS_END] = { "delete", "read", "write",
"fsync", "open", "create" };
static char *vfs_id_names[NETDATA_KEY_PUBLISH_VFS_END] = { "vfs_unlink", "vfs_read", "vfs_write",
@@ -384,6 +388,46 @@ static inline int ebpf_vfs_load_and_attach(struct vfs_bpf *obj, ebpf_module_t *e
/*****************************************************************
*
+ * ARAL FUNCTIONS
+ *
+ *****************************************************************/
+
+/**
+ * eBPF VFS Aral init
+ *
+ * Initiallize array allocator that will be used when integration with apps is enabled.
+ */
+static inline void ebpf_vfs_aral_init()
+{
+ ebpf_aral_vfs_pid = ebpf_allocate_pid_aral("ebpf-vfs", sizeof(netdata_publish_vfs_t));
+}
+
+/**
+ * eBPF publish VFS get
+ *
+ * Get a netdata_publish_vfs_t entry to be used with a specific PID.
+ *
+ * @return it returns the address on success.
+ */
+netdata_publish_vfs_t *ebpf_vfs_get(void)
+{
+ netdata_publish_vfs_t *target = aral_mallocz(ebpf_aral_vfs_pid);
+ memset(target, 0, sizeof(netdata_publish_vfs_t));
+ return target;
+}
+
+/**
+ * eBPF VFS release
+ *
+ * @param stat Release a target after usage.
+ */
+void ebpf_vfs_release(netdata_publish_vfs_t *stat)
+{
+ aral_freez(ebpf_aral_vfs_pid, stat);
+}
+
+/*****************************************************************
+ *
* FUNCTIONS TO CLOSE THE THREAD
*
*****************************************************************/
@@ -775,7 +819,7 @@ static void vfs_fill_pid(uint32_t current_pid, netdata_publish_vfs_t *publish)
{
netdata_publish_vfs_t *curr = vfs_pid[current_pid];
if (!curr) {
- curr = callocz(1, sizeof(netdata_publish_vfs_t));
+ curr = ebpf_vfs_get();
vfs_pid[current_pid] = curr;
}
@@ -1825,14 +1869,16 @@ void ebpf_vfs_create_apps_charts(struct ebpf_module *em, void *ptr)
*/
static void ebpf_vfs_allocate_global_vectors(int apps)
{
+ if (apps) {
+ ebpf_vfs_aral_init();
+ vfs_pid = callocz((size_t)pid_max, sizeof(netdata_publish_vfs_t *));
+ vfs_vector = callocz(ebpf_nprocs, sizeof(netdata_publish_vfs_t));
+ }
+
memset(vfs_aggregated_data, 0, sizeof(vfs_aggregated_data));
memset(vfs_publish_aggregated, 0, sizeof(vfs_publish_aggregated));
vfs_hash_values = callocz(ebpf_nprocs, sizeof(netdata_idx_t));
- vfs_vector = callocz(ebpf_nprocs, sizeof(netdata_publish_vfs_t));
-
- if (apps)
- vfs_pid = callocz((size_t)pid_max, sizeof(netdata_publish_vfs_t *));
}
/*****************************************************************
diff --git a/collectors/ebpf.plugin/ebpf_vfs.h b/collectors/ebpf.plugin/ebpf_vfs.h
index d7fc2672f9..e97c2d23b9 100644
--- a/collectors/ebpf.plugin/ebpf_vfs.h
+++ b/collectors/ebpf.plugin/ebpf_vfs.h
@@ -168,6 +168,7 @@ extern netdata_publish_vfs_t **vfs_pid;
void *ebpf_vfs_thread(void *ptr);
void ebpf_vfs_create_apps_charts(struct ebpf_module *em, void *ptr);
+void ebpf_vfs_release(netdata_publish_vfs_t *stat);
extern netdata_ebpf_targets_t vfs_targets[];
extern struct config vfs_config;