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 },