diff options
Diffstat (limited to 'tests/ebpf')
-rw-r--r-- | tests/ebpf/README.md | 1 | ||||
-rw-r--r-- | tests/ebpf/ebpf.d.conf | 28 | ||||
-rw-r--r-- | tests/ebpf/ebpf_thread_function.sh.in | 52 | ||||
-rw-r--r-- | tests/ebpf/sync_tester.c | 120 |
4 files changed, 201 insertions, 0 deletions
diff --git a/tests/ebpf/README.md b/tests/ebpf/README.md new file mode 100644 index 00000000..86e3dd87 --- /dev/null +++ b/tests/ebpf/README.md @@ -0,0 +1 @@ +The file `sync_tester.c` can be used to fill all dimensions present in synchronization submenu. diff --git a/tests/ebpf/ebpf.d.conf b/tests/ebpf/ebpf.d.conf new file mode 100644 index 00000000..4b781d53 --- /dev/null +++ b/tests/ebpf/ebpf.d.conf @@ -0,0 +1,28 @@ +[global] + ebpf load mode = entry + apps = yes + cgroups = no + update every = 5 + pid table size = 32768 + btf path = /sys/kernel/btf/ + maps per core = yes + life time = 300 + +[ebpf programs] + cachestat = no + dcstat = no + disk = no + fd = no + filesystem = no + hardirq = no + mdflush = no + mount = no + oomkill = no + process = no + shm = no + socket = no + softirq = no + sync = no + swap = no + vfs = no + network connections = no diff --git a/tests/ebpf/ebpf_thread_function.sh.in b/tests/ebpf/ebpf_thread_function.sh.in new file mode 100644 index 00000000..dd1e7b6e --- /dev/null +++ b/tests/ebpf/ebpf_thread_function.sh.in @@ -0,0 +1,52 @@ +#!/bin/bash + +netdata_ebpf_test_functions() { + echo "QUERYING: ${1}" + curl -k -o /tmp/ebpf_netdata_test_functions.txt "${1}" + TEST=$? + if [ $TEST -ne 0 ]; then + echo "Cannot request run a for ${1}. See '/tmp/ebpf_netdata_test_functions.txt' for more details." + exit 1 + fi + + grep "${2}" /tmp/ebpf_netdata_test_functions.txt >/dev/null + TEST=$? + if [ $TEST -ne 0 ]; then + echo "Cannot find ${2} in the output. See '/tmp/ebpf_netdata_test_functions.txt' for more details.." + exit 1 + fi + + rm /tmp/ebpf_netdata_test_functions.txt +} + +MURL="http://127.0.0.1:19999" +INTERVAL=60 + +if [ -n "$1" ]; then + MURL="$1" +fi + +# Check function loaded +netdata_ebpf_test_functions "${MURL}/api/v1/functions" "ebpf_thread" + +# Check function help +netdata_ebpf_test_functions "${MURL}/api/v1/function?function=ebpf_thread%20help" "allows user to control eBPF threads" + +#Test default request +netdata_ebpf_test_functions "${MURL}/api/v1/function?function=ebpf_thread" "columns" + +#Test thread requests . The mdflush is not enabled, because it is not present in all distributions by default. +#Socket is not in the list, because it will have a complete refactory with next PR +for THREAD in "cachestat" "dc" "disk" "fd" "filesystem" "hardirq" "mount" "oomkill" "process" "shm" "softirq" "sync" "swap" "vfs" ; +do + echo "TESTING ${THREAD}" + netdata_ebpf_test_functions "${MURL}/api/v1/function?function=ebpf_thread%20enable:${THREAD}:${INTERVAL}%20thread:${THREAD}" + sleep 17 + netdata_ebpf_test_functions "${MURL}/api/v1/function?function=ebpf_thread%20thread:${THREAD}" "running" + sleep 17 + netdata_ebpf_test_functions "${MURL}/api/v1/function?function=ebpf_thread%20disable:${THREAD}" + sleep 6 + netdata_ebpf_test_functions "${MURL}/api/v1/function?function=ebpf_thread%20thread:${THREAD}" "stopped" + sleep 6 +done + diff --git a/tests/ebpf/sync_tester.c b/tests/ebpf/sync_tester.c new file mode 100644 index 00000000..373c85c6 --- /dev/null +++ b/tests/ebpf/sync_tester.c @@ -0,0 +1,120 @@ +#include <errno.h> +#include <string.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/types.h> + +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#define __USE_GNU +#include <fcntl.h> +#include <unistd.h> + +void test_sync_file_range(char *output, char *text, size_t length) +{ + int fd = open (output, O_WRONLY | O_CREAT | O_APPEND, 0660); + if (fd < 0 ) { + perror("Cannot get page size"); + return; + } + + int i; + size_t offset = 0; + for ( i = 0 ; i < 10000; i++ ) { + write(fd, text, length); + sync_file_range(fd, offset, length, SYNC_FILE_RANGE_WRITE); + offset += length; + } + + close(fd); + sleep(5); +} + +// test based on IBM example https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/apis/msync.htm +void test_msync(char *output, char *text, size_t length) +{ + int pagesize = sysconf(_SC_PAGE_SIZE); + if (pagesize < 0) { + perror("Cannot get page size"); + return; + } + + int fd = open(output, (O_CREAT | O_TRUNC | O_RDWR), (S_IRWXU | S_IRWXG | S_IRWXO)); + if (fd < 0 ) { + perror("Cannot open file"); + return; + } + + off_t lastoffset = lseek( fd, pagesize, SEEK_SET); + ssize_t written = write(fd, " ", 1); + if ( written != 1 ) { + perror("Write error. "); + close(fd); + return; + } + + off_t my_offset = 0; + void *address = mmap(NULL, pagesize, PROT_WRITE, MAP_SHARED, fd, my_offset); + + if ( address == MAP_FAILED ) { + perror("Map error. "); + close(fd); + return; + } + + (void) strcpy( (char*) address, text); + + if ( msync( address, pagesize, MS_SYNC) < 0 ) { + perror("msync failed with error:"); + } + + close(fd); + sleep(5); +} + +void test_synchronization(char *output, char *text, size_t length, int (*fcnt)(int)) +{ + int fd = open (output, O_WRONLY | O_CREAT | O_APPEND, 0660); + if (fd < 0 ) { + perror("Cannot get page size"); + return; + } + + int i; + for ( i = 0 ; i < 10000; i++ ) + write(fd, text, length); + + fcnt(fd); + close(fd); + + sleep(5); +} + +void remove_files(char **files) { + size_t i = 0; + while (files[i]) { + unlink(files[i]); + i++; + } +} + +int main() +{ + char *default_text = { "This is a simple example to test a PR. The sleep is used to create different peaks on charts.\n" }; + char *files[] = { "fsync.txt", "fdatasync.txt", "syncfs.txt", "msync.txt", "sync_file_range.txt", NULL }; + size_t length = strlen(default_text); + test_synchronization(files[0], default_text, length, fsync); + test_synchronization(files[1], default_text, length, fdatasync); + test_synchronization(files[2], default_text, length, syncfs); + + test_msync(files[3], default_text, length); + + test_sync_file_range(files[4], default_text, length); + + sync(); + + remove_files(files); + + return 0; +} |