@cryptotaxi247 / netdata-1 / commits / 744b18ba2

eliminated unecessary index lookups from netdata internal stats

Costa Tsaousis (ktsaou) committed Oct 15, 2017 at 02:30 UTC 744b18ba2dd1bbbc2c4c12f5934d5438a2fb30f2
1 file changed +247 -216
src/global_statistics.c
+247 -216
@@ -122,14 +122,6 @@ void global_statistics_charts(void) {
122 static collected_number compression_ratio = -1,
123 average_response_time = -1;
124
125 - static RRDSET *stcpu = NULL,
126 - *stcpu_thread = NULL,
127 - *stclients = NULL,
128 - *streqs = NULL,
129 - *stbytes = NULL,
130 - *stduration = NULL,
131 - *stcompression = NULL;
132 -
125 struct global_statistics gs;
126 struct rusage me, thread;
127
@@ -137,241 +129,280 @@ void global_statistics_charts(void) {
129 getrusage(RUSAGE_THREAD, &thread);
130 getrusage(RUSAGE_SELF, &me);
131
132 + {
133 + static RRDSET *st_cpu_thread = NULL;
134 + static RRDDIM *rd_cpu_thread_user = NULL,
135 + *rd_cpu_thread_system = NULL;
136 +
137 #ifdef __FreeBSD__
141 - if (unlikely(!stcpu_thread)) {
142 - stcpu_thread = rrdset_create_localhost(
143 - "netdata"
144 - , "plugin_freebsd_cpu"
145 - , NULL
146 - , "freebsd"
147 - , NULL
148 - , "NetData FreeBSD Plugin CPU usage"
149 - , "milliseconds/s"
150 - , "netdata"
151 - , "stats"
152 - , 132000
153 - , localhost->rrd_update_every
154 - , RRDSET_TYPE_STACKED
155 - );
138 + if (unlikely(!st_cpu_thread)) {
139 + st_cpu_thread = rrdset_create_localhost(
140 + "netdata"
141 + , "plugin_freebsd_cpu"
142 + , NULL
143 + , "freebsd"
144 + , NULL
145 + , "NetData FreeBSD Plugin CPU usage"
146 + , "milliseconds/s"
147 + , "netdata"
148 + , "stats"
149 + , 132000
150 + , localhost->rrd_update_every
151 + , RRDSET_TYPE_STACKED
152 + );
153 #else
157 - if (unlikely(!stcpu_thread)) {
158 - stcpu_thread = rrdset_create_localhost(
159 - "netdata"
160 - , "plugin_proc_cpu"
161 - , NULL
162 - , "proc"
163 - , NULL
164 - , "NetData Proc Plugin CPU usage"
165 - , "milliseconds/s"
166 - , "netdata"
167 - , "stats"
168 - , 132000
169 - , localhost->rrd_update_every
170 - , RRDSET_TYPE_STACKED
171 - );
154 + if (unlikely(!st_cpu_thread)) {
155 + st_cpu_thread = rrdset_create_localhost(
156 + "netdata"
157 + , "plugin_proc_cpu"
158 + , NULL
159 + , "proc"
160 + , NULL
161 + , "NetData Proc Plugin CPU usage"
162 + , "milliseconds/s"
163 + , "netdata"
164 + , "stats"
165 + , 132000
166 + , localhost->rrd_update_every
167 + , RRDSET_TYPE_STACKED
168 + );
169 #endif
170
174 - rrddim_add(stcpu_thread, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
175 - rrddim_add(stcpu_thread, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
176 - }
177 - else
178 - rrdset_next(stcpu_thread);
171 + rd_cpu_thread_user = rrddim_add(st_cpu_thread, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
172 + rd_cpu_thread_system = rrddim_add(st_cpu_thread, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
173 + }
174 + else
175 + rrdset_next(st_cpu_thread);
176
180 - rrddim_set(stcpu_thread, "user", thread.ru_utime.tv_sec * 1000000ULL + thread.ru_utime.tv_usec);
181 - rrddim_set(stcpu_thread, "system", thread.ru_stime.tv_sec * 1000000ULL + thread.ru_stime.tv_usec);
182 - rrdset_done(stcpu_thread);
177 + rrddim_set_by_pointer(st_cpu_thread, rd_cpu_thread_user, thread.ru_utime.tv_sec * 1000000ULL + thread.ru_utime.tv_usec);
178 + rrddim_set_by_pointer(st_cpu_thread, rd_cpu_thread_system, thread.ru_stime.tv_sec * 1000000ULL + thread.ru_stime.tv_usec);
179 + rrdset_done(st_cpu_thread);
180 + }
181
182 // ----------------------------------------------------------------
183
186 - if (unlikely(!stcpu)) {
187 - stcpu = rrdset_create_localhost(
188 - "netdata"
189 - , "server_cpu"
190 - , NULL
191 - , "netdata"
192 - , NULL
193 - , "NetData CPU usage"
194 - , "milliseconds/s"
195 - , "netdata"
196 - , "stats"
197 - , 130000
198 - , localhost->rrd_update_every
199 - , RRDSET_TYPE_STACKED
200 - );
201 -
202 - rrddim_add(stcpu, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
203 - rrddim_add(stcpu, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
184 + {
185 + static RRDSET *st_cpu = NULL;
186 + static RRDDIM *rd_cpu_user = NULL,
187 + *rd_cpu_system = NULL;
188 +
189 + if (unlikely(!st_cpu)) {
190 + st_cpu = rrdset_create_localhost(
191 + "netdata"
192 + , "server_cpu"
193 + , NULL
194 + , "netdata"
195 + , NULL
196 + , "NetData CPU usage"
197 + , "milliseconds/s"
198 + , "netdata"
199 + , "stats"
200 + , 130000
201 + , localhost->rrd_update_every
202 + , RRDSET_TYPE_STACKED
203 + );
204 +
205 + rd_cpu_user = rrddim_add(st_cpu, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
206 + rd_cpu_system = rrddim_add(st_cpu, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
207 + }
208 + else
209 + rrdset_next(st_cpu);
210 +
211 + rrddim_set_by_pointer(st_cpu, rd_cpu_user, me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec);
212 + rrddim_set_by_pointer(st_cpu, rd_cpu_system, me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec);
213 + rrdset_done(st_cpu);
214 }
205 - else
206 - rrdset_next(stcpu);
207 -
208 - rrddim_set(stcpu, "user", me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec);
209 - rrddim_set(stcpu, "system", me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec);
210 - rrdset_done(stcpu);
215
216 // ----------------------------------------------------------------
217
214 - if (unlikely(!stclients)) {
215 - stclients = rrdset_create_localhost(
216 - "netdata"
217 - , "clients"
218 - , NULL
219 - , "netdata"
220 - , NULL
221 - , "NetData Web Clients"
222 - , "connected clients"
223 - , "netdata"
224 - , "stats"
225 - , 130200
226 - , localhost->rrd_update_every
227 - , RRDSET_TYPE_LINE
228 - );
229 -
230 - rrddim_add(stclients, "clients", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
218 + {
219 + static RRDSET *st_clients = NULL;
220 + static RRDDIM *rd_clients = NULL;
221 +
222 + if (unlikely(!st_clients)) {
223 + st_clients = rrdset_create_localhost(
224 + "netdata"
225 + , "clients"
226 + , NULL
227 + , "netdata"
228 + , NULL
229 + , "NetData Web Clients"
230 + , "connected clients"
231 + , "netdata"
232 + , "stats"
233 + , 130200
234 + , localhost->rrd_update_every
235 + , RRDSET_TYPE_LINE
236 + );
237 +
238 + rd_clients = rrddim_add(st_clients, "clients", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
239 + }
240 + else
241 + rrdset_next(st_clients);
242 +
243 + rrddim_set_by_pointer(st_clients, rd_clients, gs.connected_clients);
244 + rrdset_done(st_clients);
245 }
232 - else
233 - rrdset_next(stclients);
234 -
235 - rrddim_set(stclients, "clients", gs.connected_clients);
236 - rrdset_done(stclients);
246
247 // ----------------------------------------------------------------
248
240 - if (unlikely(!streqs)) {
241 - streqs = rrdset_create_localhost(
242 - "netdata"
243 - , "requests"
244 - , NULL
245 - , "netdata"
246 - , NULL
247 - , "NetData Web Requests"
248 - , "requests/s"
249 - , "netdata"
250 - , "stats"
251 - , 130300
252 - , localhost->rrd_update_every
253 - , RRDSET_TYPE_LINE
254 - );
255 -
256 - rrddim_add(streqs, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
249 + {
250 + static RRDSET *st_reqs = NULL;
251 + static RRDDIM *rd_requests = NULL;
252 +
253 + if (unlikely(!st_reqs)) {
254 + st_reqs = rrdset_create_localhost(
255 + "netdata"
256 + , "requests"
257 + , NULL
258 + , "netdata"
259 + , NULL
260 + , "NetData Web Requests"
261 + , "requests/s"
262 + , "netdata"
263 + , "stats"
264 + , 130300
265 + , localhost->rrd_update_every
266 + , RRDSET_TYPE_LINE
267 + );
268 +
269 + rd_requests = rrddim_add(st_reqs, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
270 + }
271 + else
272 + rrdset_next(st_reqs);
273 +
274 + rrddim_set_by_pointer(st_reqs, rd_requests, (collected_number) gs.web_requests);
275 + rrdset_done(st_reqs);
276 }
258 - else
259 - rrdset_next(streqs);
260 -
261 - rrddim_set(streqs, "requests", (collected_number) gs.web_requests);
262 - rrdset_done(streqs);
277
278 // ----------------------------------------------------------------
279
266 - if (unlikely(!stbytes)) {
267 - stbytes = rrdset_create_localhost(
268 - "netdata"
269 - , "net"
270 - , NULL
271 - , "netdata"
272 - , NULL
273 - , "NetData Network Traffic"
274 - , "kilobits/s"
275 - , "netdata"
276 - , "stats"
277 - , 130000
278 - , localhost->rrd_update_every
279 - , RRDSET_TYPE_AREA
280 - );
281 -
282 - rrddim_add(stbytes, "in", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
283 - rrddim_add(stbytes, "out", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
280 + {
281 + static RRDSET *st_bytes = NULL;
282 + static RRDDIM *rd_in = NULL,
283 + *rd_out = NULL;
284 +
285 + if (unlikely(!st_bytes)) {
286 + st_bytes = rrdset_create_localhost(
287 + "netdata"
288 + , "net"
289 + , NULL
290 + , "netdata"
291 + , NULL
292 + , "NetData Network Traffic"
293 + , "kilobits/s"
294 + , "netdata"
295 + , "stats"
296 + , 130000
297 + , localhost->rrd_update_every
298 + , RRDSET_TYPE_AREA
299 + );
300 +
301 + rd_in = rrddim_add(st_bytes, "in", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
302 + rd_out = rrddim_add(st_bytes, "out", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
303 + }
304 + else
305 + rrdset_next(st_bytes);
306 +
307 + rrddim_set_by_pointer(st_bytes, rd_in, (collected_number) gs.bytes_received);
308 + rrddim_set_by_pointer(st_bytes, rd_out, (collected_number) gs.bytes_sent);
309 + rrdset_done(st_bytes);
310 }
285 - else
286 - rrdset_next(stbytes);
287 -
288 - rrddim_set(stbytes, "in", (collected_number) gs.bytes_received);
289 - rrddim_set(stbytes, "out", (collected_number) gs.bytes_sent);
290 - rrdset_done(stbytes);
311
312 // ----------------------------------------------------------------
313
294 - if (unlikely(!stduration)) {
295 - stduration = rrdset_create_localhost(
296 - "netdata"
297 - , "response_time"
298 - , NULL
299 - , "netdata"
300 - , NULL
301 - , "NetData API Response Time"
302 - , "ms/request"
303 - , "netdata"
304 - , "stats"
305 - , 130400
306 - , localhost->rrd_update_every
307 - , RRDSET_TYPE_LINE
308 - );
309 -
310 - rrddim_add(stduration, "average", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
311 - rrddim_add(stduration, "max", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
314 + {
315 + static RRDSET *st_duration = NULL;
316 + static RRDDIM *rd_average = NULL,
317 + *rd_max = NULL;
318 +
319 + if (unlikely(!st_duration)) {
320 + st_duration = rrdset_create_localhost(
321 + "netdata"
322 + , "response_time"
323 + , NULL
324 + , "netdata"
325 + , NULL
326 + , "NetData API Response Time"
327 + , "ms/request"
328 + , "netdata"
329 + , "stats"
330 + , 130400
331 + , localhost->rrd_update_every
332 + , RRDSET_TYPE_LINE
333 + );
334 +
335 + rd_average = rrddim_add(st_duration, "average", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
336 + rd_max = rrddim_add(st_duration, "max", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
337 + }
338 + else
339 + rrdset_next(st_duration);
340 +
341 + uint64_t gweb_usec = gs.web_usec;
342 + uint64_t gweb_requests = gs.web_requests;
343 +
344 + uint64_t web_usec = (gweb_usec >= old_web_usec) ? gweb_usec - old_web_usec : 0;
345 + uint64_t web_requests = (gweb_requests >= old_web_requests) ? gweb_requests - old_web_requests : 0;
346 +
347 + old_web_usec = gweb_usec;
348 + old_web_requests = gweb_requests;
349 +
350 + if (web_requests)
351 + average_response_time = (collected_number) (web_usec / web_requests);
352 +
353 + if (unlikely(average_response_time != -1))
354 + rrddim_set_by_pointer(st_duration, rd_average, average_response_time);
355 + else
356 + rrddim_set_by_pointer(st_duration, rd_average, 0);
357 +
358 + rrddim_set_by_pointer(st_duration, rd_max, ((gs.web_usec_max)?(collected_number)gs.web_usec_max:average_response_time));
359 + rrdset_done(st_duration);
360 }
313 - else
314 - rrdset_next(stduration);
315 -
316 - uint64_t gweb_usec = gs.web_usec;
317 - uint64_t gweb_requests = gs.web_requests;
318 -
319 - uint64_t web_usec = (gweb_usec >= old_web_usec) ? gweb_usec - old_web_usec : 0;
320 - uint64_t web_requests = (gweb_requests >= old_web_requests) ? gweb_requests - old_web_requests : 0;
321 -
322 - old_web_usec = gweb_usec;
323 - old_web_requests = gweb_requests;
324 -
325 - if (web_requests)
326 - average_response_time = (collected_number) (web_usec / web_requests);
327 -
328 - if (unlikely(average_response_time != -1))
329 - rrddim_set(stduration, "average", average_response_time);
330 - else
331 - rrddim_set(stduration, "average", 0);
332 -
333 - rrddim_set(stduration, "max", ((gs.web_usec_max)?(collected_number)gs.web_usec_max:average_response_time));
334 - rrdset_done(stduration);
361
362 // ----------------------------------------------------------------
363
338 - if (unlikely(!stcompression)) {
339 - stcompression = rrdset_create_localhost(
340 - "netdata"
341 - , "compression_ratio"
342 - , NULL
343 - , "netdata"
344 - , NULL
345 - , "NetData API Responses Compression Savings Ratio"
346 - , "percentage"
347 - , "netdata"
348 - , "stats"
349 - , 130500
350 - , localhost->rrd_update_every
351 - , RRDSET_TYPE_LINE
352 - );
353 -
354 - rrddim_add(stcompression, "savings", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
364 + {
365 + static RRDSET *st_compression = NULL;
366 + static RRDDIM *rd_savings = NULL;
367 +
368 + if (unlikely(!st_compression)) {
369 + st_compression = rrdset_create_localhost(
370 + "netdata"
371 + , "compression_ratio"
372 + , NULL
373 + , "netdata"
374 + , NULL
375 + , "NetData API Responses Compression Savings Ratio"
376 + , "percentage"
377 + , "netdata"
378 + , "stats"
379 + , 130500
380 + , localhost->rrd_update_every
381 + , RRDSET_TYPE_LINE
382 + );
383 +
384 + rd_savings = rrddim_add(st_compression, "savings", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
385 + }
386 + else
387 + rrdset_next(st_compression);
388 +
389 + // since we don't lock here to read the global statistics
390 + // read the smaller value first
391 + unsigned long long gcompressed_content_size = gs.compressed_content_size;
392 + unsigned long long gcontent_size = gs.content_size;
393 +
394 + unsigned long long compressed_content_size = gcompressed_content_size - old_compressed_content_size;
395 + unsigned long long content_size = gcontent_size - old_content_size;
396 +
397 + old_compressed_content_size = gcompressed_content_size;
398 + old_content_size = gcontent_size;
399 +
400 + if (content_size && content_size >= compressed_content_size)
401 + compression_ratio = ((content_size - compressed_content_size) * 100 * 1000) / content_size;
402 +
403 + if (compression_ratio != -1)
404 + rrddim_set_by_pointer(st_compression, rd_savings, compression_ratio);
405 +
406 + rrdset_done(st_compression);
407 }
356 - else
357 - rrdset_next(stcompression);
358 -
359 - // since we don't lock here to read the global statistics
360 - // read the smaller value first
361 - unsigned long long gcompressed_content_size = gs.compressed_content_size;
362 - unsigned long long gcontent_size = gs.content_size;
363 -
364 - unsigned long long compressed_content_size = gcompressed_content_size - old_compressed_content_size;
365 - unsigned long long content_size = gcontent_size - old_content_size;
366 -
367 - old_compressed_content_size = gcompressed_content_size;
368 - old_content_size = gcontent_size;
369 -
370 - if (content_size && content_size >= compressed_content_size)
371 - compression_ratio = ((content_size - compressed_content_size) * 100 * 1000) / content_size;
372 -
373 - if (compression_ratio != -1)
374 - rrddim_set(stcompression, "savings", compression_ratio);
375 -
376 - rrdset_done(stcompression);
408 }