X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fswap.c;h=de9b5f3de430ef08fa034df37aae168a9e0f1057;hb=799daf946e48c5c3b5f6b016bc9290fe562f062d;hp=8c09e35f2f0246b43877b5fefd3d3062e6cd512f;hpb=efbeffe4cc730d6e14ba45dddfee9ab5229f07dc;p=collectd.git diff --git a/src/swap.c b/src/swap.c index 8c09e35f..de9b5f3d 100644 --- a/src/swap.c +++ b/src/swap.c @@ -1,6 +1,6 @@ /** * collectd - src/swap.c - * Copyright (C) 2005-2007 Florian octo Forster + * Copyright (C) 2005-2009 Florian octo Forster * * 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 @@ -19,6 +19,16 @@ * Florian octo Forster **/ +#if HAVE_CONFIG_H +# include "config.h" +# undef HAVE_CONFIG_H +#endif +/* avoid swap.h error "Cannot use swapctl in the large files compilation environment" */ +#if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64 +# undef _FILE_OFFSET_BITS +# undef _LARGEFILE64_SOURCE +#endif + #include "collectd.h" #include "common.h" #include "plugin.h" @@ -26,12 +36,18 @@ #if HAVE_SYS_SWAP_H # include #endif +#if HAVE_VM_ANON_H +# include +#endif #if HAVE_SYS_PARAM_H # include #endif #if HAVE_SYS_SYSCTL_H # include #endif +#if HAVE_SYS_DKSTAT_H +# include +#endif #if HAVE_KVM_H # include #endif @@ -52,6 +68,10 @@ static unsigned long long pagesize; static kstat_t *ksp; /* #endif HAVE_LIBKSTAT */ +#elif HAVE_SWAPCTL +/* No global variables */ +/* #endif HAVE_SWAPCTL */ + #elif defined(VM_SWAPUSAGE) /* No global variables */ /* #endif defined(VM_SWAPUSAGE) */ @@ -82,6 +102,10 @@ static int swap_init (void) ksp = NULL; /* #endif HAVE_LIBKSTAT */ +#elif HAVE_SWAPCTL + /* No init stuff */ +/* #endif HAVE_SWAPCTL */ + #elif defined(VM_SWAPUSAGE) /* No init stuff */ /* #endif defined(VM_SWAPUSAGE) */ @@ -123,7 +147,6 @@ static void swap_submit (const char *type_instance, double value) vl.values = values; vl.values_len = 1; - vl.time = time (NULL); sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "swap", sizeof (vl.plugin)); sstrncpy (vl.type, "swap", sizeof (vl.type)); @@ -240,6 +263,84 @@ static int swap_read (void) swap_submit ("reserved", swap_resv); /* #endif HAVE_LIBKSTAT */ +#elif HAVE_SWAPCTL + struct swapent *swap_entries; + int swap_num; + int status; + int i; + + uint64_t used = 0; + uint64_t total = 0; + + /* + * XXX: This is the syntax for the *BSD `swapctl', which has the + * following prototype: + * swapctl (int cmd, void *arg, int misc); + * + * HP-UX and Solaris (and possibly other UNIXes) provide `swapctl', + * too, but with the following prototype: + * swapctl (int cmd, void *arg); + * + * Solaris is usually handled in the KSTAT case above. For other UNIXes + * a separate case for the other version of `swapctl' may be necessary. + */ + swap_num = swapctl (SWAP_NSWAP, NULL, 0); + if (swap_num < 0) + { + ERROR ("swap plugin: swapctl (SWAP_NSWAP) failed with status %i.", + swap_num); + return (-1); + } + else if (swap_num == 0) + return (0); + + swap_entries = calloc (swap_num, sizeof (*swap_entries)); + if (swap_entries == NULL) + { + ERROR ("swap plugin: calloc failed."); + return (-1); + } + + status = swapctl (SWAP_STATS, swap_entries, swap_num); + if (status != swap_num) + { + ERROR ("swap plugin: swapctl (SWAP_STATS) failed with status %i.", + status); + sfree (swap_entries); + return (-1); + } + +#if defined(DEV_BSIZE) && (DEV_BSIZE > 0) +# define C_SWAP_BLOCK_SIZE ((uint64_t) DEV_BSIZE) +#else +# define C_SWAP_BLOCK_SIZE ((uint64_t) 512) +#endif + + for (i = 0; i < swap_num; i++) + { + if ((swap_entries[i].se_flags & SWF_ENABLE) == 0) + continue; + + used += ((uint64_t) swap_entries[i].se_inuse) + * C_SWAP_BLOCK_SIZE; + total += ((uint64_t) swap_entries[i].se_nblks) + * C_SWAP_BLOCK_SIZE; + } + + if (total < used) + { + ERROR ("swap plugin: Total swap space (%"PRIu64") " + "is less than used swap space (%"PRIu64").", + total, used); + return (-1); + } + + swap_submit ("used", (gauge_t) used); + swap_submit ("free", (gauge_t) (total - used)); + + sfree (swap_entries); +/* #endif HAVE_SWAPCTL */ + #elif defined(VM_SWAPUSAGE) int mib[3]; size_t mib_len;