OK. Now that networking is figured out, I am back to pool and nfs performance testing.
I guess the main thing I’m after here is to have these results sanity checked and to get suggestions for improvement of pool and NFS performance. Do they make sense? Is my hardware and software working properly? Are my rationales for the results reasonable?
Again, this this pool is composed of 12x 4TB HGST 512n 7.2k SAS drives in 2 vdevs, each with 6-drives in raidz2. It’s in an Dell R720xd with 256G RAM, a LSI LSI SAS2308 (Dell H710p Mini Mono in IT mode) running at PCIe 3.0 speeds (x8 I think), and an Optane 900p PCIe card. Both servers are now running TrueNAS DragonFish 24.04 stable because I figured TrueNAS was probably more tuned for this sort of thing than plain vanilla Ubuntu Server 22.04.4. The network is a 2x10G bond that iperfs at about 19.9 Gbps. MTU of 9000 seemed to help iperf numbers some. Pretty sure just one 10G woulda given the same result.
In playing around, I noticed that when doing random reads and writes, that the size of the file your using matters A LOT. I guess its more seeking. So I wrote a script to run the same command with various file sizes. I ran the script on the server with and without an slog, and via an nfs mount from another server with and without an slog. The pool and the dataset have sync=standard.
The command I used is as follows. It’s a random read/write test with a 64k block size, iodepth=8 and numjobs=8. Maybe this simulates lots of VM storage traffic.
fio --name=some_name --direct=1 --rw=randrw --ioengine=libaio --runtime=60 --numjobs=8 --time_based --group_reporting --eta-newline=1 --end_fsync=1 --size=some_size --iodepth=8 --bs=64k
For each file size, the script calls sync, runs the fio test, and then runs the fio test again and records the result. It’s just a shell for loop.
Several things stick out:
- On the server, the SLOG hurt more than it helped, but over NFS the SLOG helped tremendously. I’m guessing that despite specifying --end_fsync=1, that fio on the server didn’t sync all its writes. Maybe sync’d after a sequence of writes. But maybe NFS sync’d all the time. And maybe the reason the SLOG hurt is that caches writes in RAM are much faster than the Optane SLOG.
- The server read and write times on the smaller file sizes seem way too fast for spinning disks. I’m guessing this is because of read and write caching in ram since I suspect many of the fio writes on the server were not sync writes.
- The NFS performance did not change nearly as much as the server local performance did. I suspect that this is because NFS sync’s everything where the server fio didn’t. This would also explain why the SLOG helped NFS performance and didnt help (even hurt) server local performance.
- Sometimes NFS performance exceeded server local performance. I’m not sure I can come up with as good guess as to why. Maybe the io’s were space out more? Maybe the queue depth was exhausted on the server local test due to fast RAM caching?
- The random read and write numbers are almost identical in every case. No idea why. Guessing that everything is being cached in similarly fast ways.
- I plan to do the test with some 25G NICs, but I doubt I’ll see any difference. One, I’m dealing with a limitation of sync writes to the pool, but it sorta seems like the network speed actually doesn’t matter much. It’s like the fact that it’s going over NFS matters more than the speed of the network. Anyone have blazing fast NFS?
Here’s the summary of the results in order of file sizes.
1M
- Server Local:
- read: IOPS=210k, BW=12.8GiB/s
- write: IOPS=210k, BW=12.8GiB/s
- Server Local (no SLOG):
- read: IOPS=208k, BW=12.7GiB/s
- write: IOPS=208k, BW=12.7GiB/s
- NFS:
- read: IOPS=3636, BW=227MiB/s
- write: IOPS=3637, BW=227MiB/s
- NFS (no SLOG):
- read: IOPS=579, BW=36.2MiB/s
- write: IOPS=588, BW=36.8MiB/s
10M
- Server Local:
- read: IOPS=129k, BW=8057MiB/s
- write: IOPS=129k, BW=8055MiB/s
- Server Local (no SLOG):
- read: IOPS=168k, BW=10.3GiB/s
- write: IOPS=168k, BW=10.3GiB/s
- NFS:
- read: IOPS=3698, BW=231MiB/s
- write: IOPS=3698, BW=231MiB/s
- NFS (no SLOG):
- read: IOPS=555, BW=34.7MiB/s
- write: IOPS=563, BW=35.2MiB/s
100M
- Server Local:
- read: IOPS=38.2k, BW=2389MiB/s
- write: IOPS=38.3k, BW=2391MiB/s
- Server Local (no SLOG):
- read: IOPS=141k, BW=8825MiB/s
- write: IOPS=141k, BW=8822MiB/s
- NFS:
- read: IOPS=3933, BW=246MiB/s
- write: IOPS=3939, BW=246MiB/s
- NFS (no SLOG):
- read: IOPS=552, BW=34.6MiB/s
- write: IOPS=561, BW=35.1MiB/s
1G
- Server Local:
- read: IOPS=8936, BW=559MiB/s
- write: IOPS=8943, BW=559MiB/s
- Server Local (no SLOG):
- read: IOPS=7497, BW=469MiB/s
- write: IOPS=7495, BW=468MiB/s
- NFS:
- read: IOPS=4525, BW=283MiB/s
- write: IOPS=4522, BW=283MiB/s
- NFS (no SLOG):
- read: IOPS=540, BW=33.8MiB/s
- write: IOPS=548, BW=34.3MiB/s
5G
- Server Local:
- read: IOPS=1432, BW=89.5MiB/s
- write: IOPS=1429, BW=89.3MiB/s
- Server Local (no SLOG):
- read: IOPS=2372, BW=148MiB/s
- write: IOPS=2373, BW=148MiB/s
- NFS:
- read: IOPS=2105, BW=132MiB/s
- write: IOPS=2105, BW=132MiB/s
- NFS (no SLOG):
- read: IOPS=516, BW=32.3MiB/s
- write: IOPS=524, BW=32.8MiB/s
10G
- Server Local:
- read: IOPS=1061, BW=66.3MiB/s
- write: IOPS=1061, BW=66.4MiB/s
- Server Local (no SLOG):
- read: IOPS=1994, BW=125MiB/s
- write: IOPS=1996, BW=125MiB/s
- NFS:
- read: IOPS=1211, BW=75.7MiB/s
- write: IOPS=1211, BW=75.7MiB/s
- NFS (no SLOG):
- read: IOPS=531, BW=33.2MiB/s
- write: IOPS=539, BW=33.7MiB/s
100G
- Server Local:
- read: IOPS=493, BW=30.8MiB/s
- write: IOPS=500, BW=31.3MiB/s
- Server Local (no SLOG):
- read: IOPS=771, BW=48.2MiB/s
- write: IOPS=777, BW=48.6MiB/s
- NFS:
- not tested

