[SIGAR-65] solaris disk_usage.service_time impl
This commit is contained in:
parent
7720fc973d
commit
2e6a1c1a20
@ -1562,16 +1562,18 @@ static int io_kstat_read(sigar_t *sigar,
|
|||||||
disk->read_bytes = io->nread;
|
disk->read_bytes = io->nread;
|
||||||
disk->write_bytes = io->nwritten;
|
disk->write_bytes = io->nwritten;
|
||||||
disk->queue = io->wcnt; /* XXX ? */
|
disk->queue = io->wcnt; /* XXX ? */
|
||||||
disk->rtime = io->rlentime * 1000;
|
disk->rtime = io->rlentime;
|
||||||
disk->wtime = io->wlentime * 1000;
|
disk->wtime = io->wlentime;
|
||||||
disk->time = disk->rtime + disk->wtime;
|
disk->time = disk->rtime + disk->wtime;
|
||||||
|
disk->snaptime = ksp->ks_snaptime;
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int sigar_kstat_disk_usage_get(sigar_t *sigar, const char *name,
|
static int sigar_kstat_disk_usage_get(sigar_t *sigar, const char *name,
|
||||||
sigar_disk_usage_t *disk)
|
sigar_disk_usage_t *disk,
|
||||||
|
kstat_t **kio)
|
||||||
{
|
{
|
||||||
kstat_t *ksp;
|
kstat_t *ksp;
|
||||||
|
|
||||||
@ -1579,8 +1581,6 @@ static int sigar_kstat_disk_usage_get(sigar_t *sigar, const char *name,
|
|||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
SIGAR_DISK_STATS_INIT(disk);
|
|
||||||
|
|
||||||
for (ksp = sigar->kc->kc_chain;
|
for (ksp = sigar->kc->kc_chain;
|
||||||
ksp;
|
ksp;
|
||||||
ksp = ksp->ks_next)
|
ksp = ksp->ks_next)
|
||||||
@ -1589,7 +1589,9 @@ static int sigar_kstat_disk_usage_get(sigar_t *sigar, const char *name,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strEQ(ksp->ks_name, name)) {
|
if (strEQ(ksp->ks_name, name)) {
|
||||||
return io_kstat_read(sigar, disk, ksp);
|
int status = io_kstat_read(sigar, disk, ksp);
|
||||||
|
*kio = ksp;
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1608,11 +1610,14 @@ static int simple_hash(const char *s)
|
|||||||
int sigar_disk_usage_get(sigar_t *sigar, const char *name,
|
int sigar_disk_usage_get(sigar_t *sigar, const char *name,
|
||||||
sigar_disk_usage_t *disk)
|
sigar_disk_usage_t *disk)
|
||||||
{
|
{
|
||||||
|
kstat_t *ksp;
|
||||||
int status;
|
int status;
|
||||||
iodev_t *iodev;
|
iodev_t *iodev = NULL;
|
||||||
sigar_cache_entry_t *ent;
|
sigar_cache_entry_t *ent;
|
||||||
sigar_uint64_t id;
|
sigar_uint64_t id;
|
||||||
|
|
||||||
|
SIGAR_DISK_STATS_INIT(disk);
|
||||||
|
|
||||||
if (!sigar->fsdev) {
|
if (!sigar->fsdev) {
|
||||||
if (create_fsdev_cache(sigar) != SIGAR_OK) {
|
if (create_fsdev_cache(sigar) != SIGAR_OK) {
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
@ -1632,10 +1637,11 @@ int sigar_disk_usage_get(sigar_t *sigar, const char *name,
|
|||||||
return ENXIO;
|
return ENXIO;
|
||||||
}
|
}
|
||||||
iodev = (iodev_t *)ent->value;
|
iodev = (iodev_t *)ent->value;
|
||||||
status = sigar_kstat_disk_usage_get(sigar, iodev->name, disk);
|
|
||||||
|
status = sigar_kstat_disk_usage_get(sigar, iodev->name, disk, &ksp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
status = sigar_kstat_disk_usage_get(sigar, name, disk);
|
status = sigar_kstat_disk_usage_get(sigar, name, disk, &ksp);
|
||||||
if (status != SIGAR_OK) {
|
if (status != SIGAR_OK) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -1651,6 +1657,62 @@ int sigar_disk_usage_get(sigar_t *sigar, const char *name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* service_time formula derived from opensolaris.org:iostat.c */
|
||||||
|
if ((status == SIGAR_OK) && iodev) {
|
||||||
|
sigar_uint64_t delta;
|
||||||
|
double avw, avr, tps, mtps;
|
||||||
|
double etime, hr_etime;
|
||||||
|
|
||||||
|
if (iodev->disk.snaptime) {
|
||||||
|
delta = disk->snaptime - iodev->disk.snaptime;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
delta = ksp->ks_crtime - ksp->ks_snaptime;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr_etime = (double)delta;
|
||||||
|
if (hr_etime == 0.0) {
|
||||||
|
hr_etime = (double)NANOSEC;
|
||||||
|
}
|
||||||
|
etime = hr_etime / (double)NANOSEC;
|
||||||
|
|
||||||
|
tps =
|
||||||
|
(((double)(disk->reads - iodev->disk.reads)) / etime) +
|
||||||
|
(((double)(disk->writes - iodev->disk.writes)) / etime);
|
||||||
|
|
||||||
|
delta = disk->wtime - iodev->disk.wtime;
|
||||||
|
if (delta) {
|
||||||
|
avw = (double)delta;
|
||||||
|
avw /= hr_etime;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
avw = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
delta = disk->rtime - iodev->disk.rtime;
|
||||||
|
if (delta) {
|
||||||
|
avr = (double)delta;
|
||||||
|
avr /= hr_etime;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
avr = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
disk->service_time = 0.0;
|
||||||
|
|
||||||
|
if (tps && (avw != 0.0 || avr != 0.0)) {
|
||||||
|
mtps = 1000.0 / tps;
|
||||||
|
if (avw != 0.0) {
|
||||||
|
disk->service_time += avw * mtps;
|
||||||
|
}
|
||||||
|
if (avr != 0.0) {
|
||||||
|
disk->service_time += avr * mtps;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&iodev->disk, disk, sizeof(iodev->disk));
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user