From f97ce54357bc91f7b1285febfc50d6087dd94c13 Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Fri, 18 Feb 2022 11:39:12 +0300 Subject: [PATCH] LU-15564 osd: add allocation time histogram add block mapping/allocation histogram to brw stats to debug mballoc related issues. $ lctl get_param osd*.*OST*.brw_stats read | write block maps msec maps % cum % | maps % cum % 1: 1522360 100 100 | 49272 99 99 2: 0 0 100 | 1 0 99 4: 0 0 100 | 1 0 99 8: 0 0 100 | 0 0 99 16: 0 0 100 | 0 0 99 32: 0 0 100 | 0 0 99 64: 0 0 100 | 1 0 100 Signed-off-by: Alex Zhuravlev Change-Id: I1185386adc64e844de71e25a4e439e493e5e5bc5 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/46550 Reviewed-by: Oleg Drokin Reviewed-by: Alexey Lyashkov Reviewed-by: Andreas Dilger Tested-by: jenkins Tested-by: Maloo --- lustre/include/lprocfs_status.h | 2 ++ lustre/obdclass/lprocfs_status_server.c | 3 +++ lustre/osd-ldiskfs/osd_io.c | 13 ++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index 76c1eec..52b2440 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -398,6 +398,8 @@ enum brw_rw_stats { BRW_W_IO_TIME, BRW_R_DISK_IOSIZE, BRW_W_DISK_IOSIZE, + BRW_MAP_TIME, + BRW_ALLOC_TIME, BRW_RW_STATS_NUM, }; diff --git a/lustre/obdclass/lprocfs_status_server.c b/lustre/obdclass/lprocfs_status_server.c index fe2d785..fe1dabe 100644 --- a/lustre/obdclass/lprocfs_status_server.c +++ b/lustre/obdclass/lprocfs_status_server.c @@ -768,6 +768,9 @@ static const struct brw_stats_props brw_props[] = { { .bsp_name = "disk I/O size", .bsp_units = "ios", .bsp_scale = true }, + { .bsp_name = "block maps msec", + .bsp_units = "maps", + .bsp_scale = true, }, }; static int brw_stats_seq_show(struct seq_file *seq, void *v) diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 2ee7b41..0447fee 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1126,6 +1126,7 @@ static int osd_ldiskfs_map_inode_pages(struct inode *inode, while (i < pages) { long blen, total = 0, previous_total = 0; struct ldiskfs_map_blocks map = { 0 }; + ktime_t time; if (fp == NULL) { /* start new extent */ fp = *page++; @@ -1219,9 +1220,19 @@ cont_map: else oh->oh_declared_ext--; } + + time = ktime_get(); rc = ldiskfs_map_blocks(handle, inode, &map, create); + time = ktime_sub(ktime_get(), time); + if (rc >= 0) { - int c = 0; + struct brw_stats *h = &osd->od_brw_stats; + int idx, c = 0; + + idx = map.m_flags & LDISKFS_MAP_NEW ? + BRW_ALLOC_TIME : BRW_MAP_TIME; + lprocfs_oh_tally_log2_pcpu(&h->bs_hist[idx], + ktime_to_ms(time)); for (; total < blen && c < map.m_len; c++, total++) { if (rc == 0) { -- 1.8.3.1