Real World 802.11ac Performance Under OS X

A good friend of mine recently bought an older house and had been contemplating running a bunch of Cat6 through the crawlspace in order to get good, high-speed connectivity through his home. Pretty stoked about what I found with 802.11ac performance on the MacBook Air, I thought I came across a much easier solution to his problem. I shared my iPerf data with him, but he responded with a totally valid request: was I seeing those transfer rates in real world file copies?

I have an iMac running Mountain Lion connected over Gigabit Ethernet to my network. I mounted an AFP share on the MacBook Air connected over 802.11ac and copied a movie over.

21.2MB/s or 169.6Mbps is the fastest I saw.

Hmm. I connected the iMac to the same ASUS RT-AC66U router as the MacBook Air. Still 21.2MB/s.

I disabled all other wireless in my office. Still, no difference. I switched ethernet cables, I tried different Macs, I tried copying from a PC, I even tried copying smaller files - none of these changes did anything. At most, I only saw 21.2MB/s over 802.11ac.

I double checked my iPerf data. 533Mbps. Something weird was going on.

I plugged in Apple’s Thunderbolt Gigabit Ethernet adaptor and saw 906Mbps, clearly the source and the MacBook Air were both capable of high speed transfers.

What I tried next gave me some insight into what was going on. I setup web and FTP servers on the MacBook Air and transferred files that way. I didn’t get 533Mbps, but I broke 300Mbps. For some reason, copying over AFP or SMB shares was limited to much lower performance. This was a protocol issue.

Digging Deeper, Finding the Culprit

A major component of TCP networking, and what guarantees reliable data transmission, is the fact that all transfers are acknowledged and retransmitted if necessary. How frequently transfers are acknowledged has big implications on performance. Acknowledge (ACK) too frequently and you’ll get terrible throughput as the sender has to stop all work and wait for however long an ACK takes to travel across the network. Acknowledge too rarely on the other hand and you run the risk of doing a lot of wasted work in sub optimal network conditions. The TCP window size is a variable that’s used to define this balance.

TCP window size defines the max amount of data that can be in flight before an acknowledgement has to be sent/received. Modern TCP implementations support dynamic scaling of the TCP window in order to optimize for higher bandwidth interfaces.

If you know the round trip latency of a network, TCP window size as well as the maximum bandwidth that can be delivered over the connection you can actually calculate maximum usable bandwidth on the network.

The ratio of the network’s bandwidth-delay product to the TCP window size gives us that max bandwidth number.

The 2-stream 802.11ac in the new MacBook Air supports link rates of up to 867Mbps. My iPerf data showed ~533Mbps of usable bandwidth in the best conditions. Round trip latency over 50 ping requests between the MBA client and an iMac wired over Gigabit Ethernet host averaged 2.8ms. The bandwidth-delay product is 533Mbps x 2.8ms or 186,550 bytes. Now let’s look at the maximum usable bandwidth as a function of TCP window size:

Impact of TCP Window Size on 802.11ac Transfer Rates, 533Mbps Link, 2.8ms Latency
Window Size Bandwidth-Delay Product TCP Window/BDP Percentage Link Bandwidth Max Realized Bandwidth
32KB 186550B 32768/186550B 17.6% 533Mbps 93.6Mbps
64KB 186550B 65536/186550B 31.1% 533Mbps 187.2Mbps
128KB 186550B 131072/186550B 70.3% 533Mbps 374.5Mbps
256KB 186550B 262144/186550B 140.5% 533Mbps 533Mbps

The only way to get the full 533Mbps is by using a TCP window size that’s at least 256KB.

I re-ran my iPerf test and sniffed the packets that went by to confirm the TCP window size during the test. The results came back as expected. OS X properly scaled up the TCP window to 256KB, which enabled me to get the 533Mbps result:

I then monitored packets going by while copying files over an AFP share and found my culprit:

OS X didn’t scale the TCP window size beyond 64KB, which limits performance to a bit above what I could get over 5GHz 802.11n on the MacBook Air. Interestingly enough you can get better performance over HTTP or FTP, but in none of the cases would OS X scale TCP window size to 256KB - thus artificially limiting 802.11ac.

I spent a good amount of time trying to work around this issue, even manually setting TCP window size in OS X, but came up empty handed. I’m not overly familiar with the networking stack in OS X so it’s very possible that I missed something, but I’m confident in saying that there’s an issue here. At a risk of oversimplifying, it looks like the TCP window scaling algorithm features a hard limit in OS X’s WiFi networking stack optimized for 802.11n and unaware of ac’s higher bandwidth capabilities. I should also add that the current developer preview of OS X Mavericks doesn’t fix the issue, nor does using an Apple 802.11ac router.

