linux 2.6 iostats

This commit is contained in:
Doug MacEachern 2004-12-05 07:10:18 +00:00
parent 8cf3261b03
commit bb42c93df4
2 changed files with 84 additions and 0 deletions

View File

@ -23,6 +23,8 @@
#define PROC_PSTAT "/stat"
#define PROC_PSTATUS "/status"
#define SYS_BLOCK "/sys/block"
/*
* /proc/self/stat fields:
* 1 - pid
@ -103,6 +105,7 @@ int sigar_os_open(sigar_t **sigar)
{
char buffer[BUFSIZ], *ptr;
int status = sigar_file2str(PROC_STAT, buffer, sizeof(buffer));
struct stat sb;
*sigar = malloc(sizeof(**sigar));
@ -124,6 +127,13 @@ int sigar_os_open(sigar_t **sigar)
(*sigar)->ht_enabled = -1;
if (stat(SYS_BLOCK, &sb) == 0) {
(*sigar)->iostat = IOSTAT_SYS;
}
else {
(*sigar)->iostat = IOSTAT_NONE;
}
return SIGAR_OK;
}
@ -996,6 +1006,66 @@ int sigar_file_system_list_get(sigar_t *sigar,
return SIGAR_OK;
}
static int get_iostat_sys(sigar_t *sigar,
const char *dirname,
sigar_file_system_usage_t *fsusage)
{
/* open source is really great */
/* see how intuitive this is */
struct mntent ent;
char buf[1025]; /* buffer for strings within ent */
char stat[1025];
FILE *fp;
char *name, *fsdev = NULL, *ptr;
int partition, status;
if (!(fp = setmntent(MOUNTED, "r"))) {
return errno;
}
while (getmntent_r(fp, &ent, buf, sizeof(buf))) {
if (strEQ(ent.mnt_dir, dirname)) {
fsdev = ent.mnt_fsname;
break;
}
}
endmntent(fp);
if (!fsdev) {
return ENOENT;
}
if (!strnEQ(fsdev, "/dev/", 5)) {
return ENOENT;
}
fsdev += 5;
name = fsdev;
while (!sigar_isdigit(*fsdev)) {
fsdev++;
}
partition = strtoul(fsdev, NULL, 0);
*fsdev = '\0';
sprintf(stat, SYS_BLOCK "/%s/%s%d/stat", name, name, partition);
status = sigar_file2str(stat, buf, sizeof(buf));
if (status != SIGAR_OK) {
return status;
}
ptr = buf;
ptr = sigar_skip_token(ptr);
fsusage->disk_reads = sigar_strtoul(ptr);
ptr = sigar_skip_token(ptr);
fsusage->disk_writes = sigar_strtoul(ptr);
return SIGAR_OK;
}
#include <sys/vfs.h>
#define SIGAR_FS_BLOCKS_TO_BYTES(buf, f) \
@ -1018,6 +1088,14 @@ int sigar_file_system_usage_get(sigar_t *sigar,
fsusage->free_files = buf.f_ffree;
fsusage->use_percent = sigar_file_system_usage_calc_used(sigar, fsusage);
if (sigar->iostat == IOSTAT_SYS) {
if (get_iostat_sys(sigar, dirname, fsusage) == SIGAR_OK) {
return SIGAR_OK;
}
}
fsusage->disk_reads = fsusage->disk_writes = 0;
return SIGAR_OK;
}

View File

@ -30,6 +30,11 @@ typedef struct {
char state;
} linux_proc_stat_t;
typedef enum {
IOSTAT_NONE,
IOSTAT_SYS /* 2.6 */
} linux_iostat_e;
struct sigar_t {
SIGAR_T_BASE;
int ram;
@ -37,6 +42,7 @@ struct sigar_t {
linux_proc_stat_t last_proc_stat;
int ht_enabled;
int lcpu;
linux_iostat_e iostat;
};
#define HAVE_STRERROR_R