ZINC - A ZNS Interference-aware NVMe Command Scheduler is a configurable I/O scheduler for NVMe ZNS SSDs. It allows prioritizing I/O commands (write, read) over I/O management operations (reset, finish).
Warning
ZINC is based on Linux 6.3.8 and relies on it codebase, it is not evaluated on other Linux versions and might require extensive modifications to run it on other kernel versions.
- clone this repository:
git clone https://github.com/stonet-research/zinc-scheduler.git
cd zinc-scheduler
- Clones the linux block layer for Linux 6.3 and copy the Linux directory directly into this repository
./install-linux-6.sh
- Build ZINC
cp Makefile linux-6.3.8/block/
cp zinc.c linux-6.3.8/block/
cd linux-6.3.8/block/
# Make module
make
-
Ensure that ZINC is build (see
How to install
). -
Insert the ZINC module (needs to be done on each recompilation or system reboot):
cd linux-6.3.8/block/
# Install the module
sudo insmod zinc.ko
# If it fails because it is already in use, run: `sudo rmmod zinc`.
- Assign to NVMe ZNS device (can be used like any Linux I/O scheduler):
echo zinc | sudo tee /sys/block/nvme*n*/queue/scheduler # nvme*n* is the device name.
Both ZNS management operations (i.e., reset, finish) have identical parameters, except for their name. This distinction allows using different configurations for reset and finish. We provide the following parameters:
- {reset,finish}_epoch_interval: window when to retry issuing a reset in milliseconds
- {reset,finish}_command_tokens: the number of write requests before a reset can be issued (in 8 KiB units)
- {reset,finish}_minimum_concurrency_treshold: below this number of in-flight write requests, managemet operations are not stalled (no scheduling, also in 8 kiB units)
- {reset,finish}_maximum_epoch_holds: number of retries for reset (to prevent reset starvation)
- First assign ZINC to an NVMe device (see
How to use ZINC
) - Change the configuration options (in
/sys/block/nvme*n*/queue/iosched/
), for example to set the_maximum_epoch_holds
forreset
do:
echo 3 | sudo tee /sys/block/nvme*n*/queue/iosched/reset_maximum_epoch_holds