From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-14-iad.dyndns.com (mxout-048-iad.mailhop.org [216.146.32.48]) by lists.bufferbloat.net (Postfix) with ESMTP id 48D872E062E for ; Sun, 20 Mar 2011 03:45:15 -0700 (PDT) Received: from scan-12-iad.mailhop.org (scan-12-iad.local [10.150.0.209]) by mail-14-iad.dyndns.com (Postfix) with ESMTP id A27E044BD2B for ; Sun, 20 Mar 2011 10:45:14 +0000 (UTC) X-Spam-Score: -1.0 (-) X-Mail-Handler: MailHop by DynDNS X-Originating-IP: 209.85.215.171 Received: from mail-ey0-f171.google.com (mail-ey0-f171.google.com [209.85.215.171]) by mail-14-iad.dyndns.com (Postfix) with ESMTP id D840B44BD28; Sun, 20 Mar 2011 10:45:13 +0000 (UTC) Received: by eydd26 with SMTP id d26so1535575eyd.16 for ; Sun, 20 Mar 2011 03:45:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:subject:mime-version:content-type:from :in-reply-to:date:cc:message-id:references:to:x-mailer; bh=FW9m/qj+bOEtd8XVMBAnf9U+ztZqantIROMWM2sC+AQ=; b=OOzbRfBGEYUiv7iIUZFzNZqGUK1ZbVJZS+xW7kyhmB0OU4BbRzBcYRBjCEQP7MVBo8 CYXPpDFgTD46P+2PLGT6BWew03cSrwSxSmy2tYrUCItI6tiBBaDncgr7DUixUYd0ObFS 6XUrJDZOzBITJVeEwtGx2sscKfRE/SywCUfWA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:mime-version:content-type:from:in-reply-to:date:cc :message-id:references:to:x-mailer; b=Sac9MY3kCXfXBJLRvH3Cqy9enZo5bPvF7UQj3w7Pb/qLzEHBbRPkVUeuUytX/4Hops IDrJKHKFQr0ZdzP9lWqS/t0mMJagVwoFBeaVMOzYkOhu0JiA6PZMt17BZ3Hd72mLpjgd CzpPssMDbtTUV3pjb7auGuscYZDPwUNUzAeHc= Received: by 10.14.51.146 with SMTP id b18mr670854eec.226.1300617912974; Sun, 20 Mar 2011 03:45:12 -0700 (PDT) Received: from [192.168.239.42] (xdsl-83-150-84-172.nebulazone.fi [83.150.84.172]) by mx.google.com with ESMTPS id w59sm1141788eeh.10.2011.03.20.03.45.11 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 20 Mar 2011 03:45:12 -0700 (PDT) Subject: Re: [Bloat] Progress with latency-under-load tool Mime-Version: 1.0 (Apple Message framework v1082) Content-Type: multipart/mixed; boundary=Apple-Mail-57-188163396 From: Jonathan Morton In-Reply-To: <4D829B58.1070601@swin.edu.au> Date: Sun, 20 Mar 2011 12:45:10 +0200 Message-Id: References: <0D59AD34-AA64-4376-BB8E-58C5D378F488@gmail.com> <4D829B58.1070601@swin.edu.au> To: grenville armitage X-Mailer: Apple Mail (2.1082) Cc: bloat-devel , bloat X-BeenThere: bloat-devel@lists.bufferbloat.net X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Developers working on AQM, device drivers, and networking stacks" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 Mar 2011 10:45:15 -0000 --Apple-Mail-57-188163396 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Attached is the initial version of the loadlatency tool. I'm getting = some rather interesting results from it already, although it does take a = very long time to run. It works under Linux, Cygwin and MacOS X on both little- and big-endian = machines (and between machines of different byte-sexes), and therefore = it should also work under FreeBSD and other UNIXes. I haven't yet tried = compiling it for iOS or Android. It produces useful results even when one of the machines is rather old = and slow, despite using a proper PRNG for traffic generation. My = ancient Pentium-MMX proved capable of generating at least 4.4 MB/s of = traffic steadily, and probably produces spikes of even greater = bandwidth. Anything of Y2K vintage or newer should be able to saturate = it's network with this. There are four measures produced: Upload Capacity, Download Capacity, = Link Responsiveness and Flow Smoothness. All of these are reported in = "bigger is better" units to help deal with Layers 8 and 9. The Capacity calculations are a bit complex to understand. For each = flow (in either direction), the average goodput is measured over the = entire lifetime of the flow. All of the flows in each direction for = that scenario are the aggregated by taking the harmonic mean and = multiplying by the number of flows; this biases the total downwards if = the flows were mutually unfair. Finally, the relevant measures across = all scenarios are aggregated using the harmonic mean, thus biasing the = overall measure towards cases of under-utilisation. The totals are then = reported in binary kilobytes per second. The Link Responsiveness measure is much easier. I simply take the = maximum latency of the "pinger" channel (which is also used for = commanding flows to stop) and invert it to produce a measure in Hertz. = This is rounded down to the next integer for display; if you see a zero = here (which is surprisingly likely), it means that a latency of more = than one second was encountered at some point during the entire test. The Flow Smoothness measure refers to the application-level data = inter-arrival timings. The maximum delay between data chunks arriving = is measured across all flows in all scenarios, but excludes the first = megabyte of each flow so as to avoid picking up the RTT during TCP = startup. Here are some numbers I got from a test over a switched 100base-TX LAN: Upload Capacity: 1018 KiB/s Download Capacity: 2181 KiB/s Link Responsiveness: 2 Hz Flow Smoothness: 1 Hz Horrible, isn't it? I deliberately left these machines with standard = configurations in order to show that. - Jonathan --Apple-Mail-57-188163396 Content-Disposition: attachment; filename=loadlatency.tar.gz Content-Type: application/x-gzip; name="loadlatency.tar.gz" Content-Transfer-Encoding: base64 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 --Apple-Mail-57-188163396--