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

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

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

NSOperation

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

NSThread

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

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

Наблюдение

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

Вопросы

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

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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