diff options
Diffstat (limited to 'collectors/debugfs.plugin/debugfs_zswap.c')
-rw-r--r-- | collectors/debugfs.plugin/debugfs_zswap.c | 437 |
1 files changed, 0 insertions, 437 deletions
diff --git a/collectors/debugfs.plugin/debugfs_zswap.c b/collectors/debugfs.plugin/debugfs_zswap.c deleted file mode 100644 index 502a04f1f..000000000 --- a/collectors/debugfs.plugin/debugfs_zswap.c +++ /dev/null @@ -1,437 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "debugfs_plugin.h" - -static long system_page_size = 4096; - -static collected_number pages_to_bytes(collected_number value) -{ - return value * system_page_size; -} - -struct netdata_zswap_metric { - const char *filename; - - const char *chart_id; - const char *title; - const char *units; - RRDSET_TYPE charttype; - int prio; - const char *dimension; - RRD_ALGORITHM algorithm; - int divisor; - - int enabled; - int chart_created; - - collected_number value; - collected_number (*convertv)(collected_number v); -}; - -static struct netdata_zswap_metric zswap_calculated_metrics[] = { - {.filename = "", - .chart_id = "pool_compression_ratio", - .dimension = "compression_ratio", - .units = "ratio", - .title = "Zswap compression ratio", - .algorithm = RRD_ALGORITHM_ABSOLUTE, - .charttype = RRDSET_TYPE_LINE, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_COMPRESS_RATIO, - .divisor = 100, - .convertv = NULL, - .value = -1}, -}; - -enum netdata_zswap_calculated { - NETDATA_ZSWAP_COMPRESSION_RATIO_CHART, -}; - -enum netdata_zwap_independent { - NETDATA_ZSWAP_POOL_TOTAL_SIZE, - NETDATA_ZSWAP_STORED_PAGES, - NETDATA_ZSWAP_POOL_LIMIT_HIT, - NETDATA_ZSWAP_WRITTEN_BACK_PAGES, - NETDATA_ZSWAP_SAME_FILLED_PAGES, - NETDATA_ZSWAP_DUPLICATE_ENTRY, - - // Terminator - NETDATA_ZSWAP_SITE_END -}; - -static struct netdata_zswap_metric zswap_independent_metrics[] = { - // https://elixir.bootlin.com/linux/latest/source/mm/zswap.c - {.filename = "/sys/kernel/debug/zswap/pool_total_size", - .chart_id = "pool_compressed_size", - .dimension = "compressed_size", - .units = "bytes", - .title = "Zswap compressed bytes currently stored", - .algorithm = RRD_ALGORITHM_ABSOLUTE, - .charttype = RRDSET_TYPE_AREA, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_POOL_TOT_SIZE, - .divisor = 1, - .convertv = NULL, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/stored_pages", - .chart_id = "pool_raw_size", - .dimension = "uncompressed_size", - .units = "bytes", - .title = "Zswap uncompressed bytes currently stored", - .algorithm = RRD_ALGORITHM_ABSOLUTE, - .charttype = RRDSET_TYPE_AREA, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_STORED_PAGE, - .divisor = 1, - .convertv = pages_to_bytes, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/pool_limit_hit", - .chart_id = "pool_limit_hit", - .dimension = "limit", - .units = "events/s", - .title = "Zswap pool limit was reached", - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_LINE, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_POOL_LIM_HIT, - .divisor = 1, - .convertv = NULL, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/written_back_pages", - .chart_id = "written_back_raw_bytes", - .dimension = "written_back", - .units = "bytes/s", - .title = "Zswap uncomressed bytes written back when pool limit was reached", - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_AREA, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_WRT_BACK_PAGES, - .divisor = 1, - .convertv = pages_to_bytes, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/same_filled_pages", - .chart_id = "same_filled_raw_size", - .dimension = "same_filled", - .units = "bytes", - .title = "Zswap same-value filled uncompressed bytes currently stored", - .algorithm = RRD_ALGORITHM_ABSOLUTE, - .charttype = RRDSET_TYPE_AREA, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_SAME_FILL_PAGE, - .divisor = 1, - .convertv = pages_to_bytes, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/duplicate_entry", - .chart_id = "duplicate_entry", - .dimension = "duplicate", - .units = "entries/s", - .title = "Zswap duplicate store was encountered", - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_LINE, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_DUPP_ENTRY, - .divisor = 1, - .convertv = NULL, - .value = -1}, - - // The terminator - {.filename = NULL, - .chart_id = NULL, - .dimension = NULL, - .units = NULL, - .title = NULL, - .algorithm = RRD_ALGORITHM_ABSOLUTE, - .charttype = RRDSET_TYPE_LINE, - .enabled = CONFIG_BOOLEAN_NO, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = -1, - .value = -1}}; - -enum netdata_zswap_rejected { - NETDATA_ZSWAP_REJECTED_CHART, - NETDATA_ZSWAP_REJECTED_COMPRESS_POOR, - NETDATA_ZSWAP_REJECTED_KMEM_FAIL, - NETDATA_ZSWAP_REJECTED_RALLOC_FAIL, - NETDATA_ZSWAP_REJECTED_RRECLAIM_FAIL, - - // Terminator - NETDATA_ZSWAP_REJECTED_END -}; - -static struct netdata_zswap_metric zswap_rejected_metrics[] = { - {.filename = "/sys/kernel/debug/zswap/", - .chart_id = "rejections", - .dimension = NULL, - .units = "rejections/s", - .title = "Zswap rejections", - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_STACKED, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_REJECTS, - .divisor = 1, - .convertv = NULL, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/reject_compress_poor", - .chart_id = "reject_compress_poor", - .dimension = "compress_poor", - .units = NULL, - .title = NULL, - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_STACKED, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_REJECTS, - .divisor = 1, - .convertv = NULL, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/reject_kmemcache_fail", - .chart_id = "reject_kmemcache_fail", - .dimension = "kmemcache_fail", - .units = NULL, - .title = NULL, - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_STACKED, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_REJECTS, - .divisor = 1, - .convertv = NULL, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/reject_alloc_fail", - .chart_id = "reject_alloc_fail", - .dimension = "alloc_fail", - .units = NULL, - .title = NULL, - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_STACKED, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_REJECTS, - .divisor = 1, - .convertv = NULL, - .value = -1}, - {.filename = "/sys/kernel/debug/zswap/reject_reclaim_fail", - .chart_id = "reject_reclaim_fail", - .dimension = "reclaim_fail", - .units = NULL, - .title = NULL, - .algorithm = RRD_ALGORITHM_INCREMENTAL, - .charttype = RRDSET_TYPE_STACKED, - .enabled = CONFIG_BOOLEAN_YES, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = NETDATA_CHART_PRIO_MEM_ZSWAP_REJECTS, - .divisor = 1, - .convertv = NULL, - .value = -1}, - - // The terminator - {.filename = NULL, - .chart_id = NULL, - .dimension = NULL, - .units = NULL, - .title = NULL, - .algorithm = RRD_ALGORITHM_ABSOLUTE, - .charttype = RRDSET_TYPE_STACKED, - .enabled = CONFIG_BOOLEAN_NO, - .chart_created = CONFIG_BOOLEAN_NO, - .prio = -1, - .value = -1}}; - -int zswap_collect_data(struct netdata_zswap_metric *metric) -{ - char filename[FILENAME_MAX + 1]; - snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, metric->filename); - - if (read_single_number_file(filename, (unsigned long long *)&metric->value)) { - netdata_log_error("Cannot read file %s", filename); - return 1; - } - - if (metric->convertv) - metric->value = metric->convertv(metric->value); - - return 0; -} - -static void -zswap_send_chart(struct netdata_zswap_metric *metric, int update_every, const char *name, const char *option) -{ - fprintf( - stdout, - "CHART mem.zswap_%s '' '%s' '%s' 'zswap' '' '%s' %d %d '%s' 'debugfs.plugin' '%s'\n", - metric->chart_id, - metric->title, - metric->units, - debugfs_rrdset_type_name(metric->charttype), - metric->prio, - update_every, - (!option) ? "" : option, - name); -} - -static void zswap_send_dimension(struct netdata_zswap_metric *metric) -{ - int div = metric->divisor > 0 ? metric->divisor : 1; - fprintf( - stdout, - "DIMENSION '%s' '%s' %s 1 %d ''\n", - metric->dimension, - metric->dimension, - debugfs_rrd_algorithm_name(metric->algorithm), - div); -} - -static void zswap_send_begin(struct netdata_zswap_metric *metric) -{ - fprintf(stdout, "BEGIN mem.zswap_%s\n", metric->chart_id); -} - -static void zswap_send_set(struct netdata_zswap_metric *metric) -{ - fprintf(stdout, "SET %s = %lld\n", metric->dimension, metric->value); -} - -static void zswap_send_end_and_flush() -{ - fprintf(stdout, "END\n"); - fflush(stdout); -} - -static void zswap_independent_chart(struct netdata_zswap_metric *metric, int update_every, const char *name) -{ - if (unlikely(!metric->chart_created)) { - metric->chart_created = CONFIG_BOOLEAN_YES; - - zswap_send_chart(metric, update_every, name, NULL); - zswap_send_dimension(metric); - } - - zswap_send_begin(metric); - zswap_send_set(metric); - zswap_send_end_and_flush(); -} - -void zswap_reject_chart(int update_every, const char *name) -{ - struct netdata_zswap_metric *metric = &zswap_rejected_metrics[NETDATA_ZSWAP_REJECTED_CHART]; - - if (unlikely(!metric->chart_created)) { - metric->chart_created = CONFIG_BOOLEAN_YES; - - zswap_send_chart(metric, update_every, name, NULL); - for (int i = NETDATA_ZSWAP_REJECTED_COMPRESS_POOR; zswap_rejected_metrics[i].filename; i++) { - metric = &zswap_rejected_metrics[i]; - if (likely(metric->enabled)) - zswap_send_dimension(metric); - } - } - - metric = &zswap_rejected_metrics[NETDATA_ZSWAP_REJECTED_CHART]; - zswap_send_begin(metric); - for (int i = NETDATA_ZSWAP_REJECTED_COMPRESS_POOR; zswap_rejected_metrics[i].filename; i++) { - metric = &zswap_rejected_metrics[i]; - if (likely(metric->enabled)) - zswap_send_set(metric); - } - zswap_send_end_and_flush(); -} - -static void zswap_obsolete_charts(int update_every, const char *name) -{ - struct netdata_zswap_metric *metric = NULL; - - for (int i = 0; zswap_independent_metrics[i].filename; i++) { - metric = &zswap_independent_metrics[i]; - if (likely(metric->chart_created)) - zswap_send_chart(metric, update_every, name, "obsolete"); - } - - metric = &zswap_rejected_metrics[NETDATA_ZSWAP_REJECTED_CHART]; - if (likely(metric->chart_created)) - zswap_send_chart(metric, update_every, name, "obsolete"); - - metric = &zswap_calculated_metrics[NETDATA_ZSWAP_COMPRESSION_RATIO_CHART]; - if (likely(metric->chart_created)) - zswap_send_chart(metric, update_every, name, "obsolete"); -} - -#define ZSWAP_STATE_SIZE 1 // Y or N -static int debugfs_is_zswap_enabled() -{ - char filename[FILENAME_MAX + 1]; - snprintfz(filename, FILENAME_MAX, "/sys/module/zswap/parameters/enabled"); // host prefix is not needed here - char state[ZSWAP_STATE_SIZE + 1]; - - int ret = read_file(filename, state, ZSWAP_STATE_SIZE); - - if (unlikely(!ret && !strcmp(state, "Y"))) { - return 0; - } - return 1; -} - -int do_debugfs_zswap(int update_every, const char *name) -{ - static int check_if_enabled = 1; - - if (likely(check_if_enabled && debugfs_is_zswap_enabled())) { - netdata_log_info("Zswap is disabled"); - return 1; - } - - check_if_enabled = 0; - - system_page_size = sysconf(_SC_PAGESIZE); - struct netdata_zswap_metric *metric = NULL; - int enabled = 0; - - for (int i = 0; zswap_independent_metrics[i].filename; i++) { - metric = &zswap_independent_metrics[i]; - if (unlikely(!metric->enabled)) - continue; - if (unlikely(!(metric->enabled = !zswap_collect_data(metric)))) - continue; - zswap_independent_chart(metric, update_every, name); - enabled++; - } - - struct netdata_zswap_metric *metric_size = &zswap_independent_metrics[NETDATA_ZSWAP_POOL_TOTAL_SIZE]; - struct netdata_zswap_metric *metric_raw_size = &zswap_independent_metrics[NETDATA_ZSWAP_STORED_PAGES]; - if (metric_size->enabled && metric_raw_size->enabled) { - metric = &zswap_calculated_metrics[NETDATA_ZSWAP_COMPRESSION_RATIO_CHART]; - metric->value = 0; - if (metric_size->value > 0) - metric->value = - (collected_number)((NETDATA_DOUBLE)metric_raw_size->value / (NETDATA_DOUBLE)metric_size->value * 100); - zswap_independent_chart(metric, update_every, name); - } - - int enabled_rejected = 0; - for (int i = NETDATA_ZSWAP_REJECTED_COMPRESS_POOR; zswap_rejected_metrics[i].filename; i++) { - metric = &zswap_rejected_metrics[i]; - if (unlikely(!metric->enabled)) - continue; - if (unlikely(!(metric->enabled = !zswap_collect_data(metric)))) - continue; - enabled++; - enabled_rejected++; - } - - if (likely(enabled_rejected > 0)) - zswap_reject_chart(update_every, name); - - if (unlikely(!enabled)) { - zswap_obsolete_charts(update_every, name); - return 1; - } - - return 0; -} |