linux 2.6 iostats
This commit is contained in:
parent
8cf3261b03
commit
bb42c93df4
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue