Skip to content

Instantly share code, notes, and snippets.

@mcgrof
Created December 13, 2023 03:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mcgrof/180a06f76cd3dbc05f27001df382a069 to your computer and use it in GitHub Desktop.
Save mcgrof/180a06f76cd3dbc05f27001df382a069 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -e
set_sched()
{
TARGET_DEV=$1
TARGET_SCHED=$2
echo $TARGET_SCHED > /sys/block/$TARGET_DEV/queue/scheduler
}
if [[ $# -ne 7 ]]; then
echo "Usage: <$0> <fs-blocksize> <file-size> <data-blocksize> <io-sched>"
echo "Examples:"
echo "$0 4k 1GiB 4MiB /dev/nvme0n1 /dev/nvme1n1 /mnt-nvme kyber"
echo "$0 4k 1GiB 4MiB /dev/nvme0n1 /dev/nvme1n1 /mnt-nvme mq-deadline"
echo "$0 4k 1GiB 4MiB /dev/nvme0n1 /dev/nvme1n1 /mnt-nvme none"
echo "$0 4k 1GiB 4MiB /dev/nvme0n1 /dev/nvme1n1 /mnt-nvme bfq"
exit
fi
BS=$1
FILE_SIZE=$2
DATA_BS=$3
DATA_DEV=$4
DDEV=$(basename $DATA_DEV)
LOGDEV=$5
LDEV=$(basename $LOGDEV)
MNT_PATH=$6
SCHED=$7
mkdir -p $MNT_PATH
if grep -q $MNT_PATH /proc/mounts; then
umount $MNT_PATH
fi
nvme format --lbaf=1 --force $DATA_DEV
nvme format --lbaf=1 --force $LOGDEV
#mkfs.xfs -f -b size=$BS -d agcount=32,sectsize=4k $DATA_DEV -i size=2048 -m reflink=0 -l logdev=$LOGDEV,size=2020m,sectsize=4k
#mkfs.xfs -f -b size=$BS -d agcount=32,sectsize=4k $DATA_DEV -m reflink=0 -i nrext64=1 -l logdev=$LOGDEV,size=2020m,sectsize=4k
mkfs.xfs -f -b size=$BS -d agcount=32,sectsize=4k $DATA_DEV -m reflink=0 -l logdev=$LOGDEV,size=2020m,sectsize=4k
mount $DATA_DEV -o logdev=$LOGDEV,noatime $MNT_PATH
case $SCHED in
# https://docs.kernel.org/block/kyber-iosched.html
kyber)
set_sched $DDEV kyber
set_sched $LDEV kyber
# default is 2000000 in nanoseconds
#echo 2000000 > /sys/block/$DDEV/queue/iosched/read_lat_nsec
# default is 10000000 in nanoseconds
#echo 10000000 > /sys/block/$DDEV/queue/iosched/write_lat_nsec
;;
# https://docs.kernel.org/block/bfq-iosched.html
bfq)
set_sched $DDEV bfq
set_sched $LDEV bfq
# Disable low latency, its enabled by default
echo "Disabling low latency for bqf"
echo 0 > /sys/block/$DDEV/queue/iosched/low_latency
echo 1 > /sys/block/$LDEV/queue/iosched/low_latency
# default is 124, milliseconds
#echo 10000 > /sys/block/$DDEV/queue/iosched/timeout_sync
# default is 0, so disabled. Max sectors to service
#echo 16384 > /sys/block/$DDEV/queue/iosched/max_budget
#
# 4 MiB
#echo 4194304 > /sys/block/$DDEV/queue/iosched/max_budget
#
# 2 MiB
#echo 2097152 > /sys/block/$DDEV/queue/iosched/max_budget
#
# 64k
#echo 65536 > /sys/block/$DDEV/queue/iosched/max_budget
;;
# https://docs.kernel.org/block/deadline-iosched.html
mq-deadline)
set_sched $DDEV mq-deadline
set_sched $LDEV mq-deadline
#async_depth fifo_batch front_merges prio_aging_expire read_expire write_expire writes_starved
echo 0 > /sys/block/$DDEV/queue/iosched/front_merges
# Default is 16.
# 2 MiB?
echo 512 > /sys/block/$DDEV/queue/iosched/fifo_batch
# Default is 5000 in ms
#echo 25000 > /sys/block/$DDEV/queue/iosched/writes_starved
;;
*)
# Note, none is the default for NVMe and is known to be
# the best for NVMe. There are no tunables for it as well.
set_sched $DDEV $SCHED
set_sched $LDEV $SCHED
;;
esac
./go/bin/dperf -f $FILE_SIZE -b $DATA_BS -i 128 $MNT_PATH
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment