This repository has been archived on 2026-04-18. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
server-config/modules/hardware.nix

71 lines
2.2 KiB
Nix

{
config,
lib,
pkgs,
service_configs,
...
}:
{
boot.initrd.availableKernelModules = [
"xhci_pci"
"ahci"
"usb_storage"
"usbhid"
"sd_mod"
];
boot.initrd.kernelModules = [ "dm-snapshot" ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
swapDevices = [ ];
hardware.cpu.amd.updateMicrocode = true;
hardware.enableRedistributableFirmware = true;
# HDD I/O tuning for torrent seeding workload (high-concurrency random reads).
#
# mq-deadline sorts requests into elevator sweeps, reducing seek distance.
# Aggressive deadlines (15s) let the scheduler accumulate more ops before dispatching,
# maximizing coalescence — latency is irrelevant since torrent peers tolerate 30-60s.
# fifo_batch=128 keeps sweeps long; writes_starved=16 heavily favors reads.
# 4 MiB readahead matches libtorrent piece extent affinity for sequential prefetch.
#
# This runs as a systemd oneshot rather than udev rules because the NixOS ZFS module
# hardcodes a udev rule that forces scheduler="none" on all ZFS member partitions'
# parent disks, overriding any scheduler set via udev on the disk event.
systemd.services.hdd-io-tuning = {
description = "HDD I/O scheduler and queue tuning";
after = [
"zfs-import.target"
"systemd-udev-settle.service"
];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
for dev in /sys/block/sd*; do
[ -f "$dev/queue/rotational" ] || continue
[ "$(cat "$dev/queue/rotational")" = "1" ] || continue
# skip removable devices (USB sticks report removable=1)
[ "$(cat "$dev/removable")" = "0" ] || continue
echo mq-deadline > "$dev/queue/scheduler"
echo 4096 > "$dev/queue/read_ahead_kb"
echo 512 > "$dev/queue/nr_requests"
echo 15000 > "$dev/queue/iosched/read_expire"
echo 15000 > "$dev/queue/iosched/write_expire"
echo 128 > "$dev/queue/iosched/fifo_batch"
echo 16 > "$dev/queue/iosched/writes_starved"
echo 4096 > "$dev/queue/max_sectors_kb" 2>/dev/null || true
echo "Tuned $(basename "$dev"): mq-deadline, 4M readahead, 15s deadlines"
done
'';
};
}