finer timing measurements on internal plugins = now each internal plugin has its own timings thus delays on one will not affect the calculations of another; the internal plugins are still running sequencially on one thread but the calculations are more accurate
Costa Tsaousis (ktsaou) committed
Mar 13, 2016 at 14:28 UTC
173e0e46b70b37f2adb717aa01a6f189ac3d207b
2 files changed
+113
-37
src/plugin_proc.c
+112
-37
@@ -15,6 +15,12 @@
15
#include "plugin_proc.h"
16
#include "main.h"
17
18
+unsigned long long sutime() {
19
+ struct timeval now;
20
+ gettimeofday(&now, NULL);
21
+ return now.tv_sec * 1000000ULL + now.tv_usec;
22
+}
23
+
24
void *proc_main(void *ptr)
25
{
26
if(ptr) { ; }
@@ -28,10 +34,6 @@ void *proc_main(void *ptr)
34
error("Cannot set pthread cancel state to ENABLE.");
35
36
struct rusage me, thread;
31
- struct timeval last, now;
32
-
33
- gettimeofday(&last, NULL);
34
- last.tv_sec -= rrd_update_every;
37
38
// disable (by default) various interface that are not needed
39
config_get_boolean("plugin:proc:/proc/net/dev:lo", "enabled", 0);
@@ -55,88 +57,166 @@ void *proc_main(void *ptr)
57
int vdo_sys_kernel_mm_ksm = !config_get_boolean("plugin:proc", "/sys/kernel/mm/ksm", 1);
58
int vdo_cpu_netdata = !config_get_boolean("plugin:proc", "netdata server resources", 1);
59
58
- RRDSET *stcpu = NULL, *stcpu_thread = NULL, *stclients = NULL, *streqs = NULL, *stbytes = NULL;
60
+ // keep track of the time each module was called
61
+ unsigned long long sutime_proc_net_dev = 0ULL;
62
+ unsigned long long sutime_proc_diskstats = 0ULL;
63
+ unsigned long long sutime_proc_net_snmp = 0ULL;
64
+ unsigned long long sutime_proc_net_netstat = 0ULL;
65
+ unsigned long long sutime_proc_net_stat_conntrack = 0ULL;
66
+ unsigned long long sutime_proc_net_ip_vs_stats = 0ULL;
67
+ unsigned long long sutime_proc_stat = 0ULL;
68
+ unsigned long long sutime_proc_meminfo = 0ULL;
69
+ unsigned long long sutime_proc_vmstat = 0ULL;
70
+ unsigned long long sutime_proc_net_rpc_nfsd = 0ULL;
71
+ unsigned long long sutime_proc_sys_kernel_random_entropy_avail = 0ULL;
72
+ unsigned long long sutime_proc_interrupts = 0ULL;
73
+ unsigned long long sutime_proc_softirqs = 0ULL;
74
+ unsigned long long sutime_proc_loadavg = 0ULL;
75
+ unsigned long long sutime_sys_kernel_mm_ksm = 0ULL;
76
+
77
+ // the next time we will run - aligned properly
78
+ unsigned long long sunext = (time(NULL) - (time(NULL) % rrd_update_every) + rrd_update_every) * 1000000ULL;
79
+ unsigned long long sunow;
80
60
- gettimeofday(&last, NULL);
81
+ RRDSET *stcpu = NULL, *stcpu_thread = NULL, *stclients = NULL, *streqs = NULL, *stbytes = NULL;
82
62
- unsigned long long usec = 0, susec = 0;
83
for(;1;) {
84
if(unlikely(netdata_exit)) break;
85
86
+ // delay until it is our time to run
87
+ while((sunow = sutime()) < sunext)
88
+ usleep((useconds_t)(sunext - sunow));
89
+
90
+ // find the next time we need to run
91
+ while(sutime() > sunext)
92
+ sunext += rrd_update_every * 1000000ULL;
93
+
94
+ if(unlikely(netdata_exit)) break;
95
+
96
// BEGIN -- the job to be done
97
98
if(!vdo_sys_kernel_mm_ksm) {
99
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_sys_kernel_mm_ksm().");
70
- vdo_sys_kernel_mm_ksm = do_sys_kernel_mm_ksm(rrd_update_every, usec+susec);
100
+
101
+ sunow = sutime();
102
+ vdo_sys_kernel_mm_ksm = do_sys_kernel_mm_ksm(rrd_update_every, (sutime_sys_kernel_mm_ksm > 0)?sunow - sutime_sys_kernel_mm_ksm:0ULL);
103
+ sutime_sys_kernel_mm_ksm = sunow;
104
}
105
+ if(unlikely(netdata_exit)) break;
106
+
107
if(!vdo_proc_loadavg) {
108
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_loadavg().");
74
- vdo_proc_loadavg = do_proc_loadavg(rrd_update_every, usec+susec);
109
+ sunow = sutime();
110
+ vdo_proc_loadavg = do_proc_loadavg(rrd_update_every, (sutime_proc_loadavg > 0)?sunow - sutime_proc_loadavg:0ULL);
111
+ sutime_proc_loadavg = sunow;
112
}
113
+ if(unlikely(netdata_exit)) break;
114
+
115
if(!vdo_proc_interrupts) {
116
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_interrupts().");
78
- vdo_proc_interrupts = do_proc_interrupts(rrd_update_every, usec+susec);
117
+ sunow = sutime();
118
+ vdo_proc_interrupts = do_proc_interrupts(rrd_update_every, (sutime_proc_interrupts > 0)?sunow - sutime_proc_interrupts:0ULL);
119
+ sutime_proc_interrupts = sunow;
120
}
121
+ if(unlikely(netdata_exit)) break;
122
+
123
if(!vdo_proc_softirqs) {
124
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_softirqs().");
82
- vdo_proc_softirqs = do_proc_softirqs(rrd_update_every, usec+susec);
125
+ sunow = sutime();
126
+ vdo_proc_softirqs = do_proc_softirqs(rrd_update_every, (sutime_proc_softirqs > 0)?sunow - sutime_proc_softirqs:0ULL);
127
+ sutime_proc_softirqs = sunow;
128
}
129
+ if(unlikely(netdata_exit)) break;
130
+
131
if(!vdo_proc_sys_kernel_random_entropy_avail) {
132
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_sys_kernel_random_entropy_avail().");
86
- vdo_proc_sys_kernel_random_entropy_avail = do_proc_sys_kernel_random_entropy_avail(rrd_update_every, usec+susec);
133
+ sunow = sutime();
134
+ vdo_proc_sys_kernel_random_entropy_avail = do_proc_sys_kernel_random_entropy_avail(rrd_update_every, (sutime_proc_sys_kernel_random_entropy_avail > 0)?sunow - sutime_proc_sys_kernel_random_entropy_avail:0ULL);
135
+ sutime_proc_sys_kernel_random_entropy_avail = sunow;
136
}
137
+ if(unlikely(netdata_exit)) break;
138
+
139
if(!vdo_proc_net_dev) {
140
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_dev().");
90
- vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, usec+susec);
141
+ sunow = sutime();
142
+ vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, (sutime_proc_net_dev > 0)?sunow - sutime_proc_net_dev:0ULL);
143
+ sutime_proc_net_dev = sunow;
144
}
145
+ if(unlikely(netdata_exit)) break;
146
+
147
if(!vdo_proc_diskstats) {
148
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_diskstats().");
94
- vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, usec+susec);
149
+ sunow = sutime();
150
+ vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, (sutime_proc_diskstats > 0)?sunow - sutime_proc_diskstats:0ULL);
151
+ sutime_proc_diskstats = sunow;
152
}
153
+ if(unlikely(netdata_exit)) break;
154
+
155
if(!vdo_proc_net_snmp) {
156
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp().");
98
- vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, usec+susec);
157
+ sunow = sutime();
158
+ vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, (sutime_proc_net_snmp > 0)?sunow - sutime_proc_net_snmp:0ULL);
159
+ sutime_proc_net_snmp = sunow;
160
}
161
+ if(unlikely(netdata_exit)) break;
162
+
163
if(!vdo_proc_net_netstat) {
164
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_netstat().");
102
- vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, usec+susec);
165
+ sunow = sutime();
166
+ vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, (sutime_proc_net_netstat > 0)?sunow - sutime_proc_net_netstat:0ULL);
167
+ sutime_proc_net_netstat = sunow;
168
}
169
+ if(unlikely(netdata_exit)) break;
170
+
171
if(!vdo_proc_net_stat_conntrack) {
172
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_stat_conntrack().");
106
- vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(rrd_update_every, usec+susec);
173
+ sunow = sutime();
174
+ vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(rrd_update_every, (sutime_proc_net_stat_conntrack > 0)?sunow - sutime_proc_net_stat_conntrack:0ULL);
175
+ sutime_proc_net_stat_conntrack = sunow;
176
}
177
+ if(unlikely(netdata_exit)) break;
178
+
179
if(!vdo_proc_net_ip_vs_stats) {
180
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_ip_vs_stats().");
110
- vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(rrd_update_every, usec+susec);
181
+ sunow = sutime();
182
+ vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(rrd_update_every, (sutime_proc_net_ip_vs_stats > 0)?sunow - sutime_proc_net_ip_vs_stats:0ULL);
183
+ sutime_proc_net_ip_vs_stats = sunow;
184
}
185
+ if(unlikely(netdata_exit)) break;
186
+
187
if(!vdo_proc_stat) {
188
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_stat().");
114
- vdo_proc_stat = do_proc_stat(rrd_update_every, usec+susec);
189
+ sunow = sutime();
190
+ vdo_proc_stat = do_proc_stat(rrd_update_every, (sutime_proc_stat > 0)?sunow - sutime_proc_stat:0ULL);
191
+ sutime_proc_stat = sunow;
192
}
193
+ if(unlikely(netdata_exit)) break;
194
+
195
if(!vdo_proc_meminfo) {
196
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_meminfo().");
118
- vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, usec+susec);
197
+ sunow = sutime();
198
+ vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, (sutime_proc_meminfo > 0)?sunow - sutime_proc_meminfo:0ULL);
199
+ sutime_proc_meminfo = sunow;
200
}
201
+ if(unlikely(netdata_exit)) break;
202
+
203
if(!vdo_proc_vmstat) {
204
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_vmstat().");
122
- vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, usec+susec);
205
+ sunow = sutime();
206
+ vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, (sutime_proc_vmstat > 0)?sunow - sutime_proc_vmstat:0ULL);
207
+ sutime_proc_vmstat = sunow;
208
}
209
+ if(unlikely(netdata_exit)) break;
210
+
211
if(!vdo_proc_net_rpc_nfsd) {
212
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfsd().");
126
- vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(rrd_update_every, usec+susec);
213
+ sunow = sutime();
214
+ vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(rrd_update_every, (sutime_proc_net_rpc_nfsd > 0)?sunow - sutime_proc_net_rpc_nfsd:0ULL);
215
+ sutime_proc_net_rpc_nfsd = sunow;
216
}
128
-
129
- // END -- the job is done
130
-
217
if(unlikely(netdata_exit)) break;
218
133
- // find the time to sleep in order to wait exactly update_every seconds
134
- gettimeofday(&now, NULL);
135
- usec = usecdiff(&now, &last) - susec;
136
- debug(D_PROCNETDEV_LOOP, "PROCNETDEV: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec);
137
-
138
- if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec;
139
- else susec = rrd_update_every * 1000000ULL / 2ULL;
219
+ // END -- the job is done
220
221
// --------------------------------------------------------------------
222
@@ -213,11 +293,6 @@ void *proc_main(void *ptr)
293
rrddim_set(stbytes, "out", global_statistics.bytes_sent);
294
rrdset_done(stbytes);
295
}
216
-
217
- usleep((useconds_t) susec);
218
-
219
- // copy current to last
220
- bcopy(&now, &last, sizeof(struct timeval));
296
}
297
298
pthread_exit(NULL);
src/proc_loadavg.c
+1
@@ -5,6 +5,7 @@
5
#include <stdlib.h>
6
#include <string.h>
7
8
+#include "log.h"
9
#include "common.h"
10
#include "appconfig.h"
11
#include "procfile.h"