On Thu, Aug 02, 2018 at 01:56:41PM +0000, Bean Huo (beanhuo) wrote: > > I am newbie on ext4, I tried the above method to disable readahead, > echo 0 > /sys/block/<dev>/queue/read_ahead_kb Then I read by 128kB > chunk size, ext4 will read the file by 4KB chunk size each > time. that means ext4 splits 128KB into 32 4KB to read. That's not > my expectation. Do you know how to still keep and let ext4 read by > 128KB in case of disable readahead? Hmm... that's not my expectation as well, but I've replicated your results. More interestingly, I tried the same experiment using XFS, and it does the same thing. I used as my test workload: dd if=/mnt/test bs=128k count=32 | sum Used strace to verify that dd was in fact issuing 128k reads: read(0, "\377\253a)\307\10\230\6\360,,:\226Rq\204\343\2522&44\307\341\372\271\271/\224#?\346"..., 131072) = 131072 write(1, "\377\253a)\307\10\230\6\360,,:\226Rq\204\343\2522&44\307\341\372\271\271/\224#?\346"..., 131072) = 131072 And then used btrace to monitor the I/O requests sent to the device: 252,4 0 413 0.077274997 14645 Q R 4408 + 8 [dd] 252,4 2 77 0.077355648 5529 C R 4408 + 8 [0] 252,4 0 414 0.077393725 14645 Q R 4416 + 8 [dd] 252,4 2 78 0.077630722 5529 C R 4416 + 8 [0] ... ... and indeed, the reads are being sent to the device in 4k chunks. That's indeed surprising. I'd have to do some debugging with tracepoints to see what requests are being issued from the mm/filemap.c to the file system. As others have suggested using O_DIRECT reads will certainly allow the 128k reads to be passed all the way down to the device: % dd if=/mnt/test bs=128k count=32 iflag=direct | sum results in the btrace output: 252,4 2 373 2339.068546832 21436 Q R 416 + 256 [dd] 252,4 2 374 2339.070683655 21436 Q R 672 + 256 [dd] 252,4 2 375 2339.072539850 21436 Q R 928 + 256 [dd] 252,4 2 376 2339.074531103 21436 Q R 1184 + 256 [dd] ... - Ted