fix: ext4: limit the length of per-inode prealloc list (v5.9)
authorMichael Jeanson <mjeanson@efficios.com>
Mon, 24 Aug 2020 19:26:04 +0000 (15:26 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 25 Aug 2020 17:59:17 +0000 (13:59 -0400)
See upstream commit:

  commit 27bc446e2def38db3244a6eb4bb1d6312936610a
  Author: brookxu <brookxu.cn@gmail.com>
  Date:   Mon Aug 17 15:36:15 2020 +0800

    ext4: limit the length of per-inode prealloc list

    In the scenario of writing sparse files, the per-inode prealloc list may
    be very long, resulting in high overhead for ext4_mb_use_preallocated().
    To circumvent this problem, we limit the maximum length of per-inode
    prealloc list to 512 and allow users to modify it.

    After patching, we observed that the sys ratio of cpu has dropped, and
    the system throughput has increased significantly. We created a process
    to write the sparse file, and the running time of the process on the
    fixed kernel was significantly reduced, as follows:

    Running time on unfixed kernel:
    [root@TENCENT64 ~]# time taskset 0x01 ./sparse /data1/sparce.dat
    real    0m2.051s
    user    0m0.008s
    sys     0m2.026s

    Running time on fixed kernel:
    [root@TENCENT64 ~]# time taskset 0x01 ./sparse /data1/sparce.dat
    real    0m0.471s
    user    0m0.004s
    sys     0m0.395s

Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I5169cb24853d4da32e2862a6626f1f058689b053

instrumentation/events/lttng-module/ext4.h

index 5f7ab280c6268614ad2e47e416e3878d23dbc525..72ad4c9f23751bce4a9c43dc3b270c167917126c 100644 (file)
@@ -460,6 +460,20 @@ LTTNG_TRACEPOINT_EVENT(ext4_mb_release_group_pa,
 )
 #endif
 
 )
 #endif
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,9,0))
+LTTNG_TRACEPOINT_EVENT(ext4_discard_preallocations,
+       TP_PROTO(struct inode *inode, unsigned int len, unsigned int needed),
+
+       TP_ARGS(inode, len, needed),
+
+       TP_FIELDS(
+               ctf_integer(dev_t, dev, inode->i_sb->s_dev)
+               ctf_integer(ino_t, ino, inode->i_ino)
+               ctf_integer(unsigned int, len, len)
+               ctf_integer(unsigned int, needed, needed)
+       )
+)
+#else
 LTTNG_TRACEPOINT_EVENT(ext4_discard_preallocations,
        TP_PROTO(struct inode *inode),
 
 LTTNG_TRACEPOINT_EVENT(ext4_discard_preallocations,
        TP_PROTO(struct inode *inode),
 
@@ -470,6 +484,7 @@ LTTNG_TRACEPOINT_EVENT(ext4_discard_preallocations,
                ctf_integer(ino_t, ino, inode->i_ino)
        )
 )
                ctf_integer(ino_t, ino, inode->i_ino)
        )
 )
+#endif
 
 LTTNG_TRACEPOINT_EVENT(ext4_mb_discard_preallocations,
        TP_PROTO(struct super_block *sb, int needed),
 
 LTTNG_TRACEPOINT_EVENT(ext4_mb_discard_preallocations,
        TP_PROTO(struct super_block *sb, int needed),
This page took 0.028564 seconds and 4 git commands to generate.