From 347a7ba01564c7c25d101238e45fed9024a3ea4f Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Mon, 24 Aug 2020 15:26:04 -0400 Subject: [PATCH] fix: ext4: limit the length of per-inode prealloc list (v5.9) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit See upstream commit: commit 27bc446e2def38db3244a6eb4bb1d6312936610a Author: brookxu 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 Signed-off-by: Mathieu Desnoyers Change-Id: I5169cb24853d4da32e2862a6626f1f058689b053 --- include/instrumentation/events/ext4.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/instrumentation/events/ext4.h b/include/instrumentation/events/ext4.h index e57aff8b..654a39b1 100644 --- a/include/instrumentation/events/ext4.h +++ b/include/instrumentation/events/ext4.h @@ -460,6 +460,20 @@ LTTNG_TRACEPOINT_EVENT(ext4_mb_release_group_pa, ) #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), @@ -470,6 +484,7 @@ LTTNG_TRACEPOINT_EVENT(ext4_discard_preallocations, ctf_integer(ino_t, ino, inode->i_ino) ) ) +#endif LTTNG_TRACEPOINT_EVENT(ext4_mb_discard_preallocations, TP_PROTO(struct super_block *sb, int needed), -- 2.34.1