@cryptotaxi247 / netdata-1 / commits / cefa2189a

Run the /net/dev module of the proc plugin in a separate thread (#12996)

Vladimir Kobal committed May 24, 2022 at 17:45 UTC cefa2189aef363d766561915c946da3c43ee6d49
4 files changed +54 -2
collectors/proc.plugin/plugin_proc.c
+14 -1
@@ -37,7 +37,6 @@ static struct proc_module {
37 {.name = "/proc/pagetypeinfo", .dim = "pagetypeinfo", .func = do_proc_pagetypeinfo},
38
39 // network metrics
40 - {.name = "/proc/net/dev", .dim = "netdev", .func = do_proc_net_dev},
40 {.name = "/proc/net/wireless", .dim = "netwireless", .func = do_proc_net_wireless},
41 {.name = "/proc/net/sockstat", .dim = "sockstat", .func = do_proc_net_sockstat},
42 {.name = "/proc/net/sockstat6", .dim = "sockstat6", .func = do_proc_net_sockstat6},
@@ -84,6 +83,8 @@ static struct proc_module {
83 #error WORKER_UTILIZATION_MAX_JOB_TYPES has to be at least 36
84 #endif
85
86 +static netdata_thread_t *netdev_thread = NULL;
87 +
88 static void proc_main_cleanup(void *ptr)
89 {
90 struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
@@ -91,6 +92,11 @@ static void proc_main_cleanup(void *ptr)
92
93 info("cleaning up...");
94
95 + if (netdev_thread) {
96 + netdata_thread_join(*netdev_thread, NULL);
97 + freez(netdev_thread);
98 + }
99 +
100 static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
101
102 worker_unregister();
@@ -100,6 +106,13 @@ void *proc_main(void *ptr)
106 {
107 worker_register("PROC");
108
109 + if (config_get_boolean("plugin:proc", "/proc/net/dev", CONFIG_BOOLEAN_YES)) {
110 + netdev_thread = mallocz(sizeof(netdata_thread_t));
111 + debug(D_SYSTEM, "Starting thread %s.", THREAD_NETDEV_NAME);
112 + netdata_thread_create(
113 + netdev_thread, THREAD_NETDEV_NAME, NETDATA_THREAD_OPTION_JOINABLE, netdev_main, netdev_thread);
114 + }
115 +
116 netdata_thread_cleanup_push(proc_main_cleanup, ptr);
117
118 config_get_boolean("plugin:proc", "/proc/pagetypeinfo", CONFIG_BOOLEAN_NO);
collectors/proc.plugin/plugin_proc.h
+3 -1
@@ -8,7 +8,9 @@
8 #define PLUGIN_PROC_CONFIG_NAME "proc"
9 #define PLUGIN_PROC_NAME PLUGIN_PROC_CONFIG_NAME ".plugin"
10
11 -extern int do_proc_net_dev(int update_every, usec_t dt);
11 +#define THREAD_NETDEV_NAME "PLUGIN[proc netdev]"
12 +extern void *netdev_main(void *ptr);
13 +
14 extern int do_proc_net_wireless(int update_every, usec_t dt);
15 extern int do_proc_diskstats(int update_every, usec_t dt);
16 extern int do_proc_mdstat(int update_every, usec_t dt);
collectors/proc.plugin/proc_net_dev.c
+36
@@ -1384,3 +1384,39 @@ int do_proc_net_dev(int update_every, usec_t dt) {
1384
1385 return 0;
1386 }
1387 +
1388 +static void netdev_main_cleanup(void *ptr)
1389 +{
1390 + UNUSED(ptr);
1391 +
1392 + info("cleaning up...");
1393 +
1394 + worker_unregister();
1395 +}
1396 +
1397 +void *netdev_main(void *ptr)
1398 +{
1399 + worker_register("NETDEV");
1400 + worker_register_job_name(0, "netdev");
1401 +
1402 + netdata_thread_cleanup_push(netdev_main_cleanup, ptr);
1403 +
1404 + usec_t step = localhost->rrd_update_every * USEC_PER_SEC;
1405 + heartbeat_t hb;
1406 + heartbeat_init(&hb);
1407 +
1408 + while (!netdata_exit) {
1409 + worker_is_idle();
1410 + usec_t hb_dt = heartbeat_next(&hb, step);
1411 +
1412 + if (unlikely(netdata_exit))
1413 + break;
1414 +
1415 + worker_is_busy(0);
1416 + if(do_proc_net_dev(localhost->rrd_update_every, hb_dt))
1417 + break;
1418 + }
1419 +
1420 + netdata_thread_cleanup_pop(1);
1421 + return NULL;
1422 +}
daemon/global_statistics.c
+1
@@ -988,6 +988,7 @@ static struct worker_utilization all_workers_utilization[] = {
988 { .name = "STATSD", .family = "workers plugin statsd", .priority = 1000000 },
989 { .name = "STATSDFLUSH", .family = "workers plugin statsd flush", .priority = 1000000 },
990 { .name = "PROC", .family = "workers plugin proc", .priority = 1000000 },
991 + { .name = "NETDEV", .family = "workers plugin proc netdev", .priority = 1000000 },
992 { .name = "FREEBSD", .family = "workers plugin freebsd", .priority = 1000000 },
993 { .name = "MACOS", .family = "workers plugin macos", .priority = 1000000 },
994 { .name = "CGROUPS", .family = "workers plugin cgroups", .priority = 1000000 },