library: Fix up stat API

Adjusted vmstat to use the new API for memory and CPU statistics
This commit is contained in:
Craig Small
2015-06-23 22:22:50 +10:00
parent ca4a09c432
commit 05efbebb66
8 changed files with 208 additions and 119 deletions

139
vmstat.c
View File

@ -52,6 +52,7 @@
#include "proc/version.h"
#include <proc/vmstat.h>
#include <proc/readstat.h>
#include <proc/meminfo.h>
#define UNIT_B 1
#define UNIT_k 1000
@ -285,11 +286,10 @@ static void new_format(void)
unsigned int tog = 0; /* toggle switch for cleaner code */
unsigned int i;
unsigned int hz = Hertz;
unsigned int running, blocked, dummy_1, dummy_2;
jiff cpu_use[2], cpu_nic[2], cpu_sys[2], cpu_idl[2], cpu_iow[2],
cpu_xxx[2], cpu_yyy[2], cpu_sto[2];
jiff duse, dsys, didl, diow, dstl, Div, divo2;
unsigned long pgpgin[2], pgpgout[2], pswpin[2], pswpout[2];
unsigned long pgpgin[2], pgpgout[2], pswpin[2] = {0,0}, pswpout[2];
unsigned int intr[2], ctxt[2];
unsigned int sleep_half;
unsigned long kb_per_page = sysconf(_SC_PAGESIZE) / 1024ul;
@ -299,10 +299,10 @@ static void new_format(void)
char timebuf[32];
struct procps_vmstat *vm_info;
struct procps_stat_info *sys_info;
struct procps_meminfo *mem_info;
sleep_half = (sleep_time / 2);
new_header();
meminfo();
if (procps_vmstat_new(&vm_info) < 0)
xerrx(EXIT_FAILURE,
@ -316,40 +316,59 @@ static void new_format(void)
if (procps_stat_read(sys_info, 0) < 0)
xerrx(EXIT_FAILURE,
_("Unable to read system stat information"));
if (procps_meminfo_new(&mem_info) < 0)
xerrx(EXIT_FAILURE,
_("Unable to create meminfo structure"));
if (procps_meminfo_read(mem_info) < 0)
xerrx(EXIT_FAILURE,
_("Unable to read meminfo information"));
if (t_option) {
(void) time( &the_time );
tm_ptr = localtime( &the_time );
strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm_ptr);
}
duse = procps_stat_get_cpu(sys_info, PROCPS_CPU_USER) +
/* Do the intial fill */
cpu_use[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_USER) +
procps_stat_get_cpu(sys_info, PROCPS_CPU_NICE);
dsys = procps_stat_get_cpu(sys_info, PROCPS_CPU_SYSTEM) +
cpu_sys[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_SYSTEM);
procps_stat_get_cpu(sys_info, PROCPS_CPU_IRQ) +
procps_stat_get_cpu(sys_info, PROCPS_CPU_SIRQ);
didl = procps_stat_get_cpu(sys_info, PROCPS_CPU_IDLE);
diow = procps_stat_get_cpu(sys_info, PROCPS_CPU_IOWAIT);
dstl = procps_stat_get_cpu(sys_info, PROCPS_CPU_STOLEN);
Div = duse + dsys + didl + diow + dstl;
if (!Div) Div = 1, didl = 1;
cpu_idl[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_IDLE);
cpu_iow[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_IOWAIT);
cpu_sto[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_STOLEN);
intr[tog] = procps_stat_get(sys_info, PROCPS_STAT_INTR);
ctxt[tog] = procps_stat_get(sys_info, PROCPS_STAT_CTXT);
pgpgin[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PGPGIN);
pgpgout[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PGPGOUT);
pswpin[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPIN);
pswpout[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPOUT);
Div = cpu_use[tog] + cpu_sys[tog] + cpu_idl[tog] + cpu_iow[tog] + cpu_sto[tog];
if (!Div) {
Div = 1;
cpu_idl[tog] = 1;
}
divo2 = Div / 2UL;
printf(w_option ? wide_format : format,
running, blocked,
unitConvert(kb_swap_used), unitConvert(kb_main_free),
unitConvert(a_option?kb_inactive:kb_main_buffers),
unitConvert(a_option?kb_active:kb_main_cached),
procps_stat_get(sys_info, PROCPS_STAT_PROCS_RUN),
procps_stat_get(sys_info, PROCPS_STAT_PROCS_BLK),
unitConvert(procps_meminfo_get(mem_info, PROCPS_SWAP_USED)),
unitConvert(procps_meminfo_get(mem_info, PROCPS_MEM_FREE)),
unitConvert(procps_meminfo_get(mem_info, (a_option?PROCPS_MEM_INACTIVE:PROCPS_MEM_BUFFERS))),
unitConvert(procps_meminfo_get(mem_info, a_option?PROCPS_MEM_ACTIVE:PROCPS_MEM_CACHED)),
(unsigned)( (unitConvert(procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPIN) * kb_per_page) * hz + divo2) / Div ),
(unsigned)( (unitConvert(procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPOUT) * kb_per_page) * hz + divo2) / Div ),
(unsigned)( (procps_vmstat_get(vm_info, PROCPS_VMSTAT_PGPGIN) * hz + divo2) / Div ),
(unsigned)( (procps_vmstat_get(vm_info, PROCPS_VMSTAT_PGPGOUT) * hz + divo2) / Div ),
(unsigned)( (procps_stat_get(sys_info, PROCPS_STAT_INTERRUPTS) * hz + divo2) / Div ),
(unsigned)( (procps_stat_get(sys_info, PROCPS_STAT_CONTEXT) * hz + divo2) / Div ),
(unsigned)( (100*duse + divo2) / Div ),
(unsigned)( (100*dsys + divo2) / Div ),
(unsigned)( (100*didl + divo2) / Div ),
(unsigned)( (100*diow + divo2) / Div ),
(unsigned)( (100*dstl + divo2) / Div )
(unsigned)( (intr[tog] * hz + divo2) / Div ),
(unsigned)( (ctxt[tog] * hz + divo2) / Div ),
(unsigned)( (100*cpu_use[tog] + divo2) / Div ),
(unsigned)( (100*cpu_sys[tog] + divo2) / Div ),
(unsigned)( (100*cpu_idl[tog] + divo2) / Div ),
(unsigned)( (100*cpu_iow[tog] + divo2) / Div ),
(unsigned)( (100*cpu_sto[tog] + divo2) / Div )
);
if (t_option) {
@ -365,28 +384,31 @@ static void new_format(void)
new_header();
tog = !tog;
meminfo();
if (procps_stat_read(sys_info,0) < 0)
xerrx(EXIT_FAILURE,
_("Unable to read system stat information"));
cpu_use[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_USER);
cpu_nic[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_NICE);
if (procps_vmstat_read(vm_info) < 0)
xerrx(EXIT_FAILURE,
_("Unable to read vmstat information"));
cpu_use[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_USER) +
procps_stat_get_cpu(sys_info, PROCPS_CPU_NICE);
cpu_sys[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_SYSTEM);
procps_stat_get_cpu(sys_info, PROCPS_CPU_IRQ) +
procps_stat_get_cpu(sys_info, PROCPS_CPU_SIRQ);
cpu_idl[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_IDLE);
cpu_iow[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_IOWAIT);
cpu_sto[tog] = procps_stat_get_cpu(sys_info, PROCPS_CPU_STOLEN);
if (procps_vmstat_read(vm_info) < 0)
xerrx(EXIT_FAILURE,
_("Unable to read vmstat information"));
intr[tog] = procps_stat_get(sys_info, PROCPS_STAT_INTR);
ctxt[tog] = procps_stat_get(sys_info, PROCPS_STAT_CTXT);
pgpgin[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PGPGIN);
pgpgout[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PGPGOUT);
pswpin[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPIN);
pswpout[tog] = procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPOUT);
if (procps_meminfo_read(mem_info) < 0)
xerrx(EXIT_FAILURE,
_("Unable to read memory information"));
if (t_option) {
(void) time( &the_time );
@ -394,11 +416,8 @@ static void new_format(void)
strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm_ptr);
}
duse =
cpu_use[tog] - cpu_use[!tog] + cpu_nic[tog] - cpu_nic[!tog];
dsys =
cpu_sys[tog] - cpu_sys[!tog] + cpu_xxx[tog] -
cpu_xxx[!tog] + cpu_yyy[tog] - cpu_yyy[!tog];
duse = cpu_use[tog] - cpu_use[!tog];
dsys = cpu_sys[tog] - cpu_sys[!tog];
didl = cpu_idl[tog] - cpu_idl[!tog];
diow = cpu_iow[tog] - cpu_iow[!tog];
dstl = cpu_sto[tog] - cpu_sto[!tog];
@ -417,11 +436,14 @@ static void new_format(void)
if (!Div) Div = 1, didl = 1;
divo2 = Div / 2UL;
printf(w_option ? wide_format : format,
running,
blocked,
unitConvert(kb_swap_used),unitConvert(kb_main_free),
unitConvert(a_option?kb_inactive:kb_main_buffers),
unitConvert(a_option?kb_active:kb_main_cached),
procps_stat_get(sys_info, PROCPS_STAT_PROCS_RUN),
procps_stat_get(sys_info, PROCPS_STAT_PROCS_BLK),
unitConvert(procps_meminfo_get(mem_info, PROCPS_SWAP_USED)),
unitConvert(procps_meminfo_get(mem_info, PROCPS_MEM_FREE)),
unitConvert(procps_meminfo_get(mem_info,
(a_option?PROCPS_MEM_INACTIVE:PROCPS_MEM_BUFFERS))),
unitConvert(procps_meminfo_get(mem_info,
(a_option?PROCPS_MEM_ACTIVE:PROCPS_MEM_CACHED))),
/*si */
(unsigned)( ( unitConvert((pswpin [tog] - pswpin [!tog])*kb_per_page)+sleep_half )/sleep_time ),
/* so */
@ -816,8 +838,7 @@ static void sum_format(void)
{
struct procps_stat_info *sys_info;
struct procps_vmstat *vm_info;
meminfo();
struct procps_meminfo *mem_info;
if (procps_stat_new(&sys_info) < 0)
xerrx(EXIT_FAILURE,
@ -832,16 +853,26 @@ static void sum_format(void)
xerrx(EXIT_FAILURE,
_("Unable to read vmstat information"));
printf(_("%13lu %s total memory\n"), unitConvert(kb_main_total), szDataUnit);
printf(_("%13lu %s used memory\n"), unitConvert(kb_main_used), szDataUnit);
printf(_("%13lu %s active memory\n"), unitConvert(kb_active), szDataUnit);
printf(_("%13lu %s inactive memory\n"), unitConvert(kb_inactive), szDataUnit);
printf(_("%13lu %s free memory\n"), unitConvert(kb_main_free), szDataUnit);
printf(_("%13lu %s buffer memory\n"), unitConvert(kb_main_buffers), szDataUnit);
printf(_("%13lu %s swap cache\n"), unitConvert(kb_main_cached), szDataUnit);
printf(_("%13lu %s total swap\n"), unitConvert(kb_swap_total), szDataUnit);
printf(_("%13lu %s used swap\n"), unitConvert(kb_swap_used), szDataUnit);
printf(_("%13lu %s free swap\n"), unitConvert(kb_swap_free), szDataUnit);
printf(_("%13lu %s total memory\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_MEM_TOTAL)), szDataUnit);
printf(_("%13lu %s used memory\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_MEM_USED)), szDataUnit);
printf(_("%13lu %s active memory\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_MEM_ACTIVE)), szDataUnit);
printf(_("%13lu %s inactive memory\n"), unitConvert(
procps_meminfo_get(mem_info, PROCPS_MEM_INACTIVE)), szDataUnit);
printf(_("%13lu %s free memory\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_MEM_FREE)), szDataUnit);
printf(_("%13lu %s buffer memory\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_MEM_BUFFERS)), szDataUnit);
printf(_("%13lu %s swap cache\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_MEM_CACHED)), szDataUnit);
printf(_("%13lu %s total swap\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_SWAP_TOTAL)), szDataUnit);
printf(_("%13lu %s used swap\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_SWAP_USED)), szDataUnit);
printf(_("%13lu %s free swap\n"), unitConvert(procps_meminfo_get(
mem_info, PROCPS_SWAP_FREE)), szDataUnit);
printf(_("%13lld non-nice user cpu ticks\n"), procps_stat_get_cpu(sys_info, PROCPS_CPU_USER));
printf(_("%13lld nice user cpu ticks\n"), procps_stat_get_cpu(sys_info, PROCPS_CPU_NICE));
printf(_("%13lld system cpu ticks\n"), procps_stat_get_cpu(sys_info, PROCPS_CPU_SYSTEM));
@ -856,8 +887,8 @@ static void sum_format(void)
printf(_("%13lu pages paged out\n"), procps_vmstat_get(vm_info, PROCPS_VMSTAT_PGPGOUT));
printf(_("%13lu pages swapped in\n"), procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPIN));
printf(_("%13lu pages swapped out\n"), procps_vmstat_get(vm_info, PROCPS_VMSTAT_PSWPOUT));
printf(_("%13u interrupts\n"), procps_stat_get(sys_info, PROCPS_STAT_INTERRUPTS));
printf(_("%13u CPU context switches\n"), procps_stat_get(sys_info, PROCPS_STAT_CONTEXT));
printf(_("%13u interrupts\n"), procps_stat_get(sys_info, PROCPS_STAT_INTR));
printf(_("%13u CPU context switches\n"), procps_stat_get(sys_info, PROCPS_STAT_CTXT));
printf(_("%13u boot time\n"), procps_stat_get(sys_info, PROCPS_STAT_BTIME));
printf(_("%13u forks\n"), procps_stat_get(sys_info, PROCPS_STAT_PROCS));
}