Максимизируйте количество одновременных http-загрузок

Я пытаюсь выполнить как можно больше одновременных http-загрузок IPad2 ( ios6.0). Это чисто для тестирования того, что возможно на этом устройстве. Даже не заинтересован в производительности графического интерфейса (не важно, если он не отвечает)

Я создал специальный HTTP-сервер, который за x минут отправляет данные клиенту. Полученные данные не имеют значения. Я просто измеряю скорость и количество одновременных загрузок. Я реализовал 2 разных способа планирования 12 HTTP-запросов.

NSOperation

Один выполняется с помощью объектов NSOperation в очереди и установить NSOperationQueueDefaultMaxConcurrentOperationCount в 12

NSThread

Вторая реализация заключается в создании 12 NSThreads, которые выполняют синхронный http-запрос.

Все запросы отправляются на один и тот же IP-адрес назначения.

наблюдение

Я наблюдаю, что в обоих случаях с 6-го по 12-й запрос получают TimeOut (код ошибки -1001). Если 1 установить значение тайм-аута на 80.0 секунд, я вижу, что 6-я загрузка начинается, когда 1-ая завершена.

Вопросы

  • Есть ли в IOS ограничение на количество одновременных загрузок?
  • Есть ли другой способ выполнить эти одновременные загрузки?
  • Есть ли способ привязать поток к ядру (чтобы он не получал прерывания, как cpuaffinity в C++) или приоритет потока

4 ответа

Решение

Вы можете иметь максимум 5 одновременных подключений к одному серверу. Это фиксированный предел iOS, и, вероятно, это связано с некоторыми ограничениями протокола HTTP. Вы можете прочитать немного больше информации здесь.

Просто удар по этому, на случай, если кто-то все еще ищет. Я вижу, что это 4 одновременно на моем iPhone6S+. Вот мои тестовые шаги:

  • Я написал PHP-скрипт, который делает sleep(10), прежде чем что-то возвращать.
  • Я добавил кнопку (чтобы я мог хорошо выполнить после запуска)
  • Нажатие на эту кнопку запускает 30 одновременных NSURLConnections (синхронные запросы, но каждый в отдельном потоке) и NSLog.
  • Завершение для каждого делает NSLog

Результаты как по маслу. Первые ответы (4 из них) возвращаются через 12 секунд после запроса (предположительно, 2 секунды для включения радиоприемника или чего-либо еще), но затем каждый последующий блок из 4 ответов приходит через 10 секунд после предыдущего блока 4. Все 4 в время.

Надеюсь, что это помогает кому-то.

После изучения этого проекта я нашел кое-что в документации Apple для NSURLSessionConfiguration.

Из документации Apple -

Это свойство определяет максимальное количество одновременных подключений к каждому хосту задачами в сеансах на основе этой конфигурации.

Это ограничение на сеанс, поэтому, если вы используете несколько сеансов, ваше приложение в целом может превысить это ограничение. Кроме того, в зависимости от вашего подключения к Интернету, сеанс может использовать более низкий предел, чем тот, который вы указали.

Значение по умолчанию - 6 в OS X или 4 в iOS.

Есть ли в IOS ограничение на количество одновременных загрузок?

Между прочим, это ограничение для каждого сервера, а не для iOS. Если вы попытаетесь сделать это с разных серверов одновременно, вы увидите, что можете превысить свой текущий лимит.

Есть ли другой способ выполнить эти одновременные загрузки?

Очевидно, что вы могли бы что-то сделать и с GCD, вручную обрабатывая параллельные запросы, но я думаю, NSOperationQueue является отличным решением и не вижу смысла смотреть дальше. Я, конечно же, не вижу никаких преимуществ в использовании потоков.

По мере увеличения числа одновременных запросов вы должны оценивать общее прошедшее время, но я уверен, что вы достигнете точки убывающей доходности. Наличие большего количества одновременных запросов не гарантирует лучшую общую производительность.

Другие вопросы по тегам