Whamcloud - gitweb
LU-13802 llite: add hybrid IO switch proc stats 96/52596/28
authorPatrick Farrell <paf0187@gmail.com>
Wed, 13 Mar 2024 14:50:40 +0000 (10:50 -0400)
committerOleg Drokin <green@whamcloud.com>
Wed, 29 May 2024 04:41:39 +0000 (04:41 +0000)
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 <patrick.farrell@oracle.com>
Signed-off-by: Qian Yingjin <qian@ddn.com>
Change-Id: I68649474cf11ffc445574fcca105a81fd6ecd458
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52596
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/file.c
lustre/llite/llite_internal.h
lustre/llite/lproc_llite.c

index dff3caa..46d6b9b 100644 (file)
@@ -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
index e14d439..06d21ef 100644 (file)
@@ -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
 };
 
index 8d8151b..34aecfa 100644 (file)
@@ -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)