use perfstat_pagingspace for swap metrics if libperfstat is available
This commit is contained in:
parent
af3804e1d8
commit
ffc18694f4
|
@ -297,6 +297,23 @@ static int sigar_perfstat_init(sigar_t *sigar)
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sigar->perfstat.swap =
|
||||||
|
(perfstat_swap_func_t)dlsym(handle,
|
||||||
|
"sigar_perfstat_pagingspace");
|
||||||
|
|
||||||
|
if (!sigar->perfstat.swap) {
|
||||||
|
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"dlsym(sigar_perfstat_pagingspace) failed: %s",
|
||||||
|
dlerror());
|
||||||
|
}
|
||||||
|
|
||||||
|
dlclose(handle);
|
||||||
|
|
||||||
|
sigar->perfstat.avail = -1;
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
sigar->perfstat.avail = 1;
|
sigar->perfstat.avail = 1;
|
||||||
sigar->perfstat.handle = handle;
|
sigar->perfstat.handle = handle;
|
||||||
|
|
||||||
|
@ -441,7 +458,7 @@ static int swaps_get(swaps_t *swaps)
|
||||||
|
|
||||||
int swapqry(char *path, struct pginfo *info);
|
int swapqry(char *path, struct pginfo *info);
|
||||||
|
|
||||||
int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
static int sigar_swap_get_swapqry(sigar_t *sigar, sigar_swap_t *swap)
|
||||||
{
|
{
|
||||||
int status, i;
|
int status, i;
|
||||||
|
|
||||||
|
@ -489,6 +506,59 @@ int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SWAP_DEV(ps) \
|
||||||
|
((ps.type == LV_PAGING) ? \
|
||||||
|
ps.id.lv_paging.vgname : \
|
||||||
|
ps.id.nfs_paging.filename)
|
||||||
|
|
||||||
|
#define SWAP_MB_TO_BYTES(v) ((v) * (1024 * 1024))
|
||||||
|
|
||||||
|
static int sigar_swap_get_perfstat(sigar_t *sigar, sigar_swap_t *swap)
|
||||||
|
{
|
||||||
|
perfstat_pagingspace_t ps;
|
||||||
|
perfstat_id_t id;
|
||||||
|
|
||||||
|
id.name[0] = '\0';
|
||||||
|
|
||||||
|
SIGAR_ZERO(swap);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (sigar->perfstat.swap(&id, &ps, sizeof(ps), 1) != 1) {
|
||||||
|
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"[swap] dev=%s query failed: %s",
|
||||||
|
SWAP_DEV(ps),
|
||||||
|
sigar_strerror(sigar, errno));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"[swap] dev=%s: total=%lluMb, used=%lluMb",
|
||||||
|
SWAP_DEV(ps), ps.mb_size, ps.mb_used);
|
||||||
|
}
|
||||||
|
/* convert MB sizes to bytes */
|
||||||
|
swap->total += SWAP_MB_TO_BYTES(ps.mb_size);
|
||||||
|
swap->used += SWAP_MB_TO_BYTES(ps.mb_used);
|
||||||
|
} while (id.name[0] != '\0');
|
||||||
|
|
||||||
|
swap->free = swap->total - swap->used;
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
||||||
|
{
|
||||||
|
if (sigar_perfstat_init(sigar) == SIGAR_OK) {
|
||||||
|
sigar_log(sigar, SIGAR_LOG_DEBUG, "[swap] using libperfstat");
|
||||||
|
return sigar_swap_get_perfstat(sigar, swap);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sigar_log(sigar, SIGAR_LOG_DEBUG, "[swap] using /dev/kmem");
|
||||||
|
return sigar_swap_get_swapqry(sigar, swap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
|
int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
|
||||||
{
|
{
|
||||||
int i, status;
|
int i, status;
|
||||||
|
|
|
@ -18,3 +18,10 @@ int sigar_perfstat_cpu(perfstat_id_t *id,
|
||||||
return perfstat_cpu(id, cpu, size, num);
|
return perfstat_cpu(id, cpu, size, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sigar_perfstat_pagingspace(perfstat_id_t *id,
|
||||||
|
perfstat_pagingspace_t *pagingspace,
|
||||||
|
size_t size,
|
||||||
|
int num)
|
||||||
|
{
|
||||||
|
return perfstat_pagingspace(id, pagingspace, size, num);
|
||||||
|
}
|
||||||
|
|
|
@ -33,6 +33,10 @@ typedef int (*perfstat_cpu_func_t)(perfstat_id_t *,
|
||||||
perfstat_cpu_t *,
|
perfstat_cpu_t *,
|
||||||
size_t, int);
|
size_t, int);
|
||||||
|
|
||||||
|
typedef int (*perfstat_swap_func_t)(perfstat_id_t *,
|
||||||
|
perfstat_pagingspace_t *,
|
||||||
|
size_t, int);
|
||||||
|
|
||||||
struct sigar_t {
|
struct sigar_t {
|
||||||
SIGAR_T_BASE;
|
SIGAR_T_BASE;
|
||||||
int kmem;
|
int kmem;
|
||||||
|
@ -44,6 +48,7 @@ struct sigar_t {
|
||||||
int avail;
|
int avail;
|
||||||
perfstat_cpu_func_t cpu;
|
perfstat_cpu_func_t cpu;
|
||||||
perfstat_cpu_total_func_t cpu_total;
|
perfstat_cpu_total_func_t cpu_total;
|
||||||
|
perfstat_swap_func_t swap;
|
||||||
void *handle;
|
void *handle;
|
||||||
} perfstat;
|
} perfstat;
|
||||||
int pagesize;
|
int pagesize;
|
||||||
|
|
Loading…
Reference in New Issue