From: Alex Zhuravlev Date: Fri, 18 Feb 2022 08:39:12 +0000 (+0300) Subject: LU-15564 osd: add allocation time histogram X-Git-Tag: 2.15.4-RC1~15 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=628765a87189603ad5d37ae7ab5bd10409b6f2cf;p=fs%2Flustre-release.git 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 Lustre-change: https://review.whamcloud.com/46550 Lustre-commit: f97ce54357bc91f7b1285febfc50d6087dd94c13 Signed-off-by: Alex Zhuravlev Change-Id: I1185386adc64e844de71e25a4e439e493e5e5bc5 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52768 Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin Tested-by: jenkins Tested-by: Maloo --- diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index d5fc7da..68912fb 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -406,6 +406,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 a09ae67..13b9e72 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 7131add..5a21f0f 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1129,6 +1129,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++; @@ -1180,9 +1181,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) {