afs: Do better accretion of small writes on newly created content
authorDavid Howells <dhowells@redhat.com>
Fri, 6 Apr 2018 13:17:26 +0000 (14:17 +0100)
committerDavid Howells <dhowells@redhat.com>
Mon, 9 Apr 2018 20:54:48 +0000 (21:54 +0100)
commit5a8132761609bd7e42db642d6f157140d5bf2ae8
tree70230e95b522728ccf37c67bc69b70abc62df003
parent76a5cb6fc1e22a2a316fb690fc4cdd5121d1c0ff
afs: Do better accretion of small writes on newly created content

Processes like ld that do lots of small writes that aren't necessarily
contiguous result in a lot of small StoreData operations to the server, the
idea being that if someone else changes the data on the server, we only
write our changes over that and not the space between.  Further, we don't
want to write back empty space if we can avoid it to make it easier for the
server to do sparse files.

However, making lots of tiny RPC ops is a lot less efficient for the server
than one big one because each op requires allocation of resources and the
taking of locks, so we want to compromise a bit.

Reduce the load by the following:

 (1) If a file is just created locally or has just been truncated with
     O_TRUNC locally, allow subsequent writes to the file to be merged with
     intervening space if that space doesn't cross an entire intervening
     page.

 (2) Don't flush the file on ->flush() but rather on ->release() if the
     file was open for writing.

Just linking vmlinux.o, without this patch, looking in /proc/fs/afs/stats:

file-wr : n=441 nb=513581204

and after the patch:

file-wr : n=62 nb=513668555

there were 379 fewer StoreData RPC operations at the expense of an extra
87K being written.

Signed-off-by: David Howells <dhowells@redhat.com>
fs/afs/callback.c
fs/afs/dir.c
fs/afs/file.c
fs/afs/internal.h
fs/afs/write.c