Files
sysbench/src/sb_histogram.h
2017-01-31 20:51:47 +03:00

120 lines
4.0 KiB
C

/* Copyright (C) 2011-2017 Alexey Kopytov.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef SB_HISTOGRAM_H
#define SB_HISTOGRAM_H
#include <stdint.h>
#ifdef HAVE_PTHREAD_H
# include <pthread.h>
#endif
typedef struct {
/*
Cumulative histogram array. Updated 'on demand' by
sb_histogram_get_pct_intermediate(). Protected by 'lock'.
*/
uint64_t *cumulative_array;
/*
Total number of events in cumulative_array. Updated on demand by
sb_histogram_get_pct_intermediate(). Protected by 'lock'.
*/
uint64_t cumulative_nevents;
/*
Temporary array for intermediate percentile calculations. Protected by
'lock'.
*/
uint64_t *temp_array;
/*
Intermediate histogram values are split into multiple slots and updated
with atomics. Aggregations into cumulative values is performed by
sb_histogram_get_pct_intermediate() function.
*/
uint64_t **interm_slots;
/* Number of elements in each array */
size_t array_size;
/* Lower bound of values to track */
double range_min;
/* Upper bound of values to track */
double range_max;
/* Value to deduct to calculate histogram range based on array element */
double range_deduct;
/* Value to multiply to calculate histogram range based array element */
double range_mult;
/*
rwlock to protect cumulative_array and cumulative_nevents from concurrent
updates.
*/
pthread_rwlock_t lock;
} sb_histogram_t;
/* Global latency histogram */
extern sb_histogram_t sb_latency_histogram;
/*
Allocate a new histogram and initialize it with sb_histogram_init().
*/
sb_histogram_t *sb_histogram_new(size_t size, double range_min,
double range_max);
/*
Deallocate a histogram allocated with sb_histogram_new().
*/
void sb_histogram_delete(sb_histogram_t *h);
/*
Initialize a new histogram object with a given array size and value bounds.
*/
int sb_histogram_init(sb_histogram_t *h, size_t size,
double range_min, double range_max);
/* Update histogram with a given value. */
void sb_histogram_update(sb_histogram_t *h, double value);
/*
Calculate a given percentile value from the intermediate histogram values,
then merge intermediate values into cumulative ones atomically, i.e. in a way
that no concurrent updates are lost and will be accounted in either the
current or later merge of intermediate clues.
*/
double sb_histogram_get_pct_intermediate(sb_histogram_t *h, double percentile);
/*
Merge intermediate histogram values into cumulative ones and calculate a given
percentile value from the cumulative array.
*/
double sb_histogram_get_pct_cumulative(sb_histogram_t *h, double percentile);
/*
Similar to sb_histogram_get_pct_cumulative(), but also resets cumulative
stats right after calculating the returned percentile. The reset happens
atomically so that no conucrrent updates are lost after percentile
calculation. This is currently used only by 'checkpoint' reports.
*/
double sb_histogram_get_pct_checkpoint(sb_histogram_t *h, double percentile);
/*
Print a given histogram to stdout
*/
void sb_histogram_print(sb_histogram_t *h);
/* Destroy a given histogram object */
void sb_histogram_done(sb_histogram_t *h);
#endif