better timing for apps.plugin and the internal proc plugin
Costa Tsaousis (ktsaou) committed
Nov 14, 2016 at 01:32 UTC
6cd8b76b0a1ce22f82c4fb23c19f351ee8cfe56d
3 files changed
+110
-115
src/apps_plugin.c
+7
-17
@@ -2828,22 +2828,16 @@ int main(int argc, char **argv)
2828
, RATES_DETAIL
2829
);
2830
2831
-#ifndef PROFILING_MODE
2832
- unsigned long long sunext = (time(NULL) - (time(NULL) % update_every) + update_every) * 1000000ULL;
2833
-#endif /* PROFILING_MODE */
2834
-
2831
+ unsigned long long step = update_every * 1000000ULL;
2832
global_iterations_counter = 1;
2833
for(;1; global_iterations_counter++) {
2837
-#ifndef PROFILING_MODE
2838
- unsigned long long sunow;
2839
- // delay until it is our time to run
2840
- while((sunow = time_usec()) < sunext)
2841
- sleep_usec(sunext - sunow);
2834
+ unsigned long long now = time_usec();
2835
+ unsigned long long next = now - (now % step) + step;
2836
2843
- // find the next time we need to run
2844
- while(time_usec() > sunext)
2845
- sunext += update_every * 1000000ULL;
2846
-#endif /* PROFILING_MODE */
2837
+ while(now < next) {
2838
+ sleep_usec(next - now);
2839
+ now = time_usec();
2840
+ }
2841
2842
if(!collect_data_for_all_processes_from_proc()) {
2843
error("Cannot collect /proc data for running processes. Disabling apps.plugin...");
@@ -2879,11 +2873,7 @@ int main(int argc, char **argv)
2873
2874
time_t current_t = time(NULL);
2875
2882
-#ifndef PROFILING_MODE
2876
// restart check (14400 seconds)
2877
if(current_t - started_t > 14400) exit(0);
2885
-#else
2886
- if(current_t - started_t > 10) exit(0);
2887
-#endif /* PROFILING_MODE */
2878
}
2879
}
src/plugin_proc.c
+67
-72
@@ -61,20 +61,15 @@ void *proc_main(void *ptr)
61
unsigned long long sutime_ipc = 0ULL;
62
unsigned long long sutime_sys_kernel_mm_ksm = 0ULL;
63
64
- // the next time we will run - aligned properly
65
- unsigned long long sunext = (time(NULL) - (time(NULL) % rrd_update_every) + rrd_update_every) * 1000000ULL;
66
-
64
+ unsigned long long step = rrd_update_every * 1000000ULL;
65
for(;;) {
68
- unsigned long long sunow;
69
- if(unlikely(netdata_exit)) break;
66
+ unsigned long long now = time_usec();
67
+ unsigned long long next = now - (now % step) + step;
68
71
- // delay until it is our time to run
72
- while((sunow = time_usec()) < sunext)
73
- sleep_usec(sunext - sunow);
74
-
75
- // find the next time we need to run
76
- while(time_usec() > sunext)
77
- sunext += rrd_update_every * 1000000ULL;
69
+ while(now < next) {
70
+ sleep_usec(next - now);
71
+ now = time_usec();
72
+ }
73
74
if(unlikely(netdata_exit)) break;
75
@@ -83,161 +78,161 @@ void *proc_main(void *ptr)
78
if(!vdo_sys_kernel_mm_ksm) {
79
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_sys_kernel_mm_ksm().");
80
86
- sunow = time_usec();
87
- 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);
88
- sutime_sys_kernel_mm_ksm = sunow;
81
+ now = time_usec();
82
+ vdo_sys_kernel_mm_ksm = do_sys_kernel_mm_ksm(rrd_update_every, (sutime_sys_kernel_mm_ksm > 0)?now - sutime_sys_kernel_mm_ksm:0ULL);
83
+ sutime_sys_kernel_mm_ksm = now;
84
}
85
if(unlikely(netdata_exit)) break;
86
87
if(!vdo_proc_loadavg) {
88
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_loadavg().");
94
- sunow = time_usec();
95
- vdo_proc_loadavg = do_proc_loadavg(rrd_update_every, (sutime_proc_loadavg > 0)?sunow - sutime_proc_loadavg:0ULL);
96
- sutime_proc_loadavg = sunow;
89
+ now = time_usec();
90
+ vdo_proc_loadavg = do_proc_loadavg(rrd_update_every, (sutime_proc_loadavg > 0)?now - sutime_proc_loadavg:0ULL);
91
+ sutime_proc_loadavg = now;
92
}
93
if(unlikely(netdata_exit)) break;
94
95
if(!vdo_ipc) {
96
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_ipc().");
102
- sunow = time_usec();
103
- vdo_ipc = do_ipc(rrd_update_every, (sutime_ipc > 0)?sunow - sutime_ipc:0ULL);
104
- sutime_ipc = sunow;
97
+ now = time_usec();
98
+ vdo_ipc = do_ipc(rrd_update_every, (sutime_ipc > 0)?now - sutime_ipc:0ULL);
99
+ sutime_ipc = now;
100
}
101
if(unlikely(netdata_exit)) break;
102
103
if(!vdo_proc_interrupts) {
104
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_interrupts().");
110
- sunow = time_usec();
111
- vdo_proc_interrupts = do_proc_interrupts(rrd_update_every, (sutime_proc_interrupts > 0)?sunow - sutime_proc_interrupts:0ULL);
112
- sutime_proc_interrupts = sunow;
105
+ now = time_usec();
106
+ vdo_proc_interrupts = do_proc_interrupts(rrd_update_every, (sutime_proc_interrupts > 0)?now - sutime_proc_interrupts:0ULL);
107
+ sutime_proc_interrupts = now;
108
}
109
if(unlikely(netdata_exit)) break;
110
111
if(!vdo_proc_softirqs) {
112
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_softirqs().");
118
- sunow = time_usec();
119
- vdo_proc_softirqs = do_proc_softirqs(rrd_update_every, (sutime_proc_softirqs > 0)?sunow - sutime_proc_softirqs:0ULL);
120
- sutime_proc_softirqs = sunow;
113
+ now = time_usec();
114
+ vdo_proc_softirqs = do_proc_softirqs(rrd_update_every, (sutime_proc_softirqs > 0)?now - sutime_proc_softirqs:0ULL);
115
+ sutime_proc_softirqs = now;
116
}
117
if(unlikely(netdata_exit)) break;
118
119
if(!vdo_proc_net_softnet_stat) {
120
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_softnet_stat().");
126
- sunow = time_usec();
127
- vdo_proc_net_softnet_stat = do_proc_net_softnet_stat(rrd_update_every, (sutime_proc_net_softnet_stat > 0)?sunow - sutime_proc_net_softnet_stat:0ULL);
128
- sutime_proc_net_softnet_stat = sunow;
121
+ now = time_usec();
122
+ vdo_proc_net_softnet_stat = do_proc_net_softnet_stat(rrd_update_every, (sutime_proc_net_softnet_stat > 0)?now - sutime_proc_net_softnet_stat:0ULL);
123
+ sutime_proc_net_softnet_stat = now;
124
}
125
if(unlikely(netdata_exit)) break;
126
127
if(!vdo_proc_sys_kernel_random_entropy_avail) {
128
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_sys_kernel_random_entropy_avail().");
134
- sunow = time_usec();
135
- 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);
136
- sutime_proc_sys_kernel_random_entropy_avail = sunow;
129
+ now = time_usec();
130
+ 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)?now - sutime_proc_sys_kernel_random_entropy_avail:0ULL);
131
+ sutime_proc_sys_kernel_random_entropy_avail = now;
132
}
133
if(unlikely(netdata_exit)) break;
134
135
if(!vdo_proc_net_dev) {
136
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_dev().");
142
- sunow = time_usec();
143
- vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, (sutime_proc_net_dev > 0)?sunow - sutime_proc_net_dev:0ULL);
144
- sutime_proc_net_dev = sunow;
137
+ now = time_usec();
138
+ vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, (sutime_proc_net_dev > 0)?now - sutime_proc_net_dev:0ULL);
139
+ sutime_proc_net_dev = now;
140
}
141
if(unlikely(netdata_exit)) break;
142
143
if(!vdo_proc_diskstats) {
144
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_diskstats().");
150
- sunow = time_usec();
151
- vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, (sutime_proc_diskstats > 0)?sunow - sutime_proc_diskstats:0ULL);
152
- sutime_proc_diskstats = sunow;
145
+ now = time_usec();
146
+ vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, (sutime_proc_diskstats > 0)?now - sutime_proc_diskstats:0ULL);
147
+ sutime_proc_diskstats = now;
148
}
149
if(unlikely(netdata_exit)) break;
150
151
if(!vdo_proc_net_snmp) {
152
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp().");
158
- sunow = time_usec();
159
- vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, (sutime_proc_net_snmp > 0)?sunow - sutime_proc_net_snmp:0ULL);
160
- sutime_proc_net_snmp = sunow;
153
+ now = time_usec();
154
+ vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, (sutime_proc_net_snmp > 0)?now - sutime_proc_net_snmp:0ULL);
155
+ sutime_proc_net_snmp = now;
156
}
157
if(unlikely(netdata_exit)) break;
158
159
if(!vdo_proc_net_snmp6) {
160
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp6().");
166
- sunow = time_usec();
167
- vdo_proc_net_snmp6 = do_proc_net_snmp6(rrd_update_every, (sutime_proc_net_snmp6 > 0)?sunow - sutime_proc_net_snmp6:0ULL);
168
- sutime_proc_net_snmp6 = sunow;
161
+ now = time_usec();
162
+ vdo_proc_net_snmp6 = do_proc_net_snmp6(rrd_update_every, (sutime_proc_net_snmp6 > 0)?now - sutime_proc_net_snmp6:0ULL);
163
+ sutime_proc_net_snmp6 = now;
164
}
165
if(unlikely(netdata_exit)) break;
166
167
if(!vdo_proc_net_netstat) {
168
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_netstat().");
174
- sunow = time_usec();
175
- vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, (sutime_proc_net_netstat > 0)?sunow - sutime_proc_net_netstat:0ULL);
176
- sutime_proc_net_netstat = sunow;
169
+ now = time_usec();
170
+ vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, (sutime_proc_net_netstat > 0)?now - sutime_proc_net_netstat:0ULL);
171
+ sutime_proc_net_netstat = now;
172
}
173
if(unlikely(netdata_exit)) break;
174
175
if(!vdo_proc_net_stat_conntrack) {
176
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_stat_conntrack().");
182
- sunow = time_usec();
183
- 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);
184
- sutime_proc_net_stat_conntrack = sunow;
177
+ now = time_usec();
178
+ vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(rrd_update_every, (sutime_proc_net_stat_conntrack > 0)?now - sutime_proc_net_stat_conntrack:0ULL);
179
+ sutime_proc_net_stat_conntrack = now;
180
}
181
if(unlikely(netdata_exit)) break;
182
183
if(!vdo_proc_net_ip_vs_stats) {
184
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_ip_vs_stats().");
190
- sunow = time_usec();
191
- 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);
192
- sutime_proc_net_ip_vs_stats = sunow;
185
+ now = time_usec();
186
+ vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(rrd_update_every, (sutime_proc_net_ip_vs_stats > 0)?now - sutime_proc_net_ip_vs_stats:0ULL);
187
+ sutime_proc_net_ip_vs_stats = now;
188
}
189
if(unlikely(netdata_exit)) break;
190
191
if(!vdo_proc_net_stat_synproxy) {
192
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_stat_synproxy().");
198
- sunow = time_usec();
199
- vdo_proc_net_stat_synproxy = do_proc_net_stat_synproxy(rrd_update_every, (sutime_proc_net_stat_synproxy > 0)?sunow - sutime_proc_net_stat_synproxy:0ULL);
200
- sutime_proc_net_stat_synproxy = sunow;
193
+ now = time_usec();
194
+ vdo_proc_net_stat_synproxy = do_proc_net_stat_synproxy(rrd_update_every, (sutime_proc_net_stat_synproxy > 0)?now - sutime_proc_net_stat_synproxy:0ULL);
195
+ sutime_proc_net_stat_synproxy = now;
196
}
197
if(unlikely(netdata_exit)) break;
198
199
if(!vdo_proc_stat) {
200
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_stat().");
206
- sunow = time_usec();
207
- vdo_proc_stat = do_proc_stat(rrd_update_every, (sutime_proc_stat > 0)?sunow - sutime_proc_stat:0ULL);
208
- sutime_proc_stat = sunow;
201
+ now = time_usec();
202
+ vdo_proc_stat = do_proc_stat(rrd_update_every, (sutime_proc_stat > 0)?now - sutime_proc_stat:0ULL);
203
+ sutime_proc_stat = now;
204
}
205
if(unlikely(netdata_exit)) break;
206
207
if(!vdo_proc_meminfo) {
208
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_meminfo().");
214
- sunow = time_usec();
215
- vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, (sutime_proc_meminfo > 0)?sunow - sutime_proc_meminfo:0ULL);
216
- sutime_proc_meminfo = sunow;
209
+ now = time_usec();
210
+ vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, (sutime_proc_meminfo > 0)?now - sutime_proc_meminfo:0ULL);
211
+ sutime_proc_meminfo = now;
212
}
213
if(unlikely(netdata_exit)) break;
214
215
if(!vdo_proc_vmstat) {
216
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_vmstat().");
222
- sunow = time_usec();
223
- vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, (sutime_proc_vmstat > 0)?sunow - sutime_proc_vmstat:0ULL);
224
- sutime_proc_vmstat = sunow;
217
+ now = time_usec();
218
+ vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, (sutime_proc_vmstat > 0)?now - sutime_proc_vmstat:0ULL);
219
+ sutime_proc_vmstat = now;
220
}
221
if(unlikely(netdata_exit)) break;
222
223
if(!vdo_proc_net_rpc_nfsd) {
224
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfsd().");
230
- sunow = time_usec();
231
- 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);
232
- sutime_proc_net_rpc_nfsd = sunow;
225
+ now = time_usec();
226
+ vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(rrd_update_every, (sutime_proc_net_rpc_nfsd > 0)?now - sutime_proc_net_rpc_nfsd:0ULL);
227
+ sutime_proc_net_rpc_nfsd = now;
228
}
229
if(unlikely(netdata_exit)) break;
230
231
if(!vdo_proc_net_rpc_nfs) {
232
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfs().");
238
- sunow = time_usec();
239
- vdo_proc_net_rpc_nfs = do_proc_net_rpc_nfs(rrd_update_every, (sutime_proc_net_rpc_nfs > 0)?sunow - sutime_proc_net_rpc_nfs:0ULL);
240
- sutime_proc_net_rpc_nfs = sunow;
233
+ now = time_usec();
234
+ vdo_proc_net_rpc_nfs = do_proc_net_rpc_nfs(rrd_update_every, (sutime_proc_net_rpc_nfs > 0)?now - sutime_proc_net_rpc_nfs:0ULL);
235
+ sutime_proc_net_rpc_nfs = now;
236
}
237
if(unlikely(netdata_exit)) break;
238
src/proc_loadavg.c
+36
-26
@@ -8,6 +8,8 @@ int do_proc_loadavg(int update_every, unsigned long long dt) {
8
9
static procfile *ff = NULL;
10
static int do_loadavg = -1, do_all_processes = -1;
11
+ static unsigned long long last_loadavg_usec = 0;
12
+ static RRDSET *load_chart = NULL, *processes_chart = NULL;
13
14
if(unlikely(!ff)) {
15
char filename[FILENAME_MAX + 1];
@@ -21,8 +23,10 @@ int do_proc_loadavg(int update_every, unsigned long long dt) {
23
if(unlikely(!ff))
24
return 0; // we return 0, so that we will retry to open it next time
25
24
- if(unlikely(do_loadavg == -1)) do_loadavg = config_get_boolean("plugin:proc:/proc/loadavg", "enable load average", 1);
25
- if(unlikely(do_all_processes == -1)) do_all_processes = config_get_boolean("plugin:proc:/proc/loadavg", "enable total processes", 1);
26
+ if(unlikely(do_loadavg == -1)) {
27
+ do_loadavg = config_get_boolean("plugin:proc:/proc/loadavg", "enable load average", 1);
28
+ do_all_processes = config_get_boolean("plugin:proc:/proc/loadavg", "enable total processes", 1);
29
+ }
30
31
if(unlikely(procfile_lines(ff) < 1)) {
32
error("/proc/loadavg has no lines.");
@@ -39,43 +43,49 @@ int do_proc_loadavg(int update_every, unsigned long long dt) {
43
44
//unsigned long long running_processes = strtoull(procfile_lineword(ff, 0, 3), NULL, 10);
45
unsigned long long active_processes = strtoull(procfile_lineword(ff, 0, 4), NULL, 10);
42
- //unsigned long long next_pid = strtoull(procfile_lineword(ff, 0, 5), NULL, 10);
43
-
46
+ //unsigned long long next_pid = strtoull(procfile_lineword(ff, 0, 5), NULL, 10);
47
45
- RRDSET *st;
48
49
// --------------------------------------------------------------------
50
49
- if(likely(do_loadavg)) {
50
- st = rrdset_find_byname("system.load");
51
- if(unlikely(!st)) {
52
- st = rrdset_create("system", "load", NULL, "load", NULL, "System Load Average", "load", 100, (update_every < MIN_LOADAVG_UPDATE_EVERY)?MIN_LOADAVG_UPDATE_EVERY:update_every, RRDSET_TYPE_LINE);
53
-
54
- rrddim_add(st, "load1", NULL, 1, 1000, RRDDIM_ABSOLUTE);
55
- rrddim_add(st, "load5", NULL, 1, 1000, RRDDIM_ABSOLUTE);
56
- rrddim_add(st, "load15", NULL, 1, 1000, RRDDIM_ABSOLUTE);
51
+ if(last_loadavg_usec <= dt) {
52
+ if(likely(do_loadavg)) {
53
+ if(unlikely(!load_chart)) {
54
+ load_chart = rrdset_find_byname("system.load");
55
+ if(unlikely(!load_chart)) {
56
+ load_chart = rrdset_create("system", "load", NULL, "load", NULL, "System Load Average", "load", 100, (update_every < MIN_LOADAVG_UPDATE_EVERY) ? MIN_LOADAVG_UPDATE_EVERY : update_every, RRDSET_TYPE_LINE);
57
+ rrddim_add(load_chart, "load1", NULL, 1, 1000, RRDDIM_ABSOLUTE);
58
+ rrddim_add(load_chart, "load5", NULL, 1, 1000, RRDDIM_ABSOLUTE);
59
+ rrddim_add(load_chart, "load15", NULL, 1, 1000, RRDDIM_ABSOLUTE);
60
+ }
61
+ }
62
+ else
63
+ rrdset_next(load_chart);
64
+
65
+ rrddim_set(load_chart, "load1", (collected_number) (load1 * 1000));
66
+ rrddim_set(load_chart, "load5", (collected_number) (load5 * 1000));
67
+ rrddim_set(load_chart, "load15", (collected_number) (load15 * 1000));
68
+ rrdset_done(load_chart);
69
}
58
- else rrdset_next(st);
70
60
- rrddim_set(st, "load1", (collected_number)(load1 * 1000));
61
- rrddim_set(st, "load5", (collected_number)(load5 * 1000));
62
- rrddim_set(st, "load15", (collected_number)(load15 * 1000));
63
- rrdset_done(st);
71
+ last_loadavg_usec = load_chart->update_every * 1000000ULL;
72
}
73
+ else last_loadavg_usec -= dt;
74
75
// --------------------------------------------------------------------
76
77
if(likely(do_all_processes)) {
69
- st = rrdset_find_byname("system.active_processes");
70
- if(unlikely(!st)) {
71
- st = rrdset_create("system", "active_processes", NULL, "processes", NULL, "System Active Processes", "processes", 750, update_every, RRDSET_TYPE_LINE);
72
-
73
- rrddim_add(st, "active", NULL, 1, 1, RRDDIM_ABSOLUTE);
78
+ if(unlikely(!processes_chart)) {
79
+ processes_chart = rrdset_find_byname("system.active_processes");
80
+ if(unlikely(!processes_chart)) {
81
+ processes_chart = rrdset_create("system", "active_processes", NULL, "processes", NULL, "System Active Processes", "processes", 750, update_every, RRDSET_TYPE_LINE);
82
+ rrddim_add(processes_chart, "active", NULL, 1, 1, RRDDIM_ABSOLUTE);
83
+ }
84
}
75
- else rrdset_next(st);
85
+ else rrdset_next(processes_chart);
86
77
- rrddim_set(st, "active", active_processes);
78
- rrdset_done(st);
87
+ rrddim_set(processes_chart, "active", active_processes);
88
+ rrdset_done(processes_chart);
89
}
90
91
return 0;