Nice reading, although improving the I/O usage is quite simple and complex at the same time.
I am going to give my 2 cents about storage and how to improve the I/O of HDD.
TL:DR, databases and journals have high I/O usage and that is where we can get the most gains.
Anything that requires databases kills the I/O in a mechanical drive, you can delay the writing to wait for low I/O to commit changes at the expense of losing data in a power failure situation.
We notice this in ext4 by simply adding noatime, where we do not change the date of the file accessed, so it does not write to the FS journal…
Block size also matters, but block size can’t be aimed at average block size, it has to be on the for example 80 to 95% percentile of block size and compare loss of space vs real file usage, dependent on the drive size and probably if the drive is SMR or CMR, I do not know the impact of large block size in a SMR drive.
If you really want to improve the I/O the choice is rather simple, move high I/O applications to another storage, use cache and/or delay/bundle commits. You can do one or all.
Everything else that has to do with filesystems are micro to medium optimizations, they help but only to a point.
The main killer of storj I/O performance IMO is a database or journal, it’s the ledger that has a really high I/O and the needle has to move a lot on the plate, so one way to fix it is move it to a high I/O storage like an SSD, or permit usage of external database applications like mysql/mariaDb or postgrees that are either clustered for resilience and are on a high I/O storage, this way you can have one single database engine for many nodes.
Issue is nodes are no longer independent isolated applications and have a single failure point, the database application.
One concern about caching too much stuff in memory, most of these apps run in machines that do not have ECC memory, while single event upset are rare, I would rather not push my luck.