summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ifpps.c98
1 files changed, 88 insertions, 10 deletions
diff --git a/ifpps.c b/ifpps.c
index 646c114..c23ac8e 100644
--- a/ifpps.c
+++ b/ifpps.c
@@ -12,10 +12,12 @@
#include <ctype.h>
#include <sys/socket.h>
#include <sys/fsuid.h>
+#include <sys/types.h>
#include <signal.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
+#include <dirent.h>
#include "die.h"
#include "dev.h"
@@ -38,8 +40,9 @@ struct ifstat {
long long unsigned int rx_fifo, rx_frame, rx_multi;
long long unsigned int tx_bytes, tx_packets, tx_drops, tx_errors;
long long unsigned int tx_fifo, tx_colls, tx_carrier;
- uint64_t mem_free, mem_total;
- uint32_t irq_nr, procs_run, procs_iow, cswitch, forks;
+ uint64_t mem_free, mem_total, mem_active, mem_inactive;
+ uint64_t swap_total, swap_free, swap_cached;
+ uint32_t irq_nr, procs_total, procs_run, procs_iow, cswitch, forks;
struct wifi_stat wifi;
/*
* Pointer members need to be last in order for stats_zero() to work
@@ -356,6 +359,21 @@ static int stats_proc_memory(struct ifstat *stats)
} else if ((ptr = strstr(buff, "MemFree:"))) {
ptr += strlen("MemFree:");
stats->mem_free = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "Active:"))) {
+ ptr += strlen("Active:");
+ stats->mem_active = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "Inactive:"))) {
+ ptr += strlen("Inactive:");
+ stats->mem_inactive = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "SwapTotal:"))) {
+ ptr += strlen("SwapTotal:");
+ stats->swap_total = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "SwapFree:"))) {
+ ptr += strlen("SwapFree:");
+ stats->swap_free = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "SwapCached:"))) {
+ ptr += strlen("SwapCached:");
+ stats->swap_cached = strtoul(ptr, &ptr, 10);
}
memset(buff, 0, sizeof(buff));
@@ -418,6 +436,34 @@ next:
return 0;
}
+static int stats_proc_procs(struct ifstat *stats)
+{
+ DIR *dir;
+ struct dirent *e;
+
+ dir = opendir("/proc");
+ if (!dir)
+ panic("Cannot open /proc\n");
+
+ stats->procs_total = 0;
+
+ while ((e = readdir(dir)) != NULL) {
+ const char *name = e->d_name;
+ char *end;
+ unsigned int pid = strtoul(name, &end, 10);
+
+ /* not a number */
+ if (pid == 0 && end == name)
+ continue;
+
+ stats->procs_total++;
+ }
+
+ closedir(dir);
+
+ return 0;
+}
+
static int adjust_dbm_level(int in_dbm, int dbm_val)
{
if (!in_dbm)
@@ -508,6 +554,8 @@ static void stats_fetch(const char *ifname, struct ifstat *stats)
panic("Cannot fetch memory stats!\n");
if (stats_proc_system(stats) < 0)
panic("Cannot fetch system stats!\n");
+ if (stats_proc_procs(stats) < 0)
+ panic("Cannot fetch process stats!\n");
stats_proc_interrupts((char *) ifname, stats);
@@ -676,17 +724,36 @@ static void screen_net_dev_abs(WINDOW *screen, const struct ifstat *abs,
abs->tx_packets, abs->tx_drops, abs->tx_errors);
}
-static void screen_sys_mem(WINDOW *screen, const struct ifstat *rel,
- const struct ifstat *abs, int *voff)
+static void screen_sys(WINDOW *screen, const struct ifstat *rel,
+ const struct ifstat *abs, int *voff)
{
mvwprintw(screen, (*voff)++, 2,
"sys: %14u cs/t "
- "%10.1lf%% mem "
- "%13u running "
+ "%11u procs "
+ "%11u running "
"%10u iowait",
- rel->cswitch,
- (100.0 * (abs->mem_total - abs->mem_free)) / abs->mem_total,
- abs->procs_run, abs->procs_iow);
+ rel->cswitch, abs->procs_total, abs->procs_run, abs->procs_iow);
+}
+
+static void screen_mem_swap(WINDOW *screen, const struct ifstat *abs, int *voff)
+{
+ mvwprintw(screen, (*voff)++, 2,
+ "mem: %13uM total "
+ "%9uM used "
+ "%11uM active "
+ "%10uM inactive",
+ abs->mem_total / 1024,
+ (abs->mem_total - abs->mem_free) / 1024,
+ abs->mem_active / 1024,
+ abs->mem_inactive / 1024);
+
+ mvwprintw(screen, (*voff)++, 2,
+ "swap: %12uM total "
+ "%9uM used "
+ "%11uM cached",
+ abs->swap_total / 1024,
+ (abs->swap_total - abs->swap_free) / 1024,
+ abs->swap_cached / 1024);
}
static void screen_percpu_states_one(WINDOW *screen, const struct ifstat *rel,
@@ -835,7 +902,10 @@ static void screen_update(WINDOW *screen, const char *ifname, const struct ifsta
screen_net_dev_abs(screen, abs, &voff);
voff++;
- screen_sys_mem(screen, rel, abs, &voff);
+ screen_sys(screen, rel, abs, &voff);
+
+ voff++;
+ screen_mem_swap(screen, abs, &voff);
voff++;
screen_percpu_states(screen, rel, top, &voff);
@@ -923,6 +993,10 @@ static void term_csv(const char *ifname, const struct ifstat *rel,
printf("%lu ", abs->mem_free);
printf("%lu ", abs->mem_total - abs->mem_free);
printf("%lu ", abs->mem_total);
+ printf("%lu ", abs->swap_free);
+ printf("%lu ", abs->swap_total - abs->swap_free);
+ printf("%lu ", abs->swap_total);
+ printf("%u ", abs->procs_total);
printf("%u ", abs->procs_run);
printf("%u ", abs->procs_iow);
@@ -992,6 +1066,10 @@ static void term_csv_header(const char *ifname, const struct ifstat *abs,
printf("%d:mem-free ", j++);
printf("%d:mem-used ", j++);
printf("%d:mem-total ", j++);
+ printf("%d:swap-free ", j++);
+ printf("%d:swap-used ", j++);
+ printf("%d:swap-total ", j++);
+ printf("%d:procs-total ", j++);
printf("%d:procs-in-run ", j++);
printf("%d:procs-in-iow ", j++);