@cryptotaxi247 / netdata-1 / commits / 6cd8b76b0

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;