The bad news is that in its shipping configuration, the new MacBook Air is capable of some amazing transfer rates over 802.11ac but you won’t see them when copying files between Macs or PCs. The good news is the issue seems entirely confined to software. I’ve already passed along my findings to Apple. If I had to guess, I would expect that we’ll see a software update addressing this.

802.11ac: 533Mbps Over WiFi Display
Comments Locked

233 Comments

View All Comments

  • sunman42 - Tuesday, June 25, 2013 - link

    "Until OS X Mavericks arrives, you'll have to make sure to pay attention to things like background web browser tabs running Flash from killing your battery life." Or you could just do without Flash, or use Click to Flash, and avoid many very nasty bugs, constant security patches, and battery vampirism. Just, as they say, sayin'.
  • jcbottorff - Tuesday, June 25, 2013 - link

    The use of a 64K TCP window may be a feature not a bug. I say this because there often is a need to minimize latency of small packets, like used for Voip or other streaming media. With a TCP window size of 64K, on a 6 Mbps DSL connection, a packet queue of 64Kb takes about 85 milliseconds to drain. This means if you did a 64K TCP send (which optimally is one request to the NIC, with the NIC doing TCP segmentation), followed by a Voip UDP packet, it could be 85 milliseconds before the Voip packet goes out the DSL modem. If the TCP window were 256K, the latency would climb to 85*4=340 milliseconds, an unacceptable delay for Voip. It is possible to use varying TCP window sizes based on the current mix of network activity. Like for example, if you have a Voip call active and you have a TCP connection to a server on the Internet, over DSL modem, you may want to limit the TCP window size. If you only have a file sharing connection to a server on the local subnet, you can use a large window size. It's a lot more complex than just changing one number, unless you don't care about things like streaming media working correctly. OS designers often have to compromise, such that nobody is totally happy, but nobody is really upset either. I think the real question is how well the OS dynamically adjusts things under varying conditions to always give the most optimal user experience possible.
  • SimonO101 - Tuesday, June 25, 2013 - link

    Can we expect even greater battery life once OS X Mavericks comes online?
  • darwinosx - Tuesday, July 9, 2013 - link

    Yes. But if I said I knew this for sure I might be violating an NDA.
  • trip1ex - Tuesday, June 25, 2013 - link

    Also they should let you sync your MBA to a Mac/PC like an iOS device to help mitigate the 128gb storage in the base model. Or even let you sync to an external drive. I would love an elegant way to offload media particularly.
  • darwinosx - Tuesday, July 9, 2013 - link

    There are MANY ways to do this.
  • niico - Tuesday, June 25, 2013 - link

    I run Windows 8 in a Parallels VM on Mac OS 10.8 - this is my usual setup. If you're looking for a more strenuous battery test I suggest a VM. This often keeps the CPU at 30-50% even when both OS's are idle.

    It is an increasingly common use case - and many users would be interested to see the battery performance, specially on Haswell.
  • ctwise - Monday, July 1, 2013 - link

    I run Windows 7 in VMWare Fusion on OS/X 10.8 as a SQL Server provider for development. I'm not sure if it's a difference between use cases for VMs or a Parallels vs. VMWare, but I rarely see even a single percentage of usage by my Windows VM.
  • Oscarcharliezulu - Wednesday, June 26, 2013 - link

    Good review, usual d$&khead comments from apple haters. I love hardware, all brands and watching it improve, it never gets old. Have recently switched to OSX on a 27" iMac at home for the fun of it and have to say now I'm familiar with it I prefer it to windows. Might switch my work laptop to a MBA, use it rather than my iPad+keyboard that I generally also carry around.
  • akdj - Thursday, June 27, 2013 - link

    Lol...exactly how it started for me...some 8 years ago now. Twenty years on PC (first computer was actually an Apple IIe)--& my wife was graduating with her masters degree. She'd been talking about a friend's MacBook for a few months...for her grad gift, I got her one of the old, plastic white MacBooks...my 8 year old son is still using that computer...in stock form daily!
    That first month...it was hard for me to give it up to her. I loved it. Loved OSx. Within six weeks I'd bought my own 15" MBP. Haven't bought a Windows machine since. For a couple years, I used bootcamp as there were a couple of programs that were only on Windows that I needed. They've since been ported to OSx and I've no need any longer for anything other than OSx
    Kinda bums me out I waited as Long as I did. It's amazing having a house full of computers that NEVER need support!

Log in

Don't have an account? Sign up now