bdev: Add min/max_latency_read/write/unmap_ticks into I/O statistics
Add max/min_read/write/unmap_latency_ticks into the struct spdk_bdev_io_stat. When initializing or resetting the instance of the struct spdk_bdev_io_stat, initialize max to 0 and min to UINT64_MAX. Then update max if a new value is larger than the current max, and update min if a new value is smaller than the current min. For the bdev_get_iostat RPC, it prints max and prints min if min is not UINT64_MAX or 0 if min is UINT64_MAX. Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com> Change-Id: I1b30b3825c15e37e9f0cf20104b866186de788a2 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14825 Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot
This commit is contained in:
parent
cf4e8664bb
commit
15040628ec
@ -160,9 +160,17 @@ struct spdk_bdev_io_stat {
|
|||||||
uint64_t bytes_copied;
|
uint64_t bytes_copied;
|
||||||
uint64_t num_copy_ops;
|
uint64_t num_copy_ops;
|
||||||
uint64_t read_latency_ticks;
|
uint64_t read_latency_ticks;
|
||||||
|
uint64_t max_read_latency_ticks;
|
||||||
|
uint64_t min_read_latency_ticks;
|
||||||
uint64_t write_latency_ticks;
|
uint64_t write_latency_ticks;
|
||||||
|
uint64_t max_write_latency_ticks;
|
||||||
|
uint64_t min_write_latency_ticks;
|
||||||
uint64_t unmap_latency_ticks;
|
uint64_t unmap_latency_ticks;
|
||||||
|
uint64_t max_unmap_latency_ticks;
|
||||||
|
uint64_t min_unmap_latency_ticks;
|
||||||
uint64_t copy_latency_ticks;
|
uint64_t copy_latency_ticks;
|
||||||
|
uint64_t max_copy_latency_ticks;
|
||||||
|
uint64_t min_copy_latency_ticks;
|
||||||
uint64_t ticks_rate;
|
uint64_t ticks_rate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3685,6 +3685,30 @@ bdev_io_stat_add(struct spdk_bdev_io_stat *total, struct spdk_bdev_io_stat *add)
|
|||||||
total->write_latency_ticks += add->write_latency_ticks;
|
total->write_latency_ticks += add->write_latency_ticks;
|
||||||
total->unmap_latency_ticks += add->unmap_latency_ticks;
|
total->unmap_latency_ticks += add->unmap_latency_ticks;
|
||||||
total->copy_latency_ticks += add->copy_latency_ticks;
|
total->copy_latency_ticks += add->copy_latency_ticks;
|
||||||
|
if (total->max_read_latency_ticks < add->max_read_latency_ticks) {
|
||||||
|
total->max_read_latency_ticks = add->max_read_latency_ticks;
|
||||||
|
}
|
||||||
|
if (total->min_read_latency_ticks > add->min_read_latency_ticks) {
|
||||||
|
total->min_read_latency_ticks = add->min_read_latency_ticks;
|
||||||
|
}
|
||||||
|
if (total->max_write_latency_ticks < add->max_write_latency_ticks) {
|
||||||
|
total->max_write_latency_ticks = add->max_write_latency_ticks;
|
||||||
|
}
|
||||||
|
if (total->min_write_latency_ticks > add->min_write_latency_ticks) {
|
||||||
|
total->min_write_latency_ticks = add->min_write_latency_ticks;
|
||||||
|
}
|
||||||
|
if (total->max_unmap_latency_ticks < add->max_unmap_latency_ticks) {
|
||||||
|
total->max_unmap_latency_ticks = add->max_unmap_latency_ticks;
|
||||||
|
}
|
||||||
|
if (total->min_unmap_latency_ticks > add->min_unmap_latency_ticks) {
|
||||||
|
total->min_unmap_latency_ticks = add->min_unmap_latency_ticks;
|
||||||
|
}
|
||||||
|
if (total->max_copy_latency_ticks < add->max_copy_latency_ticks) {
|
||||||
|
total->max_copy_latency_ticks = add->max_copy_latency_ticks;
|
||||||
|
}
|
||||||
|
if (total->min_copy_latency_ticks > add->min_copy_latency_ticks) {
|
||||||
|
total->min_copy_latency_ticks = add->min_copy_latency_ticks;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -3696,6 +3720,14 @@ bdev_io_stat_get(struct spdk_bdev_io_stat *to_stat, struct spdk_bdev_io_stat *fr
|
|||||||
static void
|
static void
|
||||||
bdev_io_stat_reset(struct spdk_bdev_io_stat *stat)
|
bdev_io_stat_reset(struct spdk_bdev_io_stat *stat)
|
||||||
{
|
{
|
||||||
|
stat->max_read_latency_ticks = 0;
|
||||||
|
stat->min_read_latency_ticks = UINT64_MAX;
|
||||||
|
stat->max_write_latency_ticks = 0;
|
||||||
|
stat->min_write_latency_ticks = UINT64_MAX;
|
||||||
|
stat->max_unmap_latency_ticks = 0;
|
||||||
|
stat->min_unmap_latency_ticks = UINT64_MAX;
|
||||||
|
stat->max_copy_latency_ticks = 0;
|
||||||
|
stat->min_copy_latency_ticks = UINT64_MAX;
|
||||||
stat->bytes_read = 0;
|
stat->bytes_read = 0;
|
||||||
stat->num_read_ops = 0;
|
stat->num_read_ops = 0;
|
||||||
stat->bytes_written = 0;
|
stat->bytes_written = 0;
|
||||||
@ -3710,7 +3742,14 @@ bdev_io_stat_reset(struct spdk_bdev_io_stat *stat)
|
|||||||
struct spdk_bdev_io_stat *
|
struct spdk_bdev_io_stat *
|
||||||
bdev_io_stat_alloc(void)
|
bdev_io_stat_alloc(void)
|
||||||
{
|
{
|
||||||
return calloc(1, sizeof(struct spdk_bdev_io_stat));
|
struct spdk_bdev_io_stat *stat;
|
||||||
|
|
||||||
|
stat = malloc(sizeof(struct spdk_bdev_io_stat));
|
||||||
|
if (stat != NULL) {
|
||||||
|
bdev_io_stat_reset(stat);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -3731,9 +3770,25 @@ bdev_io_stat_dump_json(struct spdk_bdev_io_stat *stat, struct spdk_json_write_ct
|
|||||||
spdk_json_write_named_uint64(w, "bytes_copied", stat->bytes_copied);
|
spdk_json_write_named_uint64(w, "bytes_copied", stat->bytes_copied);
|
||||||
spdk_json_write_named_uint64(w, "num_copy_ops", stat->num_copy_ops);
|
spdk_json_write_named_uint64(w, "num_copy_ops", stat->num_copy_ops);
|
||||||
spdk_json_write_named_uint64(w, "read_latency_ticks", stat->read_latency_ticks);
|
spdk_json_write_named_uint64(w, "read_latency_ticks", stat->read_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "max_read_latency_ticks", stat->max_read_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "min_read_latency_ticks",
|
||||||
|
stat->min_read_latency_ticks != UINT64_MAX ?
|
||||||
|
stat->min_read_latency_ticks : 0);
|
||||||
spdk_json_write_named_uint64(w, "write_latency_ticks", stat->write_latency_ticks);
|
spdk_json_write_named_uint64(w, "write_latency_ticks", stat->write_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "max_write_latency_ticks", stat->max_write_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "min_write_latency_ticks",
|
||||||
|
stat->min_write_latency_ticks != UINT64_MAX ?
|
||||||
|
stat->min_write_latency_ticks : 0);
|
||||||
spdk_json_write_named_uint64(w, "unmap_latency_ticks", stat->unmap_latency_ticks);
|
spdk_json_write_named_uint64(w, "unmap_latency_ticks", stat->unmap_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "max_unmap_latency_ticks", stat->max_unmap_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "min_unmap_latency_ticks",
|
||||||
|
stat->min_unmap_latency_ticks != UINT64_MAX ?
|
||||||
|
stat->min_unmap_latency_ticks : 0);
|
||||||
spdk_json_write_named_uint64(w, "copy_latency_ticks", stat->copy_latency_ticks);
|
spdk_json_write_named_uint64(w, "copy_latency_ticks", stat->copy_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "max_copy_latency_ticks", stat->max_copy_latency_ticks);
|
||||||
|
spdk_json_write_named_uint64(w, "min_copy_latency_ticks",
|
||||||
|
stat->min_copy_latency_ticks != UINT64_MAX ?
|
||||||
|
stat->min_copy_latency_ticks : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -6131,16 +6186,34 @@ bdev_io_update_io_stat(struct spdk_bdev_io *bdev_io, uint64_t tsc_diff)
|
|||||||
io_stat->bytes_read += num_blocks * blocklen;
|
io_stat->bytes_read += num_blocks * blocklen;
|
||||||
io_stat->num_read_ops++;
|
io_stat->num_read_ops++;
|
||||||
io_stat->read_latency_ticks += tsc_diff;
|
io_stat->read_latency_ticks += tsc_diff;
|
||||||
|
if (io_stat->max_read_latency_ticks < tsc_diff) {
|
||||||
|
io_stat->max_read_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
|
if (io_stat->min_read_latency_ticks > tsc_diff) {
|
||||||
|
io_stat->min_read_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPDK_BDEV_IO_TYPE_WRITE:
|
case SPDK_BDEV_IO_TYPE_WRITE:
|
||||||
io_stat->bytes_written += num_blocks * blocklen;
|
io_stat->bytes_written += num_blocks * blocklen;
|
||||||
io_stat->num_write_ops++;
|
io_stat->num_write_ops++;
|
||||||
io_stat->write_latency_ticks += tsc_diff;
|
io_stat->write_latency_ticks += tsc_diff;
|
||||||
|
if (io_stat->max_write_latency_ticks < tsc_diff) {
|
||||||
|
io_stat->max_write_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
|
if (io_stat->min_write_latency_ticks > tsc_diff) {
|
||||||
|
io_stat->min_write_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPDK_BDEV_IO_TYPE_UNMAP:
|
case SPDK_BDEV_IO_TYPE_UNMAP:
|
||||||
io_stat->bytes_unmapped += num_blocks * blocklen;
|
io_stat->bytes_unmapped += num_blocks * blocklen;
|
||||||
io_stat->num_unmap_ops++;
|
io_stat->num_unmap_ops++;
|
||||||
io_stat->unmap_latency_ticks += tsc_diff;
|
io_stat->unmap_latency_ticks += tsc_diff;
|
||||||
|
if (io_stat->max_unmap_latency_ticks < tsc_diff) {
|
||||||
|
io_stat->max_unmap_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
|
if (io_stat->min_unmap_latency_ticks > tsc_diff) {
|
||||||
|
io_stat->min_unmap_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPDK_BDEV_IO_TYPE_ZCOPY:
|
case SPDK_BDEV_IO_TYPE_ZCOPY:
|
||||||
/* Track the data in the start phase only */
|
/* Track the data in the start phase only */
|
||||||
@ -6149,10 +6222,22 @@ bdev_io_update_io_stat(struct spdk_bdev_io *bdev_io, uint64_t tsc_diff)
|
|||||||
io_stat->bytes_read += num_blocks * blocklen;
|
io_stat->bytes_read += num_blocks * blocklen;
|
||||||
io_stat->num_read_ops++;
|
io_stat->num_read_ops++;
|
||||||
io_stat->read_latency_ticks += tsc_diff;
|
io_stat->read_latency_ticks += tsc_diff;
|
||||||
|
if (io_stat->max_read_latency_ticks < tsc_diff) {
|
||||||
|
io_stat->max_read_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
|
if (io_stat->min_read_latency_ticks > tsc_diff) {
|
||||||
|
io_stat->min_read_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
io_stat->bytes_written += num_blocks * blocklen;
|
io_stat->bytes_written += num_blocks * blocklen;
|
||||||
io_stat->num_write_ops++;
|
io_stat->num_write_ops++;
|
||||||
io_stat->write_latency_ticks += tsc_diff;
|
io_stat->write_latency_ticks += tsc_diff;
|
||||||
|
if (io_stat->max_write_latency_ticks < tsc_diff) {
|
||||||
|
io_stat->max_write_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
|
if (io_stat->min_write_latency_ticks > tsc_diff) {
|
||||||
|
io_stat->min_write_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -6160,6 +6245,12 @@ bdev_io_update_io_stat(struct spdk_bdev_io *bdev_io, uint64_t tsc_diff)
|
|||||||
io_stat->bytes_copied += num_blocks * blocklen;
|
io_stat->bytes_copied += num_blocks * blocklen;
|
||||||
io_stat->num_copy_ops++;
|
io_stat->num_copy_ops++;
|
||||||
bdev_io->internal.ch->stat->copy_latency_ticks += tsc_diff;
|
bdev_io->internal.ch->stat->copy_latency_ticks += tsc_diff;
|
||||||
|
if (io_stat->max_copy_latency_ticks < tsc_diff) {
|
||||||
|
io_stat->max_copy_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
|
if (io_stat->min_copy_latency_ticks > tsc_diff) {
|
||||||
|
io_stat->min_copy_latency_ticks = tsc_diff;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user