block: add accounting for zone append operation
Taking account of the new zone append write operation for zoned devices, BLOCK_ACCT_ZONE_APPEND enum is introduced as other I/O request type (read, write, flush). Signed-off-by: Sam Li <faithilikerun@gmail.com> Message-id: 20230508051916.178322-3-faithilikerun@gmail.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
4f7366506a
commit
52eb76f4b1
@ -517,6 +517,7 @@ void qmp_block_latency_histogram_set(
|
||||
bool has_boundaries, uint64List *boundaries,
|
||||
bool has_boundaries_read, uint64List *boundaries_read,
|
||||
bool has_boundaries_write, uint64List *boundaries_write,
|
||||
bool has_boundaries_append, uint64List *boundaries_append,
|
||||
bool has_boundaries_flush, uint64List *boundaries_flush,
|
||||
Error **errp)
|
||||
{
|
||||
@ -557,6 +558,16 @@ void qmp_block_latency_histogram_set(
|
||||
}
|
||||
}
|
||||
|
||||
if (has_boundaries || has_boundaries_append) {
|
||||
ret = block_latency_histogram_set(
|
||||
stats, BLOCK_ACCT_ZONE_APPEND,
|
||||
has_boundaries_append ? boundaries_append : boundaries);
|
||||
if (ret) {
|
||||
error_setg(errp, "Device '%s' set append write boundaries fail", id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (has_boundaries || has_boundaries_flush) {
|
||||
ret = block_latency_histogram_set(
|
||||
stats, BLOCK_ACCT_FLUSH,
|
||||
|
18
block/qapi.c
18
block/qapi.c
@ -533,27 +533,36 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
|
||||
|
||||
ds->rd_bytes = stats->nr_bytes[BLOCK_ACCT_READ];
|
||||
ds->wr_bytes = stats->nr_bytes[BLOCK_ACCT_WRITE];
|
||||
ds->zone_append_bytes = stats->nr_bytes[BLOCK_ACCT_ZONE_APPEND];
|
||||
ds->unmap_bytes = stats->nr_bytes[BLOCK_ACCT_UNMAP];
|
||||
ds->rd_operations = stats->nr_ops[BLOCK_ACCT_READ];
|
||||
ds->wr_operations = stats->nr_ops[BLOCK_ACCT_WRITE];
|
||||
ds->zone_append_operations = stats->nr_ops[BLOCK_ACCT_ZONE_APPEND];
|
||||
ds->unmap_operations = stats->nr_ops[BLOCK_ACCT_UNMAP];
|
||||
|
||||
ds->failed_rd_operations = stats->failed_ops[BLOCK_ACCT_READ];
|
||||
ds->failed_wr_operations = stats->failed_ops[BLOCK_ACCT_WRITE];
|
||||
ds->failed_zone_append_operations =
|
||||
stats->failed_ops[BLOCK_ACCT_ZONE_APPEND];
|
||||
ds->failed_flush_operations = stats->failed_ops[BLOCK_ACCT_FLUSH];
|
||||
ds->failed_unmap_operations = stats->failed_ops[BLOCK_ACCT_UNMAP];
|
||||
|
||||
ds->invalid_rd_operations = stats->invalid_ops[BLOCK_ACCT_READ];
|
||||
ds->invalid_wr_operations = stats->invalid_ops[BLOCK_ACCT_WRITE];
|
||||
ds->invalid_zone_append_operations =
|
||||
stats->invalid_ops[BLOCK_ACCT_ZONE_APPEND];
|
||||
ds->invalid_flush_operations =
|
||||
stats->invalid_ops[BLOCK_ACCT_FLUSH];
|
||||
ds->invalid_unmap_operations = stats->invalid_ops[BLOCK_ACCT_UNMAP];
|
||||
|
||||
ds->rd_merged = stats->merged[BLOCK_ACCT_READ];
|
||||
ds->wr_merged = stats->merged[BLOCK_ACCT_WRITE];
|
||||
ds->zone_append_merged = stats->merged[BLOCK_ACCT_ZONE_APPEND];
|
||||
ds->unmap_merged = stats->merged[BLOCK_ACCT_UNMAP];
|
||||
ds->flush_operations = stats->nr_ops[BLOCK_ACCT_FLUSH];
|
||||
ds->wr_total_time_ns = stats->total_time_ns[BLOCK_ACCT_WRITE];
|
||||
ds->zone_append_total_time_ns =
|
||||
stats->total_time_ns[BLOCK_ACCT_ZONE_APPEND];
|
||||
ds->rd_total_time_ns = stats->total_time_ns[BLOCK_ACCT_READ];
|
||||
ds->flush_total_time_ns = stats->total_time_ns[BLOCK_ACCT_FLUSH];
|
||||
ds->unmap_total_time_ns = stats->total_time_ns[BLOCK_ACCT_UNMAP];
|
||||
@ -571,6 +580,7 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
|
||||
|
||||
TimedAverage *rd = &ts->latency[BLOCK_ACCT_READ];
|
||||
TimedAverage *wr = &ts->latency[BLOCK_ACCT_WRITE];
|
||||
TimedAverage *zap = &ts->latency[BLOCK_ACCT_ZONE_APPEND];
|
||||
TimedAverage *fl = &ts->latency[BLOCK_ACCT_FLUSH];
|
||||
|
||||
dev_stats->interval_length = ts->interval_length;
|
||||
@ -583,6 +593,10 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
|
||||
dev_stats->max_wr_latency_ns = timed_average_max(wr);
|
||||
dev_stats->avg_wr_latency_ns = timed_average_avg(wr);
|
||||
|
||||
dev_stats->min_zone_append_latency_ns = timed_average_min(zap);
|
||||
dev_stats->max_zone_append_latency_ns = timed_average_max(zap);
|
||||
dev_stats->avg_zone_append_latency_ns = timed_average_avg(zap);
|
||||
|
||||
dev_stats->min_flush_latency_ns = timed_average_min(fl);
|
||||
dev_stats->max_flush_latency_ns = timed_average_max(fl);
|
||||
dev_stats->avg_flush_latency_ns = timed_average_avg(fl);
|
||||
@ -591,6 +605,8 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
|
||||
block_acct_queue_depth(ts, BLOCK_ACCT_READ);
|
||||
dev_stats->avg_wr_queue_depth =
|
||||
block_acct_queue_depth(ts, BLOCK_ACCT_WRITE);
|
||||
dev_stats->avg_zone_append_queue_depth =
|
||||
block_acct_queue_depth(ts, BLOCK_ACCT_ZONE_APPEND);
|
||||
|
||||
QAPI_LIST_PREPEND(ds->timed_stats, dev_stats);
|
||||
}
|
||||
@ -600,6 +616,8 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
|
||||
= bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_READ]);
|
||||
ds->wr_latency_histogram
|
||||
= bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_WRITE]);
|
||||
ds->zone_append_latency_histogram
|
||||
= bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_ZONE_APPEND]);
|
||||
ds->flush_latency_histogram
|
||||
= bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_FLUSH]);
|
||||
}
|
||||
|
@ -919,6 +919,10 @@ static int virtio_blk_handle_zone_append(VirtIOBlockReq *req,
|
||||
data->in_num = in_num;
|
||||
data->zone_append_data.offset = offset;
|
||||
qemu_iovec_init_external(&req->qiov, out_iov, out_num);
|
||||
|
||||
block_acct_start(blk_get_stats(s->blk), &req->acct, len,
|
||||
BLOCK_ACCT_ZONE_APPEND);
|
||||
|
||||
blk_aio_zone_append(s->blk, &data->zone_append_data.offset, &req->qiov, 0,
|
||||
virtio_blk_zone_append_complete, data);
|
||||
return 0;
|
||||
|
@ -37,6 +37,7 @@ enum BlockAcctType {
|
||||
BLOCK_ACCT_READ,
|
||||
BLOCK_ACCT_WRITE,
|
||||
BLOCK_ACCT_FLUSH,
|
||||
BLOCK_ACCT_ZONE_APPEND,
|
||||
BLOCK_ACCT_UNMAP,
|
||||
BLOCK_MAX_IOTYPE,
|
||||
};
|
||||
|
@ -854,6 +854,10 @@
|
||||
# @min_wr_latency_ns: Minimum latency of write operations in the
|
||||
# defined interval, in nanoseconds.
|
||||
#
|
||||
# @min_zone_append_latency_ns: Minimum latency of zone append operations
|
||||
# in the defined interval, in nanoseconds
|
||||
# (since 8.1)
|
||||
#
|
||||
# @min_flush_latency_ns: Minimum latency of flush operations in the
|
||||
# defined interval, in nanoseconds.
|
||||
#
|
||||
@ -863,6 +867,10 @@
|
||||
# @max_wr_latency_ns: Maximum latency of write operations in the
|
||||
# defined interval, in nanoseconds.
|
||||
#
|
||||
# @max_zone_append_latency_ns: Maximum latency of zone append operations
|
||||
# in the defined interval, in nanoseconds
|
||||
# (since 8.1)
|
||||
#
|
||||
# @max_flush_latency_ns: Maximum latency of flush operations in the
|
||||
# defined interval, in nanoseconds.
|
||||
#
|
||||
@ -872,6 +880,10 @@
|
||||
# @avg_wr_latency_ns: Average latency of write operations in the
|
||||
# defined interval, in nanoseconds.
|
||||
#
|
||||
# @avg_zone_append_latency_ns: Average latency of zone append operations
|
||||
# in the defined interval, in nanoseconds
|
||||
# (since 8.1)
|
||||
#
|
||||
# @avg_flush_latency_ns: Average latency of flush operations in the
|
||||
# defined interval, in nanoseconds.
|
||||
#
|
||||
@ -881,15 +893,23 @@
|
||||
# @avg_wr_queue_depth: Average number of pending write operations in
|
||||
# the defined interval.
|
||||
#
|
||||
# @avg_zone_append_queue_depth: Average number of pending zone append
|
||||
# operations in the defined interval
|
||||
# (since 8.1).
|
||||
#
|
||||
# Since: 2.5
|
||||
##
|
||||
{ 'struct': 'BlockDeviceTimedStats',
|
||||
'data': { 'interval_length': 'int', 'min_rd_latency_ns': 'int',
|
||||
'max_rd_latency_ns': 'int', 'avg_rd_latency_ns': 'int',
|
||||
'min_wr_latency_ns': 'int', 'max_wr_latency_ns': 'int',
|
||||
'avg_wr_latency_ns': 'int', 'min_flush_latency_ns': 'int',
|
||||
'max_flush_latency_ns': 'int', 'avg_flush_latency_ns': 'int',
|
||||
'avg_rd_queue_depth': 'number', 'avg_wr_queue_depth': 'number' } }
|
||||
'avg_wr_latency_ns': 'int', 'min_zone_append_latency_ns': 'int',
|
||||
'max_zone_append_latency_ns': 'int',
|
||||
'avg_zone_append_latency_ns': 'int',
|
||||
'min_flush_latency_ns': 'int', 'max_flush_latency_ns': 'int',
|
||||
'avg_flush_latency_ns': 'int', 'avg_rd_queue_depth': 'number',
|
||||
'avg_wr_queue_depth': 'number',
|
||||
'avg_zone_append_queue_depth': 'number' } }
|
||||
|
||||
##
|
||||
# @BlockDeviceStats:
|
||||
@ -900,6 +920,9 @@
|
||||
#
|
||||
# @wr_bytes: The number of bytes written by the device.
|
||||
#
|
||||
# @zone_append_bytes: The number of bytes appended by the zoned devices
|
||||
# (since 8.1)
|
||||
#
|
||||
# @unmap_bytes: The number of bytes unmapped by the device (Since 4.2)
|
||||
#
|
||||
# @rd_operations: The number of read operations performed by the
|
||||
@ -908,6 +931,9 @@
|
||||
# @wr_operations: The number of write operations performed by the
|
||||
# device.
|
||||
#
|
||||
# @zone_append_operations: The number of zone append operations performed
|
||||
# by the zoned devices (since 8.1)
|
||||
#
|
||||
# @flush_operations: The number of cache flush operations performed by
|
||||
# the device (since 0.15)
|
||||
#
|
||||
@ -920,6 +946,9 @@
|
||||
# @wr_total_time_ns: Total time spent on writes in nanoseconds (since
|
||||
# 0.15).
|
||||
#
|
||||
# @zone_append_total_time_ns: Total time spent on zone append writes
|
||||
# in nanoseconds (since 8.1)
|
||||
#
|
||||
# @flush_total_time_ns: Total time spent on cache flushes in
|
||||
# nanoseconds (since 0.15).
|
||||
#
|
||||
@ -937,6 +966,9 @@
|
||||
# @wr_merged: Number of write requests that have been merged into
|
||||
# another request (Since 2.3).
|
||||
#
|
||||
# @zone_append_merged: Number of zone append requests that have been merged
|
||||
# into another request (since 8.1)
|
||||
#
|
||||
# @unmap_merged: Number of unmap requests that have been merged into
|
||||
# another request (Since 4.2)
|
||||
#
|
||||
@ -950,6 +982,10 @@
|
||||
# @failed_wr_operations: The number of failed write operations
|
||||
# performed by the device (Since 2.5)
|
||||
#
|
||||
# @failed_zone_append_operations: The number of failed zone append write
|
||||
# operations performed by the zoned devices
|
||||
# (since 8.1)
|
||||
#
|
||||
# @failed_flush_operations: The number of failed flush operations
|
||||
# performed by the device (Since 2.5)
|
||||
#
|
||||
@ -962,6 +998,9 @@
|
||||
# @invalid_wr_operations: The number of invalid write operations
|
||||
# performed by the device (Since 2.5)
|
||||
#
|
||||
# @invalid_zone_append_operations: The number of invalid zone append operations
|
||||
# performed by the zoned device (since 8.1)
|
||||
#
|
||||
# @invalid_flush_operations: The number of invalid flush operations
|
||||
# performed by the device (Since 2.5)
|
||||
#
|
||||
@ -981,27 +1020,34 @@
|
||||
#
|
||||
# @wr_latency_histogram: @BlockLatencyHistogramInfo. (Since 4.0)
|
||||
#
|
||||
# @zone_append_latency_histogram: @BlockLatencyHistogramInfo. (since 8.1)
|
||||
#
|
||||
# @flush_latency_histogram: @BlockLatencyHistogramInfo. (Since 4.0)
|
||||
#
|
||||
# Since: 0.14
|
||||
##
|
||||
{ 'struct': 'BlockDeviceStats',
|
||||
'data': {'rd_bytes': 'int', 'wr_bytes': 'int', 'unmap_bytes' : 'int',
|
||||
'rd_operations': 'int', 'wr_operations': 'int',
|
||||
'data': {'rd_bytes': 'int', 'wr_bytes': 'int', 'zone_append_bytes': 'int',
|
||||
'unmap_bytes' : 'int', 'rd_operations': 'int',
|
||||
'wr_operations': 'int', 'zone_append_operations': 'int',
|
||||
'flush_operations': 'int', 'unmap_operations': 'int',
|
||||
'rd_total_time_ns': 'int', 'wr_total_time_ns': 'int',
|
||||
'flush_total_time_ns': 'int', 'unmap_total_time_ns': 'int',
|
||||
'wr_highest_offset': 'int',
|
||||
'rd_merged': 'int', 'wr_merged': 'int', 'unmap_merged': 'int',
|
||||
'*idle_time_ns': 'int',
|
||||
'zone_append_total_time_ns': 'int', 'flush_total_time_ns': 'int',
|
||||
'unmap_total_time_ns': 'int', 'wr_highest_offset': 'int',
|
||||
'rd_merged': 'int', 'wr_merged': 'int', 'zone_append_merged': 'int',
|
||||
'unmap_merged': 'int', '*idle_time_ns': 'int',
|
||||
'failed_rd_operations': 'int', 'failed_wr_operations': 'int',
|
||||
'failed_flush_operations': 'int', 'failed_unmap_operations': 'int',
|
||||
'invalid_rd_operations': 'int', 'invalid_wr_operations': 'int',
|
||||
'failed_zone_append_operations': 'int',
|
||||
'failed_flush_operations': 'int',
|
||||
'failed_unmap_operations': 'int', 'invalid_rd_operations': 'int',
|
||||
'invalid_wr_operations': 'int',
|
||||
'invalid_zone_append_operations': 'int',
|
||||
'invalid_flush_operations': 'int', 'invalid_unmap_operations': 'int',
|
||||
'account_invalid': 'bool', 'account_failed': 'bool',
|
||||
'timed_stats': ['BlockDeviceTimedStats'],
|
||||
'*rd_latency_histogram': 'BlockLatencyHistogramInfo',
|
||||
'*wr_latency_histogram': 'BlockLatencyHistogramInfo',
|
||||
'*zone_append_latency_histogram': 'BlockLatencyHistogramInfo',
|
||||
'*flush_latency_histogram': 'BlockLatencyHistogramInfo' } }
|
||||
|
||||
##
|
||||
|
@ -534,6 +534,9 @@
|
||||
# @boundaries-write: list of interval boundary values for write
|
||||
# latency histogram.
|
||||
#
|
||||
# @boundaries-zap: list of interval boundary values for zone append write
|
||||
# latency histogram.
|
||||
#
|
||||
# @boundaries-flush: list of interval boundary values for flush
|
||||
# latency histogram.
|
||||
#
|
||||
@ -587,5 +590,6 @@
|
||||
'*boundaries': ['uint64'],
|
||||
'*boundaries-read': ['uint64'],
|
||||
'*boundaries-write': ['uint64'],
|
||||
'*boundaries-zap': ['uint64'],
|
||||
'*boundaries-flush': ['uint64'] },
|
||||
'allow-preconfig': true }
|
||||
|
@ -17,6 +17,7 @@ Testing: -drive driver=null-co,read-zeroes=on,if=virtio
|
||||
"stats": {
|
||||
"unmap_operations": 0,
|
||||
"unmap_merged": 0,
|
||||
"failed_zone_append_operations": 0,
|
||||
"flush_total_time_ns": 0,
|
||||
"wr_highest_offset": 0,
|
||||
"wr_total_time_ns": 0,
|
||||
@ -27,6 +28,7 @@ Testing: -drive driver=null-co,read-zeroes=on,if=virtio
|
||||
"timed_stats": [
|
||||
],
|
||||
"failed_unmap_operations": 0,
|
||||
"zone_append_merged": 0,
|
||||
"failed_flush_operations": 0,
|
||||
"account_invalid": true,
|
||||
"rd_total_time_ns": 0,
|
||||
@ -39,7 +41,11 @@ Testing: -drive driver=null-co,read-zeroes=on,if=virtio
|
||||
"unmap_total_time_ns": 0,
|
||||
"invalid_flush_operations": 0,
|
||||
"account_failed": true,
|
||||
"zone_append_total_time_ns": 0,
|
||||
"zone_append_operations": 0,
|
||||
"rd_operations": 0,
|
||||
"zone_append_bytes": 0,
|
||||
"invalid_zone_append_operations": 0,
|
||||
"invalid_wr_operations": 0,
|
||||
"invalid_rd_operations": 0
|
||||
},
|
||||
@ -82,6 +88,7 @@ Testing: -drive driver=null-co,if=none
|
||||
"stats": {
|
||||
"unmap_operations": 0,
|
||||
"unmap_merged": 0,
|
||||
"failed_zone_append_operations": 0,
|
||||
"flush_total_time_ns": 0,
|
||||
"wr_highest_offset": 0,
|
||||
"wr_total_time_ns": 0,
|
||||
@ -92,6 +99,7 @@ Testing: -drive driver=null-co,if=none
|
||||
"timed_stats": [
|
||||
],
|
||||
"failed_unmap_operations": 0,
|
||||
"zone_append_merged": 0,
|
||||
"failed_flush_operations": 0,
|
||||
"account_invalid": true,
|
||||
"rd_total_time_ns": 0,
|
||||
@ -104,7 +112,11 @@ Testing: -drive driver=null-co,if=none
|
||||
"unmap_total_time_ns": 0,
|
||||
"invalid_flush_operations": 0,
|
||||
"account_failed": true,
|
||||
"zone_append_total_time_ns": 0,
|
||||
"zone_append_operations": 0,
|
||||
"rd_operations": 0,
|
||||
"zone_append_bytes": 0,
|
||||
"invalid_zone_append_operations": 0,
|
||||
"invalid_wr_operations": 0,
|
||||
"invalid_rd_operations": 0
|
||||
},
|
||||
@ -177,6 +189,7 @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-b
|
||||
"stats": {
|
||||
"unmap_operations": 0,
|
||||
"unmap_merged": 0,
|
||||
"failed_zone_append_operations": 0,
|
||||
"flush_total_time_ns": 0,
|
||||
"wr_highest_offset": 0,
|
||||
"wr_total_time_ns": 0,
|
||||
@ -187,6 +200,7 @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-b
|
||||
"timed_stats": [
|
||||
],
|
||||
"failed_unmap_operations": 0,
|
||||
"zone_append_merged": 0,
|
||||
"failed_flush_operations": 0,
|
||||
"account_invalid": true,
|
||||
"rd_total_time_ns": 0,
|
||||
@ -199,7 +213,11 @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-b
|
||||
"unmap_total_time_ns": 0,
|
||||
"invalid_flush_operations": 0,
|
||||
"account_failed": true,
|
||||
"zone_append_total_time_ns": 0,
|
||||
"zone_append_operations": 0,
|
||||
"rd_operations": 0,
|
||||
"zone_append_bytes": 0,
|
||||
"invalid_zone_append_operations": 0,
|
||||
"invalid_wr_operations": 0,
|
||||
"invalid_rd_operations": 0
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user