From 7ee0d88278a1bc0d484ebe6c37c23c8ac07133ef Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Wed, 13 Mar 2024 10:50:40 -0400 Subject: [PATCH] LU-13802 llite: add hybrid IO switch proc stats Hybrid IO switching proc stats are useful for telling us if and why we switched to DIO. They're also helpful for writing tests. Test-Parameters: trivial Signed-off-by: Patrick Farrell Signed-off-by: Qian Yingjin Change-Id: I68649474cf11ffc445574fcca105a81fd6ecd458 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52596 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Shaun Tancheff Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/llite/file.c | 25 ++++++++++++++++++++----- lustre/llite/llite_internal.h | 3 +++ lustre/llite/lproc_llite.c | 6 ++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/lustre/llite/file.c b/lustre/llite/file.c index dff3caa..46d6b9b 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -1759,6 +1759,8 @@ ll_hybrid_bio_dio_switch_check(struct file *file, struct kiocb *iocb, #ifdef IOCB_DIRECT struct inode *inode = file_inode(file); struct ll_sb_info *sbi = ll_i2sbi(inode); + int op = LPROC_LL_HYBRID_NOSWITCH; + int dio_switch = false; ENTRY; @@ -1776,15 +1778,28 @@ ll_hybrid_bio_dio_switch_check(struct file *file, struct kiocb *iocb, if (!test_bit(LL_SBI_HYBRID_IO, sbi->ll_flags)) RETURN(false); + /* we only log hybrid IO stats if we hit the actual switching logic - + * not if hybrid IO is disabled or the IO was never a candidate to + * switch + */ if (iot == CIT_WRITE && - count >= sbi->ll_hybrid_io_write_threshold_bytes) - RETURN(true); + count >= sbi->ll_hybrid_io_write_threshold_bytes) { + op = LPROC_LL_HYBRID_WRITESIZE_SWITCH; + GOTO(out, dio_switch = true); + } if (iot == CIT_READ && - count >= sbi->ll_hybrid_io_read_threshold_bytes) - RETURN(true); -#endif + count >= sbi->ll_hybrid_io_read_threshold_bytes) { + op = LPROC_LL_HYBRID_READSIZE_SWITCH; + GOTO(out, dio_switch = true); + } + +out: + ll_stats_ops_tally(sbi, op, 1); + RETURN(dio_switch); +#else RETURN(false); +#endif } static ssize_t diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index e14d439..06d21ef 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -1258,6 +1258,9 @@ enum { LPROC_LL_FALLOCATE, LPROC_LL_INODE_OCOUNT, LPROC_LL_INODE_OPCLTM, + LPROC_LL_HYBRID_NOSWITCH, + LPROC_LL_HYBRID_WRITESIZE_SWITCH, + LPROC_LL_HYBRID_READSIZE_SWITCH, LPROC_LL_FILE_OPCODES }; diff --git a/lustre/llite/lproc_llite.c b/lustre/llite/lproc_llite.c index 8d8151b..34aecfa 100644 --- a/lustre/llite/lproc_llite.c +++ b/lustre/llite/lproc_llite.c @@ -2278,6 +2278,12 @@ static const struct llite_file_opcode { { LPROC_LL_LISTXATTR, LPROCFS_TYPE_LATENCY, "listxattr" }, { LPROC_LL_REMOVEXATTR, LPROCFS_TYPE_LATENCY, "removexattr" }, { LPROC_LL_INODE_PERM, LPROCFS_TYPE_LATENCY, "inode_permission" }, + /* hybrid IO switch from buffered I/O (BIO) to direct I/O (DIO) */ + { LPROC_LL_HYBRID_NOSWITCH, LPROCFS_TYPE_REQS, "hybrid_noswitch" }, + { LPROC_LL_HYBRID_WRITESIZE_SWITCH, LPROCFS_TYPE_REQS, + "hybrid_writesize_switch" }, + { LPROC_LL_HYBRID_READSIZE_SWITCH, LPROCFS_TYPE_REQS, + "hybrid_readsize_switch" }, }; void ll_stats_ops_tally(struct ll_sb_info *sbi, int op, long count) -- 1.8.3.1