Florian Forster [Sat, 1 Oct 2016 19:22:12 +0000 (21:22 +0200)]
write_prometheus plugin: Improve performance of metric_cmp().
This function is a hotspot because it is used by bsearch() to look up
metrics in a metric family. This simple (though non-obvious) change
brings prom_write() complexity down from 3000 instructions/call to 2640
instructions/call, i.e. a 12% improvement.
Profiling showed that prom_write() spent 73% of its time in this
function. 36% of time was spent in metric_create() and 19% was spent in
metric_destroy().
This patch replaces these two calls by a stack allocation, reducing the
time prom_write() spends in metric_family_get_metric() to 42%.
Marc Fournier [Tue, 1 Nov 2016 10:54:26 +0000 (11:54 +0100)]
configure.ac: make finding java deterministic
The sort order of the `find` command proves to be dependent on external
factors, which makes `./configure` pick different java versions on
different systems, making the whole build non-reproducible (see
https://reproducible-builds.org/ for more details).
Adding a call to `sort`, with the locale forced, fixes this issue.
Florian Forster [Wed, 26 Oct 2016 15:09:17 +0000 (17:09 +0200)]
src/daemon/utils_time.h: Use composite literals in all macros.
This allows to take the address of all these macros. Unfortunately, this
means we require special macors for initializing static variables, but
fortunately this is not very commonly done.
common.c: Use _LINUX_CAPABILITY_VERSION_3 in cap_header
While check_capability() function already requires
_LINUX_CAPABILITY_VERSION_3 via "#ifdef" since commit 448627953c we still
set the cap_header's version to deprecated _LINUX_CAPABILITY_VERSION. This
results in a warning like
> capability: warning: `collectd' uses 32-bit capabilities (legacy support in use)
from the kernel when a plugin (like iptables) calls our check_capability()
function.
With this commit we will set cap_header to kernel's current capability
version (_LINUX_CAPABILITY_VERSION_3), which is default since
kernel 2.6.26.
Despite this mistake is also found in the collectd-5.5 and 5.6 lines,
the fix is scheduled for 5.7.0 because it will change 2 VL's
type_instances, possibly breaking users' dashboards or alerting.
processes plugin generates spikes on (re)start. That is caused by
wrong counter logic: When collectd (re)started, monitored processes,
which was started before collectd, have non-zero values in
cpu_user/cpu_system/vmem_minflt/vmem_majflt, so `want_init` is false.
What produces spike.
At other hand, processes which are started between read cycles, should
be fully accounted without initialization. So, we must skip only first
cycle for these counters.
Pavel Rochnyack [Mon, 10 Oct 2016 07:07:55 +0000 (13:07 +0600)]
processes plugin: Remove unused fields from structures
Fields cpu_user, cpu_system, vmem_minflt, vmem_majflt are always equal to zero for new entries (which are passed to ps_list_add()).
Values of these fields are not used in `procstat_t` entries too. So, that can be safely removed.
Pshyk, SerhiyX [Tue, 4 Oct 2016 14:31:58 +0000 (15:31 +0100)]
rdtmon: Addressed PR comments
1. use size_t type for all arrays and indexes
2. change malloc()/memset() to calloc()
3. fix minor code style issues
4. add range validation of core id values
5. use 'bytes' type for LLC value
6. add 'memory_bandwidth' type for MBM values
Weirdly, this only surfaces when building with CFLAGS="-O0 -g".
In file included from ./daemon/common.h:33:0,
from grpc.cc:44:
grpc.cc: In member function 'virtual grpc::Status CollectdImpl::PutValues(grpc::ServerContext*, grpc::ServerReader<collectd::PutValuesRequest>*, collectd::PutValuesResponse*)':
./daemon/plugin.h:113:56: sorry, unimplemented: non-trivial designated initializers not supported
#define VALUE_LIST_INIT { .values = NULL, .meta = NULL }
^
grpc.cc:294:22: note: in expansion of macro 'VALUE_LIST_INIT'
value_list_t vl = VALUE_LIST_INIT;
^
The rdtmon plugin collects information provided by monitoring features of
Intel Resource Director Technology (Intel(R) RDT) like Cache Monitoring
Technology (CMT), Memory Bandwidth Monitoring (MBM).
src/daemon/plugin.[ch]: Make the user_data_t* const.
That is, user_data_t* passed to register_* functions. The actual callbacks
are still getting a user_data_t* since they, in theory, would be able to
modify the pointer stored in .data.