On Tue, May 21, 2019 at 11:10:26AM +0200, Jan Kara wrote: > > [root@localhost tmp]# dd if=/dev/zero of=/root/test.img bs=512 count=10000 oflag=dsync > > Yes and that's expected. It just shows how inefficient small synchronous IO > is. Look, dd(1) writes 512-bytes. From FS point of view we have to write: > full fs block with data (+4KB), inode to journal (+4KB), journal descriptor > block (+4KB), journal superblock (+4KB), transaction commit block (+4KB) - > so that's 20KB just from top of my head to write 512 bytes... Well, it's not *that* bad. With fdatasync(), we're only having to do this worse case thing every 8 writes. The other writes, we don't actually need to do any file-system level block allocation, so it's only a 512 byte write to the disk[1] seven out of eight writes. That's also true for the slice_idle hit, of course, We only need to do a jbd2 transaction when there is a block allocation, and that's only going to happen one in eight writes. - Ted [1] Of course, small synchronous writes to a HDD are *also* terrible for performance, just from the HDD's perspective. For a random write workload, if you are using disks with a 4k physical sector size, it's having to do a read/modify/write for each 512 byte write. And HDD vendors are talking about wanting to go to a 32k or 64k physical sector size... In this sequential write workload, you'll mostly be shielded from this by the HDD's cache, but the fact that you have to wait for the bits to hit the platter is always going to be painful.