Odd split writes in fuse when going from kernel 3.10 to 4.18

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello!

I've been looking at a strange performance issue with a fuse filesystem that showed up when upgrading the system it runs on from CentOS 7 to Rocky 8. We've narrowed it down to what looks like an extra write issued by fuse, but don't see any reason why that should happen.

Here are the particulars for the narrowed down test:

* The Centos 7 box is running kernel 3.10.0-1160.el7.x86_64 and fuse 2.9.2-11.el7 (i.e. the stock distro kernel and fuse from Centos 7).

* We run fusexmp:

  [root@localhost ~]# ./fusexmp -obig_writes /mnt/passthrough/

* We do two 4000-byte writes to the passthrough filesystem:

  # dd if=/dev/zero of=/mnt/passthrough/mnt/cache/file1 bs=4000 count=2
  2+0 records in
  2+0 records out
  8000 bytes (8.0 kB) copied, 0.00174133 s, 4.6 MB/s

* strace shows that this translates to two 4000-byte writes via the fuse filesystem:

  [pid  9795] pwrite64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4000, 0) = 4000
  [pid  9795] pwrite64(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4000, 4000) = 4000

So far, so good and everything makes sense, Now Rocky 8:

* The Rocky 8 box is running kernel 4.18.0-513.24.1.el8_9.x86_64 and fuse 2.9.7-17.el8 (i.e. again, the stock distro kernel and fuse for Rocky 8).

* We run passthrough:

  [root@localhost example]# ./passthrough /mnt/passthrough/

* We do the same two 4000-byte writes to the passthrough filesystem:

  [root@localhost example]# dd if=/dev/zero of=/mnt/passthrough/mnt/cache/file1 bs=4000 count=2
  2+0 records in
  2+0 records out
  8000 bytes (8.0 kB, 7.8 KiB) copied, 0.00227022 s, 3.5 MB/s

* But, and here's the unexpected piece, strace shows that this translates to a single 4000-byte write, a 96-byte write, and then a 3904-byte write via the fuse filesystem:

  [pid 62909] pwrite64(8, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4000, 0) = 4000
  [pid 62909] pwrite64(8, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 96, 4000) = 96
  [pid 62910] pwrite64(8, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 3904, 4096) = 3904

Can anyone help explain why one of the 4000-byte writes is being split into a 96-byte and then 3904-byte write?

Thanks,

Daphne






[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux