implement disk i/o metrics
This commit is contained in:
		
							parent
							
								
									e4a6c819be
								
							
						
					
					
						commit
						9721ca0121
					
				@ -1,10 +1,11 @@
 | 
			
		||||
#include "sigar.h"
 | 
			
		||||
#include "sigar_private.h"
 | 
			
		||||
#include "sigar_os.h"
 | 
			
		||||
#include "sigar_util.h"
 | 
			
		||||
#include "sigar_os.h"
 | 
			
		||||
 | 
			
		||||
#include <sys/dk.h>
 | 
			
		||||
#include <sys/lwp.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
int sigar_os_open(sigar_t **sigar)
 | 
			
		||||
@ -22,6 +23,8 @@ int sigar_os_open(sigar_t **sigar)
 | 
			
		||||
 | 
			
		||||
    (*sigar)->pinfo = NULL;
 | 
			
		||||
 | 
			
		||||
    (*sigar)->fsdev = NULL;
 | 
			
		||||
    
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
@ -31,6 +34,9 @@ int sigar_os_close(sigar_t *sigar)
 | 
			
		||||
    if (sigar->pinfo) {
 | 
			
		||||
        free(sigar->pinfo);
 | 
			
		||||
    }
 | 
			
		||||
    if (sigar->fsdev) {
 | 
			
		||||
        sigar_cache_destroy(sigar->fsdev);
 | 
			
		||||
    }
 | 
			
		||||
    free(sigar);
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
@ -542,11 +548,44 @@ int sigar_file_system_list_get(sigar_t *sigar,
 | 
			
		||||
#define SIGAR_FS_BLOCKS_TO_BYTES(buf, f) \
 | 
			
		||||
    ((buf.f * (buf.f_bsize / 512)) >> 1)
 | 
			
		||||
 | 
			
		||||
#define FSDEV_ID(sb) (sb.st_ino + sb.st_dev)
 | 
			
		||||
 | 
			
		||||
static int create_fsdev_cache(sigar_t *sigar)
 | 
			
		||||
{
 | 
			
		||||
    sigar_file_system_list_t fslist;
 | 
			
		||||
    int i;
 | 
			
		||||
    int status =
 | 
			
		||||
        sigar_file_system_list_get(sigar, &fslist);
 | 
			
		||||
 | 
			
		||||
    if (status != SIGAR_OK) {
 | 
			
		||||
        return status;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sigar->fsdev = sigar_cache_new(15);
 | 
			
		||||
 | 
			
		||||
    for (i=0; i<fslist.number; i++) {
 | 
			
		||||
        sigar_file_system_t *fsp = &fslist.data[i];
 | 
			
		||||
 | 
			
		||||
        if (fsp->type == SIGAR_FSTYPE_LOCAL_DISK) {
 | 
			
		||||
            sigar_cache_entry_t *ent;
 | 
			
		||||
            struct stat sb;
 | 
			
		||||
 | 
			
		||||
            if (stat(fsp->dir_name, &sb) < 0) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ent = sigar_cache_get(sigar->fsdev, FSDEV_ID(sb));
 | 
			
		||||
            ent->value = strdup(fsp->dev_name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sigar_file_system_usage_get(sigar_t *sigar,
 | 
			
		||||
                                const char *dirname,
 | 
			
		||||
                                sigar_file_system_usage_t *fsusage)
 | 
			
		||||
{
 | 
			
		||||
    struct statfs buf;
 | 
			
		||||
    struct stat sb;
 | 
			
		||||
 | 
			
		||||
    if (statfs(dirname, &buf) != 0) {
 | 
			
		||||
        return errno;
 | 
			
		||||
@ -561,6 +600,36 @@ int sigar_file_system_usage_get(sigar_t *sigar,
 | 
			
		||||
 | 
			
		||||
    SIGAR_DISK_STATS_NOTIMPL(fsusage);
 | 
			
		||||
 | 
			
		||||
    if (!sigar->fsdev) {
 | 
			
		||||
        if (create_fsdev_cache(sigar) != SIGAR_OK) {
 | 
			
		||||
            return SIGAR_OK;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (stat(dirname, &sb) == 0) {
 | 
			
		||||
        sigar_cache_entry_t *ent;
 | 
			
		||||
        struct pst_lvinfo lv;
 | 
			
		||||
        struct stat devsb;
 | 
			
		||||
        char *devname;
 | 
			
		||||
        int retval;
 | 
			
		||||
 | 
			
		||||
        ent = sigar_cache_get(sigar->fsdev, FSDEV_ID(sb));
 | 
			
		||||
        if (ent->value == NULL) {
 | 
			
		||||
            return SIGAR_OK;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (stat((char *)ent->value, &devsb) < 0) {
 | 
			
		||||
            return SIGAR_OK;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        retval = pstat_getlv(&lv, sizeof(lv), 0, (int)devsb.st_rdev);
 | 
			
		||||
 | 
			
		||||
        if (retval == 1) {
 | 
			
		||||
            fsusage->disk_reads  = lv.psl_rxfer;
 | 
			
		||||
            fsusage->disk_writes = lv.psl_wxfer;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,8 @@ struct sigar_t {
 | 
			
		||||
    time_t last_getprocs;
 | 
			
		||||
    sigar_pid_t last_pid;
 | 
			
		||||
    struct pst_status *pinfo;
 | 
			
		||||
 | 
			
		||||
    sigar_cache_t *fsdev;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int hpux_get_mib_ifentry(int ppa, mib_ifEntry *mib);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user