Hi.
I wrote this shell script for get a low dirty data size, and a low cache/backing devices overload.
This script sets a low or very low writeback rate for medium or medium hight disks activity time.
And set medium writeback rate for very low disks activity time.
Then some information is printed in the standard output because this script is executed every second by an applet that displays the information in the user's desktop.
P.S. If this strategy was placed inside bcache, it should set the maximum writeback rate, and the PD controller should be more aggressive with the mimum writeback.
#!/bin/bash
bkDev="sdb"
chDev="nvme"
sysBcBase="/sys/block"
bcDev=`find /sys/block/$bkDev/ | grep -e 'bcache[0-9,a-z,A-Z]\{1,\}' | sed -e 's/.*\///'`
sysBcDev="$sysBcBase/$bcDev/bcache"
bkUsage="0"
chUsage="0"
echo -e "Device: $bcDev"
while read diskLine
do
#echo $diskLine >> /tmp/grrr.txt
read diskName diskUsage < <(echo $diskLine | sed -e 's/\([0-9,a-z]\{1,\}\).* \([0-9]\{1,\}\)/\1 \2/')
if [ $(expr "$diskName" : "$bkDev") != 0 ]; then
bkUsage=$diskUsage
elif [ $(expr "$diskName" : "$chDev") != 0 ]; then
chUsage=$diskUsage
fi
echo -e "Device: $diskName\tUsage: $diskUsage"
done < <(iostat -dmx --dec=0 -y 1 1 | grep -e "$bkDev\|$chDev")
attWBRateMin=$(cat $sysBcDev/writeback_rate_minimum)
newWBrateMin=$attWBRateMin
if [ "$bkUsage" -le "10" ] && [ "$chUsage" -le "10" ]; then
if [ "$attWBRateMin" -lt "50000" ]; then
newWBrateMin=50000;
fi
elif [ "$bkUsage" -le "20" ] && [ "$chUsage" -le "20" ]; then
newWBrateMin=10000;
elif [ "$bkUsage" -le "40" ] && [ "$chUsage" -le "40" ]; then
newWBrateMin=100;
elif [ "$attWBRateMin" -ge "10" ]; then
newWBrateMin=10;
fi
if [ "$newWBrateMin" != "$attWBRateMin" ]; then echo $newWBrateMin > $sysBcDev/writeback_rate_minimum; fi
echo -e "bkUsage: $bkUsage\tchUsage: $chUsage"
echo -en "Dirty: $(cat $sysBcDev/dirty_data)"
echo -en " Rate: $(cat $sysBcDev/writeback_rate)"
echo -en " R.Min: $(cat $sysBcDev/writeback_rate_minimum)\n"
echo -e "$(cat $sysBcDev/writeback_rate_debug)"