From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mout.gmx.net", Issuer "TeleSec ServerPass DE-1" (verified OK)) by huchra.bufferbloat.net (Postfix) with ESMTPS id 6FCD221F682 for ; Fri, 10 Jul 2015 12:27:26 -0700 (PDT) Received: from hms-beagle-7.home.lan ([217.237.70.193]) by mail.gmx.com (mrgmx003) with ESMTPSA (Nemesis) id 0LmKag-1Yf8Pq38pW-00Zz7a; Fri, 10 Jul 2015 21:27:20 +0200 Content-Type: multipart/mixed; boundary="Apple-Mail=_752A06AF-F005-46E3-9B68-AC6C7DB9F248" Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) From: Sebastian Moeller In-Reply-To: <55A01993.7030007@imap.cc> Date: Fri, 10 Jul 2015 21:27:19 +0200 Message-Id: References: <559FA8D4.2030305@imap.cc> <559FDC38.9010400@imap.cc> <559FE294.60801@gmail.com> <55A00E06.3000000@imap.cc> <55A01993.7030007@imap.cc> To: Fred Stratton X-Mailer: Apple Mail (2.1878.6) X-Provags-ID: V03:K0:SpFrNzNklLBNO67Ug6KoFR7pXvmYQjWEUdvnPX1rrFxoovIGFyD El5yN8wx8o1/iD29rhCZiCsiPJgm45aJJwEXLP2jOwVKvBIKJGZDkTL81jp+GTIwQ/UAIaQ j5+0slLh1LFsxypgK/sqKMzDQtnphowVlZ+icoi+we60jLyszfIO8U3bmHMxeg14yXbZ6W2 6fMsO4H8d8sewV/MC37Mw== X-UI-Out-Filterresults: notjunk:1;V01:K0:lEv8ESqUCe8=:P6mUs+NJ7omvjmMDSJAdlK kX7hFEidnG9vxnoNgzlqw++3htBcvr2wYd5mMmrSvdRQCHdvz3Zo8LTAgEY38rU5fS7GfJMHC fyZxZANMb6lFbHCb+uWwfxX9z+WgkebB8VofIS2U5UI87i0ur0G+EJUT4bKHnrfQoPR0JMOdi a0HTB4RBePNxsMrLSzHpEY5Cbjz/xGBSNOGHyO+rp29ep2JDrL2JJ6scWzNw6R7f6XnzwMqFf j9r486rbRqrYV0AgakOtmD3O3HAfZYlXenAIgXfFIFC+qVZCoPH4ktaulc5GsB4LmZgjy99KY 9/oU9NkB6WEGxElzrM6K/Cxco7jRH/HKiJGdgB+DmC47JJs7HrGhhHA7BP2+dBhaHgo3hb1f5 Dwsb1jweYIGpwZgFsbW9u/dXtRdom6Q8sHi03kTZQtDwoi8SfGcocCSLFhoyl7YCN1kSVOddV MNGfHcX9doARh8tFUKxUUZOmAoQAUPjpnfjSk1KdUp1CsIlNu9lYpMVRuAmS7ZmrB4Gzkp8jt GPc68Y3SkLrtRi8btWKpYO4VahD0/csapnyNEpLHIdwp5Gfgat8Nham6vPC2QCX65GbTNKnjE 8jDJ/BgF+hsjZs3fbrY87v7egz6WTGZofTR6AoCZVR86DdoaN0ywXZcKDNeVv1ewqWm+jFVqH l07xqWxcMP2Kzl/DUakWR6B2NzyM6N7m24dHshA80sQ2Ovg== Cc: cerowrt-devel@lists.bufferbloat.net Subject: Re: [Cerowrt-devel] Correct syntax for cake commands and atm issues. X-BeenThere: cerowrt-devel@lists.bufferbloat.net X-Mailman-Version: 2.1.13 Precedence: list List-Id: Development issues regarding the cerowrt test router project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2015 19:27:55 -0000 --Apple-Mail=_752A06AF-F005-46E3-9B68-AC6C7DB9F248 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252 Hi Fred, On Jul 10, 2015, at 21:14 , Fred Stratton wrote: >=20 >=20 > On 10/07/15 19:46, Sebastian Moeller wrote: >> Hi Fred, >>=20 >> your results seem to indicate that cake is not active at all, as the = latency under load is abysmal (a quick check is to look at the median in = relation to the min and the 90% number, in your examples all of these = are terrible). Could you please post the result of the following = commands on your router: >> 1) cat /etc/config/sqm > config queue 'eth1' > option qdisc 'fq_codel' > option script 'simple.qos' > option qdisc_advanced '0' > option linklayer =91none' For an ADSL link I could swear link layer =91none=92 is not = optimal ;) > option enabled '0' > option interface 'eth1' > option download '0' > option upload =910' Not that it matters as you do not use the sqm-scripts machinery. >=20 >=20 >> 2) tc -d qdisc > qdisc fq_codel 0: dev eth0 root refcnt 2 limit 1024p flows 1024 = quantum 300 target 5.0ms interval 100.0ms ecn > qdisc fq_codel 0: dev eth1 root refcnt 2 limit 1024p flows 1024 = quantum 300 target 5.0ms interval 100.0ms ecn > qdisc mq 0: dev wlan1 root > qdisc fq_codel 0: dev wlan1 parent :1 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc fq_codel 0: dev wlan1 parent :2 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc fq_codel 0: dev wlan1 parent :3 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc fq_codel 0: dev wlan1 parent :4 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc mq 0: dev wlan0 root > qdisc fq_codel 0: dev wlan0 parent :1 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc fq_codel 0: dev wlan0 parent :2 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc fq_codel 0: dev wlan0 parent :3 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc fq_codel 0: dev wlan0 parent :4 limit 1024p flows 1024 quantum = 300 target 5.0ms interval 100.0ms ecn > qdisc cake 8002: dev pppoe-wan root refcnt 2 bandwidth 850Kbit = besteffort flows raw You should enable the atm link layer accounting on both ingress = (ifb4pppoe-wan) and egress (pppoe-wan). > qdisc ingress ffff: dev pppoe-wan parent ffff:fff1 ---------------- > qdisc cake 8001: dev ifb4pppoe-wan root refcnt 2 bandwidth 11500Kbit = besteffort flows atm overhead 40 >=20 >> 3) tc -d class show dev pppoe-wan > class cake 8002:2fa parent 8002: >=20 >=20 >> 4) tc -d class show dev ifb4pppoe-wqn >=20 > class cake 8001:6e parent 8001: >> 5) /etc/init.d/sqm stop > SQM: Trying to start/stop SQM on all interfaces. > SQM: run.sh stop > SQM: /usr/lib/sqm/run.sh SQM for interface eth1 is not enabled, = skipping over... >> 6) /etc/init.d/sqm start > /etc/init.d/sqm start > SQM: Trying to start/stop SQM on all interfaces. > SQM: /usr/lib/sqm/run.sh SQM for interface eth1 is not enabled, = skipping over=85 Alas, not activated so this does not give any diagnostic output=85= Newer sqm-scripts should work with cake and luci-app-sqm also works = well to set up cake. Please find the most recent files for sqm-scripts = attached. The content of the sqm folder should replace the content of = /usr/lib/sqm on your router.= --Apple-Mail=_752A06AF-F005-46E3-9B68-AC6C7DB9F248 Content-Disposition: attachment; filename=sqm.zip Content-Type: application/zip; x-mac-auto-archive=yes; name="sqm.zip" Content-Transfer-Encoding: base64 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 AAAAVkWlePSBXA8AAKo/AAAUAAwAAAAAAAAAAEDtgX8yAABzcW0vc2ltcGxlX3BwcG9lLnFvc1VY CABg10ZUYNdGVFBLAQIVAxQACAAIAAAAVkXLEbhJYQAAAK4AAAAfAAwAAAAAAAAAAECkgS1CAABf X01BQ09TWC9zcW0vLl9zaW1wbGVfcHBwb2UucW9zVVgIAGDXRlRg10ZUUEsBAhUDFAAIAAgAAABQ Ralu0Kh9AAAAnAAAABkADAAAAAAAAAAAQKSB60IAAHNxbS9zaW1wbGVfcHBwb2UucW9zLmhlbHBV WAgAYO4+VGDuPlRQSwECFQMUAAgACAAAAFBFyxG4SWEAAACuAAAAJAAMAAAAAAAAAABApIG/QwAA X19NQUNPU1gvc3FtLy5fc2ltcGxlX3BwcG9lLnFvcy5oZWxwVVgIAGDuPlRg7j5UUEsBAhUDFAAI AAgAwK7SRuEu3JY8BQAAhQ0AABAADAAAAAAAAAAAQO2BgkQAAHNxbS9zaW1wbGVzdC5xb3NVWAgA 2CGDVdghg1VQSwECFQMUAAgACADArtJGyxG4SWEAAACuAAAAGwAMAAAAAAAAAABApIEMSgAAX19N QUNPU1gvc3FtLy5fc2ltcGxlc3QucW9zVVgIANghg1XYIYNVUEsBAhUDFAAIAAgAAABSRbd/PlDx AgAAMQYAAAsADAAAAAAAAAAAQO2BxkoAAHNxbS9zdG9wLnNoVVgIAGCRQVRgkUFUUEsBAhUDFAAI AAgAAABSRcsRuElhAAAArgAAABYADAAAAAAAAAAAQKSBAE4AAF9fTUFDT1NYL3NxbS8uX3N0b3Au c2hVWAgAYJFBVGCRQVRQSwUGAAAAABMAEwC8BQAAtU4AAAAA --Apple-Mail=_752A06AF-F005-46E3-9B68-AC6C7DB9F248 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=windows-1252 The content of sqm.lua should replace /usr/lib/lua/luci/model/cbi/sqm.lua --Apple-Mail=_752A06AF-F005-46E3-9B68-AC6C7DB9F248 Content-Disposition: attachment; filename=sqm.lua Content-Type: application/octet-stream; name="sqm.lua" Content-Transfer-Encoding: 7bit --[[ LuCI - Lua Configuration Interface Copyright 2014 Steven Barth Copyright 2014 Dave Taht Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 $Id$ ]]-- local wa = require "luci.tools.webadmin" local fs = require "nixio.fs" local net = require "luci.model.network".init() local sys = require "luci.sys" --local ifaces = net:get_interfaces() local ifaces = sys.net:devices() local path = "/usr/lib/sqm" m = Map("sqm", translate("Smart Queue Management"), translate("With SQM you " .. "can enable traffic shaping, better mixing (Fair Queueing)," .. " active queue length management (AQM) " .. " and prioritisation on one " .. "network interface.")) s = m:section(TypedSection, "queue", translate("Queues")) s:tab("tab_basic", translate("Basic Settings")) s:tab("tab_qdisc", translate("Queue Discipline")) s:tab("tab_linklayer", translate("Link Layer Adaptation")) s.addremove = true -- set to true to allow adding SQM instances in the GUI s.anonymous = true -- BASIC e = s:taboption("tab_basic", Flag, "enabled", translate("Enable this SQM instance.")) e.rmempty = false -- sm: following jow's advise, be helpful to the user and enable -- sqm's init script if even a single sm instance/interface -- is enabled; this is unexpected in that the init script gets -- enabled as soon as at least one sqm instance is enabled -- and that state is saved, so it does not require "Save & Apply" -- to effect the init scripts. -- the implementation was inpired/lifted from -- https://github.com/openwrt/luci/blob/master/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua function e.write(self, section, value) if value == "1" then luci.sys.init.enable("sqm") m.message = translate("The SQM GUI has just enabled the sqm initscript on your behalf. Remember to disable the sqm initscript manually under System Startup menu in case this change was not wished for.") -- luci.sys.call("/etc/init.d/sqm start >/dev/null") -- else -- luci.sys.call("/etc/init.d/sqm stop >/dev/null") -- luci.sys.init.disable("sqm") end return Flag.write(self, section, value) end -- TODO: inform the user what we just did... n = s:taboption("tab_basic", ListValue, "interface", translate("Interface name")) -- sm lifted from luci-app-wol, the original implementation failed to show pppoe-ge00 type interface names for _, iface in ipairs(ifaces) do -- if iface:is_up() then -- n:value(iface:name()) -- end if iface ~= "lo" then n:value(iface) end end n.rmempty = false dl = s:taboption("tab_basic", Value, "download", translate("Download speed (kbit/s) (ingress) set to 0 to selectively disable ingress shaping:")) dl.datatype = "and(uinteger,min(0))" dl.rmempty = false ul = s:taboption("tab_basic", Value, "upload", translate("Upload speed (kbit/s) (egress) set to 0 to selectively disable egress shaping:")) ul.datatype = "and(uinteger,min(0))" ul.rmempty = false -- QDISC c = s:taboption("tab_qdisc", ListValue, "qdisc", translate("Queueing discipline")) c:value("fq_codel", "fq_codel ("..translate("default")..")") c:value("efq_codel") c:value("nfq_codel") c:value("sfq") c:value("codel") c:value("ns2_codel") c:value("pie") c:value("sfq") c:value("cake") c.default = "fq_codel" c.rmempty = false local qos_desc = "" sc = s:taboption("tab_qdisc", ListValue, "script", translate("Queue setup script")) for file in fs.dir(path) do if string.find(file, ".qos$") then sc:value(file) end if string.find(file, ".qos.help$") then fh = io.open(path .. "/" .. file, "r") qos_desc = qos_desc .. "

