qos-scripts update:
- rewrite the RED qdisc calculations and add some comments this should fix the warnings about bursting (should also fix quirks with various linespeed settings) - reduce the calculated overhead for upstream, while i'm at it... SVN-Revision: 7782
This commit is contained in:
		@@ -9,7 +9,7 @@
 | 
				
			|||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=qos-scripts
 | 
					PKG_NAME:=qos-scripts
 | 
				
			||||||
PKG_VERSION:=1.1.1
 | 
					PKG_VERSION:=1.2.0
 | 
				
			||||||
PKG_RELEASE:=1
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 | 
					PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -261,7 +261,7 @@ start_interface() {
 | 
				
			|||||||
	for dir in up${halfduplex} ${download:+down}; do
 | 
						for dir in up${halfduplex} ${download:+down}; do
 | 
				
			||||||
		case "$dir" in
 | 
							case "$dir" in
 | 
				
			||||||
			up)
 | 
								up)
 | 
				
			||||||
				[ "$overhead" = 1 ] && upload=$(($upload * 98 / 100 - (32 * 128 / $upload)))
 | 
									[ "$overhead" = 1 ] && upload=$(($upload * 98 / 100 - (15 * 128 / $upload)))
 | 
				
			||||||
				dev="$device"
 | 
									dev="$device"
 | 
				
			||||||
				rate="$upload"
 | 
									rate="$upload"
 | 
				
			||||||
				dl_mode=""
 | 
									dl_mode=""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,20 +77,41 @@ END {
 | 
				
			|||||||
	# leaf qdisc
 | 
						# leaf qdisc
 | 
				
			||||||
	avpkt = 1200
 | 
						avpkt = 1200
 | 
				
			||||||
	for (i = 1; i <= n; i++) {
 | 
						for (i = 1; i <= n; i++) {
 | 
				
			||||||
		ql = int((avgrate[i] + linespeed) * 1024 / (8 * pktsize[i]))
 | 
					 | 
				
			||||||
		printf "tc qdisc add dev "device" parent 1:"class[i]"0 handle "class[i]"00: "
 | 
							printf "tc qdisc add dev "device" parent 1:"class[i]"0 handle "class[i]"00: "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# RED parameters - also used to determine the queue length for sfq
 | 
				
			||||||
 | 
							# calculate min value. for links <= 256 kbit, we use 1500 bytes
 | 
				
			||||||
 | 
							# use 50 ms queue length as min threshold for faster links
 | 
				
			||||||
 | 
							# max threshold is fixed to 3*min
 | 
				
			||||||
 | 
							base_pkt=3000
 | 
				
			||||||
 | 
							base_rate=256
 | 
				
			||||||
 | 
							min_lat=50
 | 
				
			||||||
 | 
							if (maxrate[i] <= base_rate) min = base_pkt
 | 
				
			||||||
 | 
							else min = int(maxrate[i] * 1024 / 8 * 0.05)
 | 
				
			||||||
 | 
							max = 3 * min
 | 
				
			||||||
 | 
							limit = (min + max) * 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (rtm1[i] > 0) {
 | 
							if (rtm1[i] > 0) {
 | 
				
			||||||
			# rt class - use sfq
 | 
								# rt class - use sfq
 | 
				
			||||||
			print "sfq perturb 2 limit " ql
 | 
								print "sfq perturb 2 limit "  limit
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			# non-rt class - use red
 | 
								# non-rt class - use RED
 | 
				
			||||||
			min = int(maxrate[i] * 1024 / 8 * 0.05)
 | 
					
 | 
				
			||||||
			if (min < avpkt) min = avpkt
 | 
								avpkt = pktsize[i]
 | 
				
			||||||
			dqb = 8 * min;
 | 
								# don't use avpkt values less than 500 bytes
 | 
				
			||||||
			max = int(2.1*min)
 | 
								if (avpkt < 500) avpkt = 500
 | 
				
			||||||
			rburst = int((2*min + max) / (3 * avpkt))
 | 
								# if avpkt is too close to min, scale down avpkt to allow proper bursting
 | 
				
			||||||
 | 
								if (avpkt > min * 0.70) avpkt *= 0.70
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								# according to http://www.cs.unc.edu/~jeffay/papers/IEEE-ToN-01.pdf a drop
 | 
				
			||||||
 | 
								# probability somewhere between 0.1 and 0.2 should be a good tradeoff
 | 
				
			||||||
 | 
								# between link utilization and response time (0.1: response; 0.2: utilization)
 | 
				
			||||||
 | 
								prob="0.12"
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
								rburst=int((2*min + max) / (3 * avpkt))
 | 
				
			||||||
			if (rburst < 2) rburst = 2
 | 
								if (rburst < 2) rburst = 2
 | 
				
			||||||
			print "red min " min " max " max " burst " rburst " avpkt " avpkt " limit " dqb " probability 0.04 ecn"
 | 
								print "red min " min " max " max " burst " rburst " avpkt " avpkt " limit " limit " probability " prob " ecn"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user