Finished version of speed-up-slow-ios-downloads-with-proxy

This commit is contained in:
Wesley Moore 2013-01-13 16:10:13 +11:00
parent a47416a31c
commit 54beee02de

View file

@ -1,12 +1,13 @@
---
title: Speed Up Slow Downloads on iOS with a Proxy or CDN
extra: How to speed up downloads on iOS.
extra: Using a proxy or CDN can dramatically improve download speeds on an iOS device.
kind: article
section: technical
created_at: 2013-01-13 12:39:00
keywords:
- ios
- proxy
- slow
- download
- podcast
- squid
@ -14,71 +15,63 @@ keywords:
- cdn
---
Whilst developing the Radiopaedia iOS app I ran into the problem of very slow
download speeds within the app. The app has packs of content avaiable for
purchase. The download speed was fine in the simulator but on the device it
was painfully slow. Profiling the code didn't reveal any issues either.
Whilst developing the [Radiopaedia iOS app][radiopaedia-app] I ran
into the problem of very slow download speeds within the app. The app
has packs of content available for purchase and download. The download
speed was fine in the simulator but on the device it was painfully
slow<sup>1</sup>. Both the Mac running the simulator and device were
connected to the same Wi-Fi network. Profiling the code didn't reveal
any issues either.
Some searching revealed people compaining about YouTube videos downloading
faster over 3G than Wi-Fi. There were a number of theories and proposed fixes
for this including:
[radiopaedia-app]: http://radiopaedia.org/articles/radiopaedia-ios-radiology-app
* YouTube was sending higher bitrate video when on Wi-Fi
* Checking Wi-Fi access point settings
* Set access point to 802.11b and it goes faster
Some searching revealed people complaining about YouTube videos
downloading faster over 3G than Wi-Fi. There were a number of theories
and proposed fixes, including [people seeing faster rates when
downgrading their access point to 802.11b][80211b]<sup>2</sup> but I
found one particular article (that I can no longer find) that said the
power management in the iOS Wi-Fi stack interfered with download speeds
when communicating to a high latency destination over a high speed Wi-Fi
connection. For example YouTube servers in the US from AU<sup>3</sup>.
At the time I read something that I can no longer find that said that the
iOS Wi-Fi stack has problems when it has a low latency Wi-Fi
connection that is communicating to a comparatively high latency
destination, for example YouTube servers in the US from AU (it
appears there's YouTube end-points in AU these days). From memory I think the
article cited power management under these circumstance as the issue. Howver
since I can't find the original article I might be making that up.
[80211b]: http://web.archive.org/web/20120511020134/http://qelix.com/blog/2008/08/31/get-better-wifi-speeds-on-iphone-3g
With this in mind I tested hosting the content packs on an Australian server,
instead of in Amazon S3. This showed a huge improvement in download speed. At
the time Amazon's CloudFront CDN did not have an Australian presence so we
switched to hosting the packs on RackSpace's CloudFiles, which uses the much
more extensive Akamai CDN and ensured that users of the app would have the
best possible download speeds.
With this in mind I tested hosting the content packs on an Australian
server, instead of in Amazon S3 accessed via CloudFront. This showed a huge
improvement in download speed. At the time CloudFront didn't
have an Australian presence so we switched to hosting the packs on
RackSpace's CloudFiles, which uses the much more extensive Akamai CDN
and ensured that users of the app would have the best possible download
speeds no matter where they were.
<div class="seperator"><hr class="left"><hr class="right"></div>
Fast forward a year or so and I started managing podcasts on my phone instead of
via iTunes. I noticed that some of the podcasts I was subscribed to were horrendously
slow to download. A 100Mb file would take many hours to download, particularly
ones hosted a long way away, such as in the UK or
The Netherlands. I also noted that podcasts that used a CDN downloaded quickly.
Fast forward a year or so and I started managing podcasts on my phone
instead of via iTunes. I noticed that some of the podcasts I was
subscribed to were horrendously slow to download. Some would take hours
to download, particularly ones hosted a long way away, such as in the
UK or The Netherlands. I also noted that podcasts that used a CDN
downloaded quickly.
This seemed to be the same problem I had encountered with the Radiopaedia app.
I wondered if telling the iPhone to use a proxy on the local
network would work around the issue. since effectivly move
the destination onto the local network as far as the phone
is concerned (since it will just be talking to the proxy).
network would work around the issue.
So I set up [Squid][squid] on the Mac mini that's connected to my TV
(using [Homebrew][homebrew])
since it's always on and has a wired connection to my modem.
I configured the iPhone to use the proxy an lo-and-behold the
very same podcast downloads that were taking hours, now took
minutes.
To test my theory I set up [Squid][squid]<sup>4</sup> on the Mac
mini that's connected to my TV since it's always on and has a wired
connection to my modem. I configured the iPhone to use the proxy and
compared the speed with, and without the proxy in use.
[squid]: http://www.squid-cache.org/
[homebrew]: http://mxcl.github.com/homebrew/
To be sure I paused the download, changed the phone's settings
to not use the proxy and restart the download, give it a few
minutes and the estimate was hours.
* Turn the proxy back on and minutes.
You can see this in action in the screenshots below. The first is not
using the proxy. I have let it download a third of the file to be well
clear [TCP's slow start][slow-start] and it is estimating 57 minutes to
clear of [TCP's slow start][slow-start] and it is estimating 57 minutes to
download the remaining 176.1 Mb (53 kb/sec). The second screenshot (only
a minutes later) shows the result after I paused the download, changed
a minute later) shows the result after I paused the download, changed
the proxy settings and then again let the download warm up a little. The
estimated time to complete the remaining 143.8 Mb is now only 5 mins
(491 kb/sec) -- a huge improvment.
(491 kb/sec) -- a huge improvement.
[slow-start]: https://en.wikipedia.org/wiki/Slow-start
@ -92,9 +85,14 @@ estimated time to complete the remaining 143.8 Mb is now only 5 mins
<figcaption>Podcast download with proxy, 491 kb/sec</figcaption>
</figure>
After the successful experiement I left the phone using the proxy and configured
After the successful experiment I left the phone using the proxy and configured
launchd to start squid on boot:
<script src="https://gist.github.com/4521952.js"></script>
----
<sup>1</sup> Tested on iPhone 3GS and iPhone 4S.
<sup>2</sup> Original article linked from [Apple support discussion](https://discussions.apple.com/message/9564410#9564410).
<sup>3</sup> It appears there's YouTube end-points in AU these days.
<sup>4</sup> I installed squid using [Homebrew](http://mxcl.github.com/homebrew/).