From: Christoph Hellwig <hch@infradead.org>
To: Trond Myklebust <trondmy@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org,
Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>,
linux-fsdevel@vger.kernel.org
Subject: NFS dentry caching regression? was Re: [GIT PULL] Please pull NFS client updates for Linux 6.19
Date: Wed, 17 Dec 2025 01:32:30 -0800 [thread overview]
Message-ID: <aUJ4rjyAOW3EWC-k@infradead.org> (raw)
In-Reply-To: <36d449e22bf28df97c7717ab4dfb30f100f159a4.camel@kernel.org>
Hi all,
the merge of this branch causes NFS lookup operation to shoot up a lot
for me. And with merge I mean merge - both parent of the merge on their
own are fine.
With the script below that simulates running python scripts with lots
of imports that was created to benchmark delegation performance, the
number of lookups in the measurement period shoots up from 4 to about
410000, which is a bit suboptimal. I have no idea how this could
happen, but it must be related to some sort of pathname lookup changes
I guess. Other operations looks roughly the same.
---
#!/usr/bin/env bash
set -euo pipefail
if [ $# -ne 1 ]; then
echo "Usage: $0 <NFS_MOUNT_PATH>"
exit 1
fi
NFS_MOUNT="$1"
WARMUP_FILE_COUNT="8000"
RUNS=200
MODULE_COUNT=200
SAVEFILE="/tmp/nfsstat.bak"
echo "=== NFS delegation benchmark ==="
echo "NFS mount: $NFS_MOUNT"
echo "Warmup file count: $WARMUP_FILE_COUNT"
echo "Number of runs: $RUNS"
echo "Module count: $MODULE_COUNT"
echo
################################################################################
# Step 1: Create temporary directory on NFS
################################################################################
TEST_DIR=$(mktemp -d "$NFS_MOUNT/test_deleg_bench.XXXXXX")
MODULE_DIR="$TEST_DIR/pymods"
mkdir -p "$MODULE_DIR/delegtest"
MODDIR_INIT="$MODULE_DIR/delegtest/__init__.py"
cat > "$MODDIR_INIT" <<EOF
import os
import glob
file_paths = glob.glob(os.path.join(os.path.dirname(__file__), "*.py"))
__all__ = [
os.path.basename(f)[:-3]
for f in file_paths
if os.path.isfile(f) and not f.endswith("__init__.py")
]
EOF
echo "[1] Creating $WARMUP_FILE_COUNT tiny files to accumulate delegations..."
mkdir -p "$TEST_DIR/fill"
for i in $(seq 1 "$WARMUP_FILE_COUNT"); do
echo "f$i" > "$TEST_DIR/fill/file_$i"
done
echo "[1] Warmup delegation files created."
################################################################################
# Step 2: Create many tiny Python modules to exercise import workload
################################################################################
echo "[2] Creating $MODULE_COUNT dummy python modules..."
for i in $(seq 1 "$MODULE_COUNT"); do
echo "x = $i" > "$MODULE_DIR/delegtest/mod$i.py"
done
#umount -o remount $NFS_MOUNT
# Python snippet:
# repeatedly import all modN modules; measure iterations completed
BENCH_SCRIPT="$TEST_DIR/bench.py"
cat > "$BENCH_SCRIPT" <<EOF
import sys
sys.path.insert(0, "$MODULE_DIR")
from delegtest import *
EOF
################################################################################
# Step 3: Pre-benchmark NFS client counters
################################################################################
echo "[3] Capturing baseline NFS client stats..."
sync $NFS_MOUNT
#mount -o remount $NFS_MOUNT
cp /proc/net/rpc/nfs $SAVEFILE
################################################################################
# Step 4: Run Python benchmark
################################################################################
echo "[4] Running Python import benchmark..."
time {
for i in $(seq 1 "$RUNS"); do
python3 "$BENCH_SCRIPT"
done
}
################################################################################
# Step 5: Produce NFS client delta report
################################################################################
echo
echo "=== NFS client DELTA REPORT ==="
echo
nfsstat -c -S $SAVEFILE -l
rm -f $SAVEFILE
echo
echo "Test directory: $TEST_DIR"
echo
echo "=== Done ==="
next prev parent reply other threads:[~2025-12-17 9:32 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-11 14:07 Trond Myklebust
2025-12-12 10:09 ` pr-tracker-bot
2025-12-17 9:32 ` Christoph Hellwig [this message]
2025-12-17 9:53 ` NFS dentry caching regression? was " Christoph Hellwig
2025-12-17 14:23 ` [External] : " Anna Schumaker
2025-12-17 22:03 ` Anna Schumaker
2025-12-18 5:13 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aUJ4rjyAOW3EWC-k@infradead.org \
--to=hch@infradead.org \
--cc=brauner@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=trondmy@kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®