X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fzfs_arc.c;h=ebfc54b4453c1e00166ae6dfc08e0695eac09b44;hb=3e0942fc2d97a3028b9244fde6605c9ba68224fe;hp=2edba6d1b68d4abc803b06145d6b2f5376503eca;hpb=10b92353ea2ccf66eabad273799c36225d2efc3f;p=collectd.git diff --git a/src/zfs_arc.c b/src/zfs_arc.c index 2edba6d1..ebfc54b4 100644 --- a/src/zfs_arc.c +++ b/src/zfs_arc.c @@ -3,6 +3,7 @@ * Copyright (C) 2009 Anthony Dewhurst * Copyright (C) 2012 Aurelien Rougemont * Copyright (C) 2013 Xin Li + * Copyright (C) 2014 Marc Fournier * * 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 @@ -21,6 +22,7 @@ * Anthony Dewhurst * Aurelien Rougemont * Xin Li + * Marc Fournier **/ #include "collectd.h" @@ -31,7 +33,28 @@ * Global variables */ -#if !defined(__FreeBSD__) +#if defined(KERNEL_LINUX) +#include "utils_llist.h" +#define ZOL_ARCSTATS_FILE "/proc/spl/kstat/zfs/arcstats" + +typedef llist_t kstat_t; + +static long long get_zfs_value(kstat_t *zfs_stats __attribute__((unused)), + char *name) +{ + llentry_t *e; + + e = llist_search (zfs_stats, name); + if (e == NULL) + { + ERROR ("zfs_arc plugin: `llist_search` failed for key: '%s'.", name); + return (-1); + } + + return ((long long int)e->value); +} + +#elif !defined(__FreeBSD__) // Solaris extern kstat_ctl_t *kc; static long long get_zfs_value(kstat_t *ksp, char *name) @@ -39,7 +62,7 @@ static long long get_zfs_value(kstat_t *ksp, char *name) return (get_kstat_value(ksp, name)); } -#else +#else // FreeBSD #include #include @@ -99,7 +122,7 @@ static int za_read_derive (kstat_t *ksp, const char *kstat_value, tmp = get_zfs_value (ksp, (char *)kstat_value); if (tmp == -1LL) { - ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); + WARNING ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); return (-1); } @@ -117,7 +140,7 @@ static int za_read_gauge (kstat_t *ksp, const char *kstat_value, tmp = get_zfs_value (ksp, (char *)kstat_value); if (tmp == -1LL) { - ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); + WARNING ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); return (-1); } @@ -147,7 +170,74 @@ static int za_read (void) value_t l2_io[2]; kstat_t *ksp = NULL; -#if !defined(__FreeBSD__) +#if KERNEL_LINUX + long long int *llvalues = NULL; + char FileContents[1024 * 10]; + char *fields[3]; + int numfields; + ssize_t len; + + ksp = llist_create (); + if (ksp == NULL) + { + ERROR ("zfs_arc plugin: `llist_create' failed."); + return (-1); + } + + len = read_file_contents (ZOL_ARCSTATS_FILE, FileContents, sizeof(FileContents)); + if (len > 1) + { + + int i=0; + char *pnl = FileContents; + char *pnnl; + + FileContents[len] = '\0'; + + while (pnl != NULL) + { + pnl = strchr(pnl, '\n'); + i++; + if (pnl && (*pnl != '\0')) + pnl++; + } + + if (i > 0) + { + llentry_t *e; + llvalues = malloc(sizeof(long long int) * i); + i = 0; + + pnl = FileContents; + while (pnl != NULL) + { + pnnl = strchr(pnl, '\n'); + if (pnnl != NULL) + *pnnl = '\0'; + + numfields = strsplit (pnl, fields, 4); + if (numfields == 3) + { + llvalues[i] = atoll (fields[2]); + + e = llentry_create (fields[0], &llvalues[i]); + if (e == NULL) + { + ERROR ("zfs_arc plugin: `llentry_create' failed."); + } + else + { + llist_append (ksp, e); + } + } + pnl = pnnl; + if (pnl != NULL) + pnl ++; + } + } + } + +#elif !defined(__FreeBSD__) // Solaris get_kstat (&ksp, "zfs", 0, "arcstats"); if (ksp == NULL) { @@ -161,14 +251,16 @@ static int za_read (void) za_read_gauge (ksp, "l2_size", "cache_size", "L2"); /* Operations */ - za_read_derive (ksp, "allocated","cache_operation", "allocated"); za_read_derive (ksp, "deleted", "cache_operation", "deleted"); +#if __FreeBSD__ + za_read_derive (ksp, "allocated","cache_operation", "allocated"); za_read_derive (ksp, "stolen", "cache_operation", "stolen"); +#endif /* Issue indicators */ za_read_derive (ksp, "mutex_miss", "mutex_operations", "miss"); za_read_derive (ksp, "hash_collisions", "hash_collisions", ""); - + /* Evictions */ za_read_derive (ksp, "evict_l2_cached", "cache_eviction", "cached"); za_read_derive (ksp, "evict_l2_eligible", "cache_eviction", "eligible"); @@ -199,12 +291,24 @@ static int za_read (void) za_submit ("io_octets", "L2", l2_io, /* num values = */ 2); +#if defined(KERNEL_LINUX) + if (llvalues != NULL) + { + free(llvalues); + } + if (ksp != NULL) + { + + llist_destroy (ksp); + } +#endif + return (0); } /* int za_read */ static int za_init (void) /* {{{ */ { -#if !defined(__FreeBSD__) +#if !defined(__FreeBSD__) && !defined(KERNEL_LINUX) // Solaris /* kstats chain already opened by update_kstat (using *kc), verify everything went fine. */ if (kc == NULL) {