slstatus: add cpu_iowait

This commit introduces the cpu_iowait item, this is the percentage
of cpu time spent waiting on disks. High numbers typically indicate
that your system is not responsive due to disk IO.
This commit also avoid sleeping inside the cpu_perc and cpu_iowait
functions: waiting in either one implies lost info for the other.

Signed-off-by: Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be>
This commit is contained in:
Kurt Van Dijck 2017-09-14 23:58:38 +02:00 committed by Aaron Marcher
parent 57aa6a5164
commit 72a5e52a35
No known key found for this signature in database
GPG key ID: 74B048E5C2474F9A
2 changed files with 34 additions and 11 deletions

View file

@ -16,6 +16,7 @@ static const char unknown_str[] = "n/a";
* battery_power battery power usage battery name * battery_power battery power usage battery name
* battery_state battery charging state battery name * battery_state battery charging state battery name
* cpu_perc cpu usage in percent NULL * cpu_perc cpu usage in percent NULL
* cpu_iowait cpu iowait in percent NULL
* cpu_freq cpu frequency in MHz NULL * cpu_freq cpu frequency in MHz NULL
* datetime date and time format string * datetime date and time format string
* disk_free free disk space in GB mountpoint path * disk_free free disk space in GB mountpoint path

View file

@ -40,6 +40,7 @@ static const char *battery_power(const char *bat);
static const char *battery_state(const char *bat); static const char *battery_state(const char *bat);
static const char *cpu_freq(void); static const char *cpu_freq(void);
static const char *cpu_perc(void); static const char *cpu_perc(void);
static const char *cpu_iowait(void);
static const char *datetime(const char *fmt); static const char *datetime(const char *fmt);
static const char *disk_free(const char *mnt); static const char *disk_free(const char *mnt);
static const char *disk_perc(const char *mnt); static const char *disk_perc(const char *mnt);
@ -177,26 +178,47 @@ cpu_freq(void)
static const char * static const char *
cpu_perc(void) cpu_perc(void)
{ {
struct timespec delay;
int perc; int perc;
long double a[4], b[4]; static long double a[7];
static int valid;
long double b[7];
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2], memcpy(b, a, sizeof(b));
&a[3]) != 4) { if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
&a[3], &a[4], &a[5], &a[6]) != 7) {
return unknown_str;
}
if (!valid) {
valid = 1;
return unknown_str; return unknown_str;
} }
delay.tv_sec = (interval / 2) / 1000; perc = 100 * ((b[0]+b[1]+b[2]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[5]+a[6])) /
delay.tv_nsec = ((interval / 2) % 1000) * 1000000; ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
nanosleep(&delay, NULL);
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf", &b[0], &b[1], &b[2], return bprintf("%d", perc);
&b[3]) != 4) { }
static const char *
cpu_iowait(void)
{
int perc;
static int valid;
static long double a[7];
long double b[7];
memcpy(b, a, sizeof(b));
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
&a[3], &a[4], &a[5], &a[6]) != 7) {
return unknown_str;
}
if (!valid) {
valid = 1;
return unknown_str; return unknown_str;
} }
perc = 100 * ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2])) / perc = 100 * ((b[4]) - (a[4])) /
((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3])); ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
return bprintf("%d", perc); return bprintf("%d", perc);
} }