bdev: Added latency to channel statistics

Modified include/spdk/bdev.h and include/spdk_internal/bdev.h
add data members to capture statistics information. Modified
lib/bdev/bdev.c to calculate read/write latency.

Change-Id: Idcd55dd2e88c4b308e016f16ced53720256c79e3
Signed-off-by: Isaac Otsiabah <iotsiabah@us.fujitsu.com>
Reviewed-on: https://review.gerrithub.io/390654
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Isaac Otsiabah 2017-12-06 11:02:51 -08:00 committed by Daniel Verkamp
parent 98d28d604d
commit a4f3920d51
3 changed files with 10 additions and 0 deletions

View File

@ -115,6 +115,9 @@ struct spdk_bdev_io_stat {
uint64_t num_read_ops;
uint64_t bytes_written;
uint64_t num_write_ops;
uint64_t read_latency_ticks;
uint64_t write_latency_ticks;
uint64_t ticks_rate;
};
typedef void (*spdk_bdev_init_cb)(void *cb_arg, int rc);

View File

@ -385,6 +385,9 @@ struct spdk_bdev_io {
/** It may be used by modules to put the bdev_io into its own list. */
TAILQ_ENTRY(spdk_bdev_io) module_link;
/** Current tsc at submit time. Used to calculate latency at completion. */
uint64_t submit_tsc;
/**
* Per I/O context for use by the bdev module.
*/

View File

@ -807,6 +807,7 @@ spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io)
assert(bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING);
bdev_io->submit_tsc = spdk_get_ticks();
shared_ch->io_outstanding++;
bdev_io->in_submit_request = true;
if (spdk_likely(bdev_ch->flags == 0)) {
@ -1664,6 +1665,7 @@ spdk_bdev_get_io_stat(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
struct spdk_bdev_channel *channel = spdk_io_channel_get_ctx(ch);
channel->stat.ticks_rate = spdk_get_ticks_hz();
*stat = channel->stat;
memset(&channel->stat, 0, sizeof(channel->stat));
}
@ -1916,10 +1918,12 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta
case SPDK_BDEV_IO_TYPE_READ:
bdev_ch->stat.bytes_read += bdev_io->u.bdev.num_blocks * bdev->blocklen;
bdev_ch->stat.num_read_ops++;
bdev_ch->stat.read_latency_ticks += (spdk_get_ticks() - bdev_io->submit_tsc);
break;
case SPDK_BDEV_IO_TYPE_WRITE:
bdev_ch->stat.bytes_written += bdev_io->u.bdev.num_blocks * bdev->blocklen;
bdev_ch->stat.num_write_ops++;
bdev_ch->stat.write_latency_ticks += (spdk_get_ticks() - bdev_io->submit_tsc);
break;
default:
break;