linux 2.6 iostats
This commit is contained in:
parent
8cf3261b03
commit
bb42c93df4
|
@ -23,6 +23,8 @@
|
||||||
#define PROC_PSTAT "/stat"
|
#define PROC_PSTAT "/stat"
|
||||||
#define PROC_PSTATUS "/status"
|
#define PROC_PSTATUS "/status"
|
||||||
|
|
||||||
|
#define SYS_BLOCK "/sys/block"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* /proc/self/stat fields:
|
* /proc/self/stat fields:
|
||||||
* 1 - pid
|
* 1 - pid
|
||||||
|
@ -103,6 +105,7 @@ int sigar_os_open(sigar_t **sigar)
|
||||||
{
|
{
|
||||||
char buffer[BUFSIZ], *ptr;
|
char buffer[BUFSIZ], *ptr;
|
||||||
int status = sigar_file2str(PROC_STAT, buffer, sizeof(buffer));
|
int status = sigar_file2str(PROC_STAT, buffer, sizeof(buffer));
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
*sigar = malloc(sizeof(**sigar));
|
*sigar = malloc(sizeof(**sigar));
|
||||||
|
|
||||||
|
@ -124,6 +127,13 @@ int sigar_os_open(sigar_t **sigar)
|
||||||
|
|
||||||
(*sigar)->ht_enabled = -1;
|
(*sigar)->ht_enabled = -1;
|
||||||
|
|
||||||
|
if (stat(SYS_BLOCK, &sb) == 0) {
|
||||||
|
(*sigar)->iostat = IOSTAT_SYS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(*sigar)->iostat = IOSTAT_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -996,6 +1006,66 @@ int sigar_file_system_list_get(sigar_t *sigar,
|
||||||
return SIGAR_OK;
|
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>
|
#include <sys/vfs.h>
|
||||||
|
|
||||||
#define SIGAR_FS_BLOCKS_TO_BYTES(buf, f) \
|
#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->free_files = buf.f_ffree;
|
||||||
fsusage->use_percent = sigar_file_system_usage_calc_used(sigar, fsusage);
|
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;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,11 @@ typedef struct {
|
||||||
char state;
|
char state;
|
||||||
} linux_proc_stat_t;
|
} linux_proc_stat_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IOSTAT_NONE,
|
||||||
|
IOSTAT_SYS /* 2.6 */
|
||||||
|
} linux_iostat_e;
|
||||||
|
|
||||||
struct sigar_t {
|
struct sigar_t {
|
||||||
SIGAR_T_BASE;
|
SIGAR_T_BASE;
|
||||||
int ram;
|
int ram;
|
||||||
|
@ -37,6 +42,7 @@ struct sigar_t {
|
||||||
linux_proc_stat_t last_proc_stat;
|
linux_proc_stat_t last_proc_stat;
|
||||||
int ht_enabled;
|
int ht_enabled;
|
||||||
int lcpu;
|
int lcpu;
|
||||||
|
linux_iostat_e iostat;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define HAVE_STRERROR_R
|
#define HAVE_STRERROR_R
|
||||||
|
|
Loading…
Reference in New Issue