Add 'bufferbloat.sh'
Initial commit
This commit is contained in:
parent
cfb414874a
commit
4156d5b960
212
bufferbloat.sh
Normal file
212
bufferbloat.sh
Normal file
@ -0,0 +1,212 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Display bandwidth for our WAN interface, measure for 10 Seconds, then it quits:
|
||||
# Relevent line: Total Send Rate -> Last 10 Seconds
|
||||
# Relevant line: Total receive rate -> Last 10 Seconds
|
||||
#iftop -i igb0 -n -N -b -t -p -s 10
|
||||
|
||||
# Get DL bw last 10 seconds
|
||||
# iftop -i igb0 -n -N -b -t -p -s 10 | grep "Total receive rate" | xargs echo | cut -d " " -f5
|
||||
|
||||
# Get DL bw last 2 seconds
|
||||
# iftop -i igb0 -n -N -b -t -p -s 10 | grep "Total receive rate" | xargs echo | cut -d " " -f4
|
||||
|
||||
# Get the average ping to 1.1.1.1 in ms
|
||||
#ping -t 10 -q 1.1.1.1 | cut -d "/" -s -f5
|
||||
|
||||
# Idea: If average ping is >200ms, reduce current download bandwidth by 10%
|
||||
# Repeat until ping is OK or lower limit reached
|
||||
# If average Ping <50ms -> Increase Bandwidth by 10% until upper limit reached
|
||||
|
||||
|
||||
# maximum allowed ping in ms
|
||||
pingMax=200
|
||||
# optimal ping in ms
|
||||
pingOpt=50
|
||||
# maximum possible download bandwidth in Mbit/s
|
||||
downloadBWMax=80
|
||||
downloadBWMaxBits=$(units -o "%0.f" -t "${downloadBWMax} megabit" "bits")
|
||||
# minimum allowed Download Bandwidth
|
||||
downloadBWMin=5
|
||||
downloadBWMinBits=$(units -o "%0.f" -t "${downloadBWMin} megabit" "bits")
|
||||
# downloadPipe as in opnsense: ipfw pipe show
|
||||
downloadPipe=10000
|
||||
uploadPipe=10001
|
||||
# maxmimum possible upload bandwidth in Mbit/s
|
||||
uploadBWMax=20
|
||||
uploadBWMaxBits=$(units -o "%0.f" -t "${uploadBWMax} megabit" "bits")
|
||||
# minimum allowed upload Bandwidth
|
||||
uploadBWMin=2
|
||||
uploadBWMinBits=$(units -o "%0.f" -t "${uploadBWMin} megabit" "bits")
|
||||
|
||||
# private vars
|
||||
avgping=1
|
||||
avgDownloadBW10sInBits=1
|
||||
avgUploadBW10sInBits=1
|
||||
|
||||
|
||||
resetDownloadBandwidth() {
|
||||
# resets the Download Bandwith to the maximum value
|
||||
echo "Resetting download bandwith limit to $downloadBWMax MBit/s"
|
||||
ipfw pipe "$downloadPipe" config bw "${downloadBWMax}Mbit"
|
||||
}
|
||||
|
||||
resetUploadBandwidth() {
|
||||
# resets the Upload Bandwith to the maximum value
|
||||
echo "Resetting upload bandwith limit to $uploadBWMax MBit/s"
|
||||
ipfw pipe "$uploadPipe" config bw "${uploadBWMax}Mbit"
|
||||
}
|
||||
|
||||
decreaseDownloadBandwidth() {
|
||||
# currently used Bandwidth limit in Mbit/s
|
||||
currentBW=$(ipfw pipe show | grep "${downloadPipe}:" | xargs echo | cut -d " " -f2)
|
||||
currentBWInBits=$(units -o "%0.f" -t "${currentBW} megabit" "bits")
|
||||
echo "The current download BW limit in bits is $currentBWInBits and in Mbit/s $currentBW "
|
||||
|
||||
# decrease current average Bandwidth by 10%
|
||||
# newBW=$(echo "$avgDownloadBW10sInBits * 0.9" | bc)
|
||||
# decrease currently set Bandwidth by 10%
|
||||
newBW=$(echo "$currentBWInBits * 0.9" | bc)
|
||||
|
||||
newBWMbit=$(units -o "%0.f" -t "${newBW} bits" "megabit")
|
||||
|
||||
echo "The average BW in the last 10s was $avgDownloadBW10s new BW would be $newBWMbit Mbit/s"
|
||||
|
||||
if [ 1 -eq "$(echo "${newBW} < ${downloadBWMinBits}" | bc)" ]
|
||||
then
|
||||
echo "Setting current Download Bandwidth to the minimum allowed Bandwidth $downloadBWMin"
|
||||
ipfw pipe "$downloadPipe" config bw "${downloadBWMin}Mbit"
|
||||
else
|
||||
echo "Decreasing current avg Download Bandwidth by 10%, setting it to $newBW Bits/s"
|
||||
echo "Decreasing current avg Download Bandwidth by 10%, setting it to $newBWMbit MBit/s"
|
||||
ipfw pipe "$downloadPipe" config bw "${newBWMbit}Mbit"
|
||||
fi
|
||||
}
|
||||
|
||||
decreaseUploadBandwidth() {
|
||||
# currently used Bandwidth limit in Mbit/s
|
||||
currentBW=$(ipfw pipe show | grep "${uploadPipe}:" | xargs echo | cut -d " " -f2)
|
||||
currentBWInBits=$(units -o "%0.f" -t "${currentBW} megabit" "bits")
|
||||
echo "The current upload BW limit in bits is $currentBWInBits and in Mbit/s $currentBW "
|
||||
|
||||
# decrease current average Bandwidth by 10%
|
||||
# newBW=$(echo "$avgUploadBW10sInBits * 0.9" | bc)
|
||||
# decrease currently set Bandwidth by 10%
|
||||
newBW=$(echo "$currentBWInBits * 0.9" | bc)
|
||||
|
||||
newBWMbit=$(units -o "%0.f" -t "${newBW} bits" "megabit")
|
||||
|
||||
echo "The average BW in the last 10s was $avgUploadBW10sInBits new BW would be $newBWMbit Mbit/s"
|
||||
|
||||
if [ 1 -eq "$(echo "${newBW} < ${uploadBWMinBits}" | bc)" ]
|
||||
then
|
||||
echo "Setting current Upload Bandwidth to the minimum allowed Bandwidth $uploadBWMin"
|
||||
ipfw pipe "$uploadPipe" config bw "${uploadBWMin}Mbit"
|
||||
else
|
||||
echo "Decreasing current avg Upload Bandwidth by 10%, setting it to $newBW Bits/s"
|
||||
echo "Decreasing current avg Upload Bandwidth by 10%, setting it to $newBWMbit MBit/s"
|
||||
ipfw pipe "$uploadPipe" config bw "${newBWMbit}Mbit"
|
||||
fi
|
||||
}
|
||||
|
||||
increaseDownloadBandwidth() {
|
||||
# currently used Bandwidth limit in Mbit/s
|
||||
currentBW=$(ipfw pipe show | grep "${downloadPipe}:" | xargs echo | cut -d " " -f2)
|
||||
currentBWInBits=$(units -o "%0.f" -t "${currentBW} megabit" "bits")
|
||||
echo "The current download BW in bits is $currentBWInBits and in Mbit/s $currentBW "
|
||||
|
||||
# increase current average Bandwidth by 10%
|
||||
# newBW=$(echo "$avgDownloadBW10sInBits * 1.1" | bc)
|
||||
# increase currently set Bandwidth by 10%
|
||||
newBW=$(echo "$currentBWInBits * 1.1" | bc)
|
||||
|
||||
newBWMbit=$(units -o "%0.f" -t "${newBW} bits" "megabit")
|
||||
|
||||
echo "The average BW in the last 10s was $avgDownloadBW10s new BW would be $newBWMbit Mbit/s"
|
||||
|
||||
if [ 1 -eq "$(echo "${newBW} > ${downloadBWMaxBits}" | bc)" ]
|
||||
then
|
||||
echo "Setting current Download Bandwidth to the maximum allowed Bandwidth $downloadBWMax"
|
||||
ipfw pipe "$downloadPipe" config bw "${downloadBWMax}Mbit"
|
||||
else
|
||||
echo "Increasing current avg Download Bandwidth by 10%, setting it to $newBW Bits/s"
|
||||
echo "Increasing current avg Download Bandwidth by 10%, setting it to $newBWMbit MBit/s"
|
||||
ipfw pipe "$downloadPipe" config bw "${newBWMbit}Mbit"
|
||||
fi
|
||||
}
|
||||
|
||||
increaseUploadBandwidth() {
|
||||
# currently used Bandwidth limit in Mbit/s
|
||||
currentBW=$(ipfw pipe show | grep "${uploadPipe}:" | xargs echo | cut -d " " -f2)
|
||||
currentBWInBits=$(units -o "%0.f" -t "${currentBW} megabit" "bits")
|
||||
echo "The current upload BW in bits is $currentBWInBits and in Mbit/s $currentBW "
|
||||
|
||||
# increase current average Bandwidth by 10%
|
||||
# newBW=$(echo "$avgUploadBW10sInBits * 1.1" | bc)
|
||||
# increase currently set Bandwidth by 10%
|
||||
newBW=$(echo "$currentBWInBits * 1.1" | bc)
|
||||
|
||||
newBWMbit=$(units -o "%0.f" -t "${newBW} bits" "megabit")
|
||||
|
||||
if [ 1 -eq "$(echo "${newBWMbit} == ${currentBW}" | bc)" ]
|
||||
then
|
||||
echo "Forcing increment by 1MBit"
|
||||
newBWMbit=$(echo "${newBWMbit} + 1" | bc)
|
||||
fi
|
||||
|
||||
echo "The average upload BW in the last 10s was $avgUploadBW10sInBits new BW would be $newBWMbit Mbit/s"
|
||||
|
||||
if [ 1 -eq "$(echo "${newBW} > ${uploadBWMaxBits}" | bc)" ]
|
||||
then
|
||||
echo "Setting current Upload Bandwidth to the maximum allowed Bandwidth $uploadBWMax"
|
||||
ipfw pipe "$uploadPipe" config bw "${uploadBWMax}Mbit"
|
||||
else
|
||||
echo "Increasing current avg Upload Bandwidth by 10%, setting it to $newBW Bits/s"
|
||||
echo "Increasing current avg Upload Bandwidth by 10%, setting it to $newBWMbit MBit/s"
|
||||
ipfw pipe "$uploadPipe" config bw "${newBWMbit}Mbit"
|
||||
fi
|
||||
}
|
||||
|
||||
while true
|
||||
do
|
||||
echo "Pinging vps02 for average latency"
|
||||
avgping=$(ping -t 10 -q 51.254.48.251 | cut -d "/" -s -f5)
|
||||
echo "Average ping is $avgping"
|
||||
|
||||
#bwLast10s=$(iftop -i igb0 -n -N -b -t -p -s 10)
|
||||
#avgDownloadBW10s=$(echo "$bwLast10s" | grep "Total receive rate" | xargs echo | cut -d " " -f5)
|
||||
#avgUploadBW10s=$(echo "$bwLast10s" | grep "Total send rate" | xargs echo | cut -d " " -f5)
|
||||
#echo "The average Download in the last 10 seconds is $avgDownloadBW10s"
|
||||
#echo "The average Upload in the last 10 seconds is $avgUploadBW10s"
|
||||
|
||||
#avgDownloadBW10s=$(echo "$avgDownloadBW10s"| sed "s/B/ bit/g" | sed "s/Kb/ kilobit/g" | sed "s/Mb/ megabit/g" | sed "s/Gb/ gigabit/g")
|
||||
#avgUploadBW10s=$(echo "$avgUploadBW10s"| sed "s/B/ bit/g" | sed "s/Kb/ kilobit/g" | sed "s/Mb/ megabit/g" | sed "s/Gb/ gigabit/g")
|
||||
#echo "The average Download in the last 10 seconds is $avgDownloadBW10s"
|
||||
#echo "The average Upload in the last 10 seconds is $avgUploadBW10s"
|
||||
|
||||
#avgDownloadBW10sInBits=$(units -o "%0.f" -t "$avgDownloadBW10s" "bits")
|
||||
#avgUploadBW10sInBits=$(units -o "%0.f" -t "$avgUploadBW10s" "bits")
|
||||
#echo "The average Download in BITS in the last 10 seconds is $avgDownloadBW10sInBits"
|
||||
#echo "The average Upload in BITS in the last 10 seconds is $avgUploadBW10sInBits"
|
||||
|
||||
# if the average ping is higher than the maximum allowed ping, decrease bandwidth
|
||||
if [ 1 -eq "$(echo "${avgping} > ${pingMax}" | bc)" ]
|
||||
then
|
||||
echo "ping is too high ${avgping}"
|
||||
decreaseDownloadBandwidth
|
||||
decreaseUploadBandwidth
|
||||
fi
|
||||
|
||||
# if the average ping is below optimal, increase bandwidth
|
||||
if [ 1 -eq "$(echo "${avgping} < ${pingOpt}" | bc)" ]
|
||||
then
|
||||
echo "ping is optimal ${avgping}"
|
||||
increaseDownloadBandwidth
|
||||
increaseUploadBandwidth
|
||||
fi
|
||||
|
||||
|
||||
echo "Sleeping for a minute"
|
||||
sleep 5
|
||||
done
|
||||
|
Loading…
Reference in New Issue
Block a user