" .. file:gsub(".help$", "") .. ":
" .. fh:read("*a") .. "

" end end sc.default = "simple.qos" sc.rmempty = false sc.description = qos_desc ad = s:taboption("tab_qdisc", Flag, "qdisc_advanced", translate("Show and Use Advanced Configuration. Advanced options will only be used as long as this box is checked.")) ad.default = false ad.rmempty = true squash_dscp = s:taboption("tab_qdisc", ListValue, "squash_dscp", translate("Squash DSCP on inbound packets (ingress):")) squash_dscp:value("1", "SQUASH") squash_dscp:value("0", "DO NOT SQUASH") squash_dscp.default = "1" squash_dscp.rmempty = true squash_dscp:depends("qdisc_advanced", "1") squash_ingress = s:taboption("tab_qdisc", ListValue, "squash_ingress", translate("Ignore DSCP on ingress:")) squash_ingress:value("1", "Ignore") squash_ingress:value("0", "Allow") squash_ingress.default = "1" squash_ingress.rmempty = true squash_ingress:depends("qdisc_advanced", "1") iecn = s:taboption("tab_qdisc", ListValue, "ingress_ecn", translate("Explicit congestion notification (ECN) status on inbound packets (ingress):")) iecn:value("ECN", "ECN ("..translate("default")..")") iecn:value("NOECN") iecn.default = "ECN" iecn.rmempty = true iecn:depends("qdisc_advanced", "1") eecn = s:taboption("tab_qdisc", ListValue, "egress_ecn", translate("Explicit congestion notification (ECN) status on outbound packets (egress).")) eecn:value("NOECN", "NOECN ("..translate("default")..")") eecn:value("ECN") eecn.default = "NOECN" eecn.rmempty = true eecn:depends("qdisc_advanced", "1") ad2 = s:taboption("tab_qdisc", Flag, "qdisc_really_really_advanced", translate("Show and Use Dangerous Configuration. Dangerous options will only be used as long as this box is checked.")) ad2.default = false ad2.rmempty = true ad2:depends("qdisc_advanced", "1") ilim = s:taboption("tab_qdisc", Value, "ilimit", translate("Hard limit on ingress queues; leave empty for default.")) -- ilim.default = 1000 ilim.isnumber = true ilim.datatype = "and(uinteger,min(0))" ilim.rmempty = true ilim:depends("qdisc_really_really_advanced", "1") elim = s:taboption("tab_qdisc", Value, "elimit", translate("Hard limit on egress queues; leave empty for default.")) -- elim.default = 1000 elim.datatype = "and(uinteger,min(0))" elim.rmempty = true elim:depends("qdisc_really_really_advanced", "1") itarg = s:taboption("tab_qdisc", Value, "itarget", translate("Latency target for ingress, e.g 5ms [units: s, ms, or us]; leave empty for automatic selection, put in the word default for the qdisc's default.")) itarg.datatype = "string" itarg.rmempty = true itarg:depends("qdisc_really_really_advanced", "1") etarg = s:taboption("tab_qdisc", Value, "etarget", translate("Latency target for egress, e.g. 5ms [units: s, ms, or us]; leave empty for automatic selection, put in the word default for the qdisc's default.")) etarg.datatype = "string" etarg.rmempty = true etarg:depends("qdisc_really_really_advanced", "1") iqdisc_opts = s:taboption("tab_qdisc", Value, "iqdisc_opts", translate("Advanced option string to pass to the ingress queueing disciplines; no error checking, use very carefully.")) iqdisc_opts.rmempty = true iqdisc_opts:depends("qdisc_really_really_advanced", "1") eqdisc_opts = s:taboption("tab_qdisc", Value, "eqdisc_opts", translate("Advanced option string to pass to the egress queueing disciplines; no error checking, use very carefully.")) eqdisc_opts.rmempty = true eqdisc_opts:depends("qdisc_really_really_advanced", "1") -- LINKLAYER ll = s:taboption("tab_linklayer", ListValue, "linklayer", translate("Which link layer to account for:")) ll:value("none", "none ("..translate("default")..")") ll:value("ethernet", "Ethernet with overhead: select for e.g. VDSL2.") ll:value("atm", "ATM: select for e.g. ADSL1, ADSL2, ADSL2+.") -- ll:value("adsl") -- reduce the options ll.default = "none" po = s:taboption("tab_linklayer", Value, "overhead", translate("Per Packet Overhead (byte):")) po.datatype = "and(integer,min(-1500))" po.default = 0 po.isnumber = true po.rmempty = true po:depends("linklayer", "ethernet") -- po:depends("linklayer", "adsl") po:depends("linklayer", "atm") adll = s:taboption("tab_linklayer", Flag, "linklayer_advanced", translate("Show Advanced Linklayer Options, (only needed if MTU > 1500). Advanced options will only be used as long as this box is checked.")) adll.rmempty = true adll:depends("linklayer", "ethernet") -- adll:depends("linklayer", "adsl") adll:depends("linklayer", "atm") smtu = s:taboption("tab_linklayer", Value, "tcMTU", translate("Maximal Size for size and rate calculations, tcMTU (byte); needs to be >= interface MTU + overhead:")) smtu.datatype = "and(uinteger,min(0))" smtu.default = 2047 smtu.isnumber = true smtu.rmempty = true smtu:depends("linklayer_advanced", "1") stsize = s:taboption("tab_linklayer", Value, "tcTSIZE", translate("Number of entries in size/rate tables, TSIZE; for ATM choose TSIZE = (tcMTU + 1) / 16:")) stsize.datatype = "and(uinteger,min(0))" stsize.default = 128 stsize.isnumber = true stsize.rmempty = true stsize:depends("linklayer_advanced", "1") smpu = s:taboption("tab_linklayer", Value, "tcMPU", translate("Minimal packet size, MPU (byte); needs to be > 0 for ethernet size tables:")) smpu.datatype = "and(uinteger,min(0))" smpu.default = 0 smpu.isnumber = true smpu.rmempty = true smpu:depends("linklayer_advanced", "1") lla = s:taboption("tab_linklayer", ListValue, "linklayer_adaptation_mechanism", translate("Which linklayer adaptation mechanism to use; for testing only")) lla:value("cake") lla:value("htb_private") lla:value("tc_stab", "tc_stab ("..translate("default")..")") lla.default = "tc_stab" lla.rmempty = true lla:depends("linklayer_advanced", "1") -- PRORITIES? return m --Apple-Mail=_752A06AF-F005-46E3-9B68-AC6C7DB9F248 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252 . These should allow you to set up cake from inside the sqm gui (but it = is only lightly tested). >=20 >>=20 >> hopefully these give some insight what might have happened. >>=20 >> And finally I would love to learn the output of: >> sh betterspeedtest.sh -4 -H netperf-eu.bufferbloat.net -t 150 -p = netperf-eu.bufferbloat.net -n 4 ; sh netperfrunner.sh -4 -H = netperf-eu.bufferbloat.net -t 150 -p netperf-eu.bufferbloat.net -n 4 >=20 > betterspeedtest.sh not installed Too bad, this would be nice as it measures downlink and uplink = sequentially instead of simultaneously so it can help figure out if only = one direction is improperly shaped. Could I convince you to install = Rich=92s betterspeedtest.sh script as well, it should be in the same = repository as netperfrunner.sh? >=20 > sh betterspeedtest.sh -4 -H netperf-eu.bufferbloat.ne > t -t 150 -p netperf-eu.bufferbloat.net -n 4 ; sh netperfrunner.sh -4 = -H netperf- > eu.bufferbloat.net -t 150 -p netperf-eu.bufferbloat.net -n 4 > sh: can't open 'betterspeedtest.sh' > 2015-07-10 20:10:55 Testing netperf-eu.bufferbloat.net (ipv4) with 4 = streams down and up while pinging netperf-eu.bufferbloat.net. Takes = about 150 seconds. > Download: 6.8 Mbps > Upload: 0.59 Mbps > Latency: (in msec, 152 pings, 0.00% packet loss) > Min: 73.911 > 10pct: 232.211 > Median: 308.556 > Avg: 305.686 > 90pct: 376.183 > Max: 412.553 This just shows that latency still is bounded badly... >=20 >>=20 >>=20 >> Many Thanks & Best Regards >> Sebastian >>=20 >> On Jul 10, 2015, at 20:25 , Fred Stratton = wrote: >>=20 >>> By your command >>> Rebooted to rerun qdisc script, rather than changing qdiscs from the = command-line, so suboptimal process as end-point changed. >>>=20 >>> script configuring qdiscs and overhead 40 on >>>=20 >>> sh netperfrunner.sh -H netperf-eu.bufferbloat.net -p 2.96.48.1 >>> 2015-07-10 18:22:08 Testing netperf-eu.bufferbloat.net (ipv4) with 4 = streams down and up while pinging 2.96.48.1. Takes about 60 seconds. >>> Download: 6.73 Mbps >>> Upload: 0.58 Mbps >>> Latency: (in msec, 62 pings, 0.00% packet loss) >>> Min: 24.094 >>> 10pct: 172.654 >>> Median: 260.563 >>> Avg: 253.580 >>> 90pct: 330.003 >>> Max: 411.145 >>>=20 >>> script configuring qdiscs on flows raw >>>=20 >>> sh netperfrunner.sh -H netperf-eu.bufferbloat.net -p >>> 78.145.32.1 >>> 2015-07-10 18:49:21 Testing netperf-eu.bufferbloat.net (ipv4) with 4 = streams down and up while pinging 78.145.32.1. Takes about 60 seconds. >>> Download: 6.75 Mbps >>> Upload: 0.59 Mbps >>> Latency: (in msec, 59 pings, 0.00% packet loss) >>> Min: 23.605 >>> 10pct: 169.789 >>> Median: 282.155 >>> Avg: 267.099 >>> 90pct: 333.283 >>> Max: 376.509 >>>=20 >>> script configuring qdiscs and overhead 36 on >>>=20 >>> sh netperfrunner.sh -H netperf-eu.bufferbloat.net -p >>> 80.44.96.1 >>> 2015-07-10 19:20:18 Testing netperf-eu.bufferbloat.net (ipv4) with 4 = streams down and up while pinging 80.44.96.1. Takes about 60 seconds. >>> Download: 6.56 Mbps >>> Upload: 0.59 Mbps >>> Latency: (in msec, 62 pings, 0.00% packet loss) >>> Min: 22.975 >>> 10pct: 195.473 >>> Median: 281.756 >>> Avg: 271.609 >>> 90pct: 342.130 >>> Max: 398.573 >>>=20 >>>=20 >>> On 10/07/15 16:19, Alan Jenkins wrote: >>>> I'm glad to hear there's a working version (even if it's not in the = current build :). >>>>=20 >>>> Do you have measurable improvements with overhead configured (v.s. = unconfigured)? >>>>=20 >>>> I've used netperfrunner from CeroWrtScripts, e.g. >>>>=20 >>>> sh netperfrunner.sh -H netperf-eu.bufferbloat.net -p $ISP_ROUTER >>>>=20 >>>> I believe accounting for overhead helps on this two-way test, = because a) it saturates the uplink b) about half that bandwidth is tiny = ack packets (depending on bandwidth asymmetry). And small packets have = proportionally high overhead. >>>>=20 >>>> (But it seems to only make a small difference for me, which always = surprises Seb). >>>>=20 >>>> Alan >>>>=20 >>>> On 10/07/15 15:52, Fred Stratton wrote: >>>>> You are absolutely correct. >>>>>=20 >>>>> I tried both a numeric overhead value, and alternatively = 'pppoe-vcmux' >>>>> and 'ether-fcs' in the build I crafted based on r46006, which is = lupin >>>>> undeclared version 2. Everything works as stated. >>>>>=20 >>>>> On lupin undeclared version 4, the current release based on = r46117, the >>>>> values were not recognised. >>>>>=20 >>>>> Thank you. >>>>>=20 >>>>> I had cake running on a Lantiq ADSL gateway running the same = r46006 >>>>> build. Unfortunately this was bricked by attempts to get homenet >>>>> working, so I have nothing to report about gateway usage at = present. >>>>>=20 >>>>>=20 >>>>>=20 >>>>> On 10/07/15 13:57, Jonathan Morton wrote: >>>>>> You're already using correct syntax - I've written it to be quite >>>>>> lenient and use sensible defaults for missing information. There = are >>>>>> several sets of keywords and parameters which are mutually = orthogonal, >>>>>> and don't depend on each other, so "besteffort" has nothing to do = with >>>>>> "overhead" or "atm". >>>>>>=20 >>>>>> What's probably happening is that you're using a slightly old = version >>>>>> of the cake kernel module which lacks the overhead parameter = entirely, >>>>>> but a more up to date tc which does support it. We've seen this >>>>>> combination crop up ourselves recently. >>>>>>=20 >>>>>> - Jonathan Morton >>>>>>=20 >>> _______________________________________________ >>> Cerowrt-devel mailing list >>> Cerowrt-devel@lists.bufferbloat.net >>> https://lists.bufferbloat.net/listinfo/cerowrt-devel >=20 --Apple-Mail=_752A06AF-F005-46E3-9B68-AC6C7DB9F248--