Допустим, сервер подключен к Интернету через ограниченную полосу пропускания, и более одного пользователя одновременно пытаются загрузить файл с этого сервера.
Если мы проигнорируем ограничение пропускной способности на стороне пользователя, могу ли я узнать, как полоса пропускания на стороне сервера будет распределяться между разными пользователями? Если 2 пользователя одновременно пытаются загрузить один и тот же файл, будет ли полоса пропускания разделена поровну между пользователями, так что каждый пользователь получит 0,5 полосы пропускания?
Я пробовал следующую настройку: -
Я подключил к коммутатору 2 клиентских ПК с ОС Windows XP. От коммутатора я подключаю его к серверному ПК через фиксированную полосу пропускания 2 Мбит / с. Затем я запускаю iperf на всех трех компьютерах одновременно. Клиентский компьютер запускает iperf в клиентском режиме, а серверный компьютер запускает iperf в серверном режиме.
Оба клиентских ПК отправляют данные на серверный ПК одновременно.
Затем я обнаружил, что серверный ПК получает ~ 500 кбит / с с клиентского ПК1 и ~ 1450 кбит / с с клиентского ПК2.
Оба клиентских ПК подключены к коммутатору с использованием Ethernet-соединения 1 Гбит / с. Оба используют один и тот же тип кабеля. Оба используют одну и ту же ОС. Настройки для iperf тоже такие же.
Я не понимаю, почему существует такая большая разница между пропускной способностью, выделенной для клиентского ПК1 и клиентского ПК2. Я хотел бы знать, как распределяется пропускная способность для одновременных пользователей, которые одновременно пытаются получить доступ к серверу.
Спасибо.
Нет однозначного ответа. Для самых простых служб TCP каждый клиент будет пытаться получить данные так быстро, как только может, а сервер будет передавать их клиентам так быстро, как это возможно. Если у двух клиентов общая пропускная способность превышает пропускную способность сервера, оба клиента, вероятно, будут загружать со скоростью примерно половину пропускной способности сервера.
В этом есть МНОГО переменных, которые делают это не совсем верным в реальной жизни. Если стеки TCP / IP разных клиентов по-разному способны обрабатывать высокопоточные соединения, это само по себе может повлиять на пропускную способность, даже если у сервера бесконечная пропускная способность. Различные операционные системы или серверные программы по-разному обрабатывают нарастание скорости потоковой передачи. Задержка влияет на пропускную способность, при которой соединения с большой задержкой могут быть значительно медленнее, чем соединения с низкой задержкой, даже если оба соединения могут передавать (в абсолютных значениях) один и тот же объем данных.
Показательный пример - загрузка архивов исходного кода ядра. У меня очень быстрая пропускная способность на работе, на самом деле она превышает скорость моей локальной сети, поэтому я могу заполнить свое локальное 100-мегабайтное соединение, если я получу правильный сервер. Наблюдая за моей диаграммой использования сети при загрузке больших файлов, я вижу, что некоторые серверы запускаются с малого, 100 Кб / с, медленно увеличиваются до высоких значений, 7 Мб / с, затем что-то происходит, и все начинается снова. Другие серверы предоставят мне все сразу, когда я начну скачивать.
В любом случае, элементы, которые могут привести к тому, что фактическое распределение полосы пропускания будет отличаться от абсолютного равенства:
Что касается ваших тестовых примеров, то, вероятно, произошло то, что один клиент смог установить более высокую скорость потока данных, чем другой, возможно, попав туда первым. Когда начался другой поток, ему не было выделено достаточно ресурсов для достижения полной четности скорости; первый поток попал туда первым и получил большую часть ресурсов. Если первый поток закончится, второй, скорее всего, наберет скорость. В этом случае скорость, с которой сталкиваются клиенты, определялась ОС Сервера, приложением, выполняющим потоковую передачу, и стеком TCP / IP Сервера. Кроме того, если сетевая карта поддерживает это, TCP Offload Engine сетевой карты, если он присутствует и включен.
Как я уже сказал, в это входит множество переменных.
Использование полосы пропускания с медленным нарастанием:
На серверном ПК нет логики балансировки для уравновешивания двух характеристик соединения. Фактически, я бы сказал, что нет никакого различия «пользователей» в двух соединениях на сервере.
Этот случай будет аналогичен двум экземплярам одних и тех же приложений, запущенных на сервере - все условия кажутся одинаковыми, но одно из них может работать лучше. Короче говоря, один из них должен почти «случайным образом» работать лучше.
Точно так же ваши два тестовых пути iperf кажутся похожими, но один из них будет работать лучше (я немного удивлен, что он, кажется, показывает в 3 раза производительность другого).
Но скажите, сколько раз вы запускали этот тест?
Если вы запустите его, скажем, 10 раз, будет ли один и тот же клиентский компьютер работать лучше в том же самом факторе? или вы видите некоторую степень случайности в повторах?
Время будет иметь большее отношение к вашему тесту, чем что-либо еще из-за отката TCP - происходит то, что первое соединение использует всю полосу пропускания, затем появляется второе и, по сути, начинает конкурировать с первым за пропускную способность; если передача продолжается достаточно долго, они в конечном итоге должны использовать одну и ту же полосу пропускания. Детали на самом деле зависят от стека TCP в зависимости от того, как они реализуют алгоритм предотвращения перегрузки.
На более низком уровне Ethernet использует экспоненциальный алгоритм отсрочки чтобы получить примерно такие же результаты.
Также возможно, что ваш коммутатор может влиять на вещи - если вы переключите порты, к которым подключены два ПК, производительность будет соответствовать ПК или останется с портом?