From: Chris Chilvers <hidden> Date: 2023-05-16 15:42:58
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
I suspect this is related to known issue #1. However, I tested the client
with rsize less than, equal to, and greater than readahead, and in all cases
I see the issue.
If I apply both the patches [2], [3] from the known issues to 6.4-rc1 then the
cache works as expected. I suspect only patch [2] is required but have not
tested patch [2] without [3].
Testing
=======
For the test I was just using dd to read 300 x 1gb files from an NFS
share to fill the cache, then repeating the read.
In the first test run, /var/cache/fscache steadily filled until reaching
300 GB. The read I/O was less than 1 MB/s, and the write speed was fairly
constant 270 MB/s.
In the second run, /var/cache/fscache remained at 300 GB, so no new data was
being written. However, the read I/O remained at less than 1 MB/s and the write
rate at 270 MB/s.
/var/cache/fscache
| 1st run | 2nd run
disk usage | 0 -> 300 GB | 300 GB
read speed | < 1 MB/s | < 1 MB/s
write speed | 270 MB/s | 270 MB/s
This seems to imply that the already cached data was being read from the source
server and re-written to the cache.
Known Issues
============
1. Unit test setting rsize < readahead does not properly read from
fscache but re-reads data from the NFS server
* This will be fixed with another dhowells patch [2]:
"[PATCH v6 2/2] mm, netfs, fscache: Stop read optimisation when
folio removed from pagecache"
2. "Cache volume key already in use" after xfstest runs involving
multiple mounts
* Simple reproducer requires just two mounts as follows:
mount -overs=4.1,fsc,nosharecache -o
context=system_u:object_r:root_t:s0 nfs-server:/exp1 /mnt1
mount -overs=4.1,fsc,nosharecache -o
context=system_u:object_r:root_t:s0 nfs-server:/exp2 /mnt2
* This should be fixed with dhowells patch [3]:
"[PATCH v5] vfs, security: Fix automount superblock LSM init
problem, preventing NFS sb sharing"
References
==========
[1] https://lore.kernel.org/linux-nfs/20230220134308.1193219-1-dwysocha@redhat.com/
[2] https://lore.kernel.org/linux-nfs/20230216150701.3654894-1-dhowells@redhat.com/T/#mf3807fa68fb6d495b87dde0d76b5237833a0cc81
[3] https://lore.kernel.org/linux-kernel/217595.1662033775@warthog.procyon.org.uk/
From: David Wysochanski <hidden> Date: 2023-05-16 19:29:47
On Tue, May 16, 2023 at 11:42 AM Chris Chilvers [off-list ref] wrote:
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
Thanks for the report.
If you reboot do you see reads from the cache?
You can check if the cache is being read from by looking in
/proc/fs/fscache/stats
at the "IO" line:
# grep IO /proc/fs/fscache/stats
IO : rd=80030 wr=0
You might consider saving that file before your test, then another copy after,
and doing a diff:
# diff -u /tmp/fscachestats.1 /tmp/fscachestats.2
I suspect this is related to known issue #1. However, I tested the client
with rsize less than, equal to, and greater than readahead, and in all cases
I see the issue.
If I apply both the patches [2], [3] from the known issues to 6.4-rc1 then the
cache works as expected. I suspect only patch [2] is required but have not
tested patch [2] without [3].
Agree it's likely only the patches from issue #1 are needed.
Let me ping dhowells and willy on that thread for issue #1 as it looks
stalled.
Testing
=======
For the test I was just using dd to read 300 x 1gb files from an NFS
share to fill the cache, then repeating the read.
Can you share:
1. NFS server you're using (is it localhost or something else)
2. NFS version
In the first test run, /var/cache/fscache steadily filled until reaching
300 GB. The read I/O was less than 1 MB/s, and the write speed was fairly
constant 270 MB/s.
In the second run, /var/cache/fscache remained at 300 GB, so no new data was
being written. However, the read I/O remained at less than 1 MB/s and the write
rate at 270 MB/s.
/var/cache/fscache
| 1st run | 2nd run
disk usage | 0 -> 300 GB | 300 GB
read speed | < 1 MB/s | < 1 MB/s
write speed | 270 MB/s | 270 MB/s
This seems to imply that the already cached data was being read from the source
server and re-written to the cache.
In addition to checking the above for the reads from the cache, you can also
see whether NFS reads are going over the wire pretty easily with a similar
technique.
Copy /proc/self/mounstats to a file before your test, then make a second copy
after the test, then run mountstats as follows:
mountstats -S /tmp/mountstats.1 -f /tmp/mountstats.2
From: Chris Chilvers <hidden> Date: 2023-05-18 20:21:04
On Tue, 16 May 2023 at 20:28, David Wysochanski [off-list ref] wrote:
On Tue, May 16, 2023 at 11:42 AM Chris Chilvers [off-list ref] wrote:
quoted
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
Thanks for the report.
If you reboot do you see reads from the cache?
On the first read after a reboot it uses the cache, but subsequent
reads do not use the cache.
You can check if the cache is being read from by looking in
/proc/fs/fscache/stats
at the "IO" line:
# grep IO /proc/fs/fscache/stats
IO : rd=80030 wr=0
Running the tests 4 times (twice before reboot, and twice after) give
the following metrics:
FS-Cache I/O (delta)
Run rd wr
1 0 39,250
2 130 38,894
3 39,000 0
4 72 38,991
Can you share:
1. NFS server you're using (is it localhost or something else)
2. NFS version
The NFS server and client are separate VMs on the same network.
Server NFS version: Ubuntu 22.04 jammy, kernel 5.15.0-1021-gcp
Client NFS version: Ubuntu 22.04 jammy, kernel 6.4.0-060400rc1-generic
(https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.4-rc1/)
Client nfs-utils: 2.6.3-rc6
Client cachefilesd: 0.10.10-0.2ubuntu1
In addition to checking the above for the reads from the cache, you can also
see whether NFS reads are going over the wire pretty easily with a similar
technique.
Copy /proc/self/mounstats to a file before your test, then make a second copy
after the test, then run mountstats as follows:
mountstats -S /tmp/mountstats.1 -f /tmp/mountstats.2
From: David Howells <dhowells@redhat.com> Date: 2023-05-19 09:45:31
Chris Chilvers [off-list ref] wrote:
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
Can you try reading from afs? You would need to enable CONFIG_AFS_FS in your
kernel if it's not already set.
Install kafs-client and do:
systemctl enable afs.mount
md5sum /afs/openafs.org/software/openafs/1.9.1/openafs-1.9.1-doc.tar.bz2
cat /proc/fs/fscache/stats
umount /afs/openafs.org
md5sum /afs/openafs.org/software/openafs/1.9.1/openafs-1.9.1-doc.tar.bz2
cat /proc/fs/fscache/stats
David
From: David Wysochanski <hidden> Date: 2023-05-19 11:55:12
On Thu, May 18, 2023 at 4:21 PM Chris Chilvers [off-list ref] wrote:
On Tue, 16 May 2023 at 20:28, David Wysochanski [off-list ref] wrote:
quoted
On Tue, May 16, 2023 at 11:42 AM Chris Chilvers [off-list ref] wrote:
quoted
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
Thanks for the report.
If you reboot do you see reads from the cache?
On the first read after a reboot it uses the cache, but subsequent
reads do not use the cache.
quoted
You can check if the cache is being read from by looking in
/proc/fs/fscache/stats
at the "IO" line:
# grep IO /proc/fs/fscache/stats
IO : rd=80030 wr=0
Running the tests 4 times (twice before reboot, and twice after) give
the following metrics:
FS-Cache I/O (delta)
Run rd wr
1 0 39,250
2 130 38,894
3 39,000 0
4 72 38,991
quoted
Can you share:
1. NFS server you're using (is it localhost or something else)
2. NFS version
The NFS server and client are separate VMs on the same network.
Server NFS version: Ubuntu 22.04 jammy, kernel 5.15.0-1021-gcp
Client NFS version: Ubuntu 22.04 jammy, kernel 6.4.0-060400rc1-generic
(https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.4-rc1/)
Client nfs-utils: 2.6.3-rc6
Client cachefilesd: 0.10.10-0.2ubuntu1
quoted
In addition to checking the above for the reads from the cache, you can also
see whether NFS reads are going over the wire pretty easily with a similar
technique.
Copy /proc/self/mounstats to a file before your test, then make a second copy
after the test, then run mountstats as follows:
mountstats -S /tmp/mountstats.1 -f /tmp/mountstats.2
Thanks Chris for all this info. I see you're using NFSv3 so I'll
focus on that, and review all this info for clues.
I also have been working on some updated test cases and see some very
unusual behavior like you're reporting.
I also confirmed that adding the two patches for "Issue #1" onto
6.4-rc1 resolve _most_ of the caching issues.
However, even after those patches, in some limited instances, there
are still NFS reads over the wire when there should only be reads from
the cache.
There may be multiple bugs here.
From: Chris Chilvers <hidden> Date: 2023-05-23 11:18:25
On Fri, 19 May 2023 at 10:40, David Howells [off-list ref] wrote:
Chris Chilvers [off-list ref] wrote:
quoted
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
Can you try reading from afs? You would need to enable CONFIG_AFS_FS in your
kernel if it's not already set.
Install kafs-client and do:
systemctl enable afs.mount
md5sum /afs/openafs.org/software/openafs/1.9.1/openafs-1.9.1-doc.tar.bz2
cat /proc/fs/fscache/stats
FS-Cache statistics
Cookies: n=13 v=7 vcol=0 voom=0
Acquire: n=13 ok=13 oom=0
LRU : n=1 exp=0 rmv=0 drp=0 at=2833
Invals : n=0
Updates: n=0 rsz=0 rsn=0
Relinqs: n=0 rtr=0 drop=0
NoSpace: nwr=0 ncr=0 cull=0
IO : rd=0 wr=18
RdHelp : RA=18 RP=0 WB=0 WBZ=0 rr=0 sr=0
RdHelp : ZR=1 sh=0 sk=0
RdHelp : DL=18 ds=18 df=0 di=0
RdHelp : RD=0 rs=0 rf=0
RdHelp : WR=18 ws=18 wf=0
This was on an instance that was only just created, so the cache was
initially unused (all the counters were 0).
From: David Wysochanski <hidden> Date: 2023-05-23 14:20:57
On Tue, May 23, 2023 at 7:18 AM Chris Chilvers [off-list ref] wrote:
On Fri, 19 May 2023 at 10:40, David Howells [off-list ref] wrote:
quoted
Chris Chilvers [off-list ref] wrote:
quoted
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
Can you try reading from afs? You would need to enable CONFIG_AFS_FS in your
kernel if it's not already set.
Install kafs-client and do:
systemctl enable afs.mount
md5sum /afs/openafs.org/software/openafs/1.9.1/openafs-1.9.1-doc.tar.bz2
cat /proc/fs/fscache/stats
FS-Cache statistics
Cookies: n=13 v=7 vcol=0 voom=0
Acquire: n=13 ok=13 oom=0
LRU : n=1 exp=0 rmv=0 drp=0 at=2833
Invals : n=0
Updates: n=0 rsz=0 rsn=0
Relinqs: n=0 rtr=0 drop=0
NoSpace: nwr=0 ncr=0 cull=0
IO : rd=0 wr=18
RdHelp : RA=18 RP=0 WB=0 WBZ=0 rr=0 sr=0
RdHelp : ZR=1 sh=0 sk=0
RdHelp : DL=18 ds=18 df=0 di=0
RdHelp : RD=0 rs=0 rf=0
RdHelp : WR=18 ws=18 wf=0
This was on an instance that was only just created, so the cache was
initially unused (all the counters were 0).
From: David Wysochanski <hidden> Date: 2023-05-24 16:14:54
On Fri, May 19, 2023 at 7:53 AM David Wysochanski [off-list ref] wrote:
On Thu, May 18, 2023 at 4:21 PM Chris Chilvers [off-list ref] wrote:
quoted
On Tue, 16 May 2023 at 20:28, David Wysochanski [off-list ref] wrote:
quoted
On Tue, May 16, 2023 at 11:42 AM Chris Chilvers [off-list ref] wrote:
quoted
While testing the fscache performance fixes [1] that were merged into 6.4-rc1
it appears that the caching no longer works. The client will write to the cache
but never reads.
Thanks for the report.
If you reboot do you see reads from the cache?
On the first read after a reboot it uses the cache, but subsequent
reads do not use the cache.
quoted
You can check if the cache is being read from by looking in
/proc/fs/fscache/stats
at the "IO" line:
# grep IO /proc/fs/fscache/stats
IO : rd=80030 wr=0
Running the tests 4 times (twice before reboot, and twice after) give
the following metrics:
FS-Cache I/O (delta)
Run rd wr
1 0 39,250
2 130 38,894
3 39,000 0
4 72 38,991
quoted
Can you share:
1. NFS server you're using (is it localhost or something else)
2. NFS version
The NFS server and client are separate VMs on the same network.
Server NFS version: Ubuntu 22.04 jammy, kernel 5.15.0-1021-gcp
Client NFS version: Ubuntu 22.04 jammy, kernel 6.4.0-060400rc1-generic
(https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.4-rc1/)
Client nfs-utils: 2.6.3-rc6
Client cachefilesd: 0.10.10-0.2ubuntu1
quoted
In addition to checking the above for the reads from the cache, you can also
see whether NFS reads are going over the wire pretty easily with a similar
technique.
Copy /proc/self/mounstats to a file before your test, then make a second copy
after the test, then run mountstats as follows:
mountstats -S /tmp/mountstats.1 -f /tmp/mountstats.2
Thanks Chris for all this info. I see you're using NFSv3 so I'll
focus on that, and review all this info for clues.
I also have been working on some updated test cases and see some very
unusual behavior like you're reporting.
I also confirmed that adding the two patches for "Issue #1" onto
6.4-rc1 resolve _most_ of the caching issues.
However, even after those patches, in some limited instances, there
are still NFS reads over the wire when there should only be reads from
the cache.
There may be multiple bugs here.
I actually misspoke regarding "multiple bugs", as I forgot to add a
small NFS hunk (see below) needed to dhowells 2nd patch (v6 of mm,
netfs, fscache: Stop read optimisation when folio removed from
pagecache).
After the below small hunk was added on top of dhowells 2nd patch, all
my tests pass.
I've also enhanced my existing tests to check NFS READs, fscache
READs, and fscache WRITEs as expected.
And I added an additional test to create files the size of RAM, read
them multiple times, and check for the ops are as expected.
So I'm confident if we add dhowells 2 patches, plus the below hunk for
NFS, these caching issues will be resolved.