У меня вопрос, который беспокоит меня уже довольно давно. У меня есть несколько сред и серверов. Все они подключены к Ethernet-коммутаторам на 1 Гбит (например, Cisco 3560).
Насколько я понимаю, канал 1 Гбит должен обеспечивать 125 Мбайт / с - конечно, это теория. Но как минимум он должен достигать ~ 100 Мбайт / с.
Проблема здесь в том, что один процесс копирования достигает только ~ 20 Мбайт / с.
Я знаю об этих факторах, но они не имеют никакого значения:
Со всеми этими конфигурациями я никогда не получаю больше ~ 25 Мбайт / с. Дело в том, что если я запускаю несколько параллельных потоков копирования, например, 3 раза по rsync, я почти достигну 90 Мбайт / с. Я также провел несколько тестов IOMeter и обнаружил, что "chunksize" имеет огромное значение, но обычно не настраивается с помощью данных инструментов (или это так?).
Jumbo-кадры не включены, но я не уверен, что это изменит ситуацию. TOE включен на всех сетевых адаптерах.
О каких узких местах вы могли бы подумать? У вас есть подобный опыт? Это ожидаемые «естественные» значения?
заранее спасибо
Всегда превосходный tomshardware.com сделал отличную статью о том, как достичь 100 Мбит / с по гигабитному каналу Ethernet - и, как говорит lg, все сводится к дискам.
Прочтите (ВОТ) и посмотрите, что вы думаете.
По моему опыту, узким местом всегда являются диски. Я никогда не использовал ISCSI или SAN, поэтому единственный способ повысить производительность - использовать RAID0 с выделенной рейдовой картой.
Если все дело в потоке, то вы сталкиваетесь с проблемой "продукта задержки полосы пропускания". По сути, существует ограничение на то, сколько данных будет «в полете» в любой момент времени (в TCP это «размер окна»), и для заданной задержки приема-передачи вы не можете получить больше, чем определенное количество. данных за определенный период времени, потому что отправитель должен дождаться, пока получатель подтвердит получение уже отправленных данных, прежде чем они смогут отправить еще. Грубо говоря, ваша пропускная способность TCP будет равна размеру окна / задержке приема-передачи (в секундах).
Это не просто TCP вещь (хотя я использую этот пример, потому что по нему больше всего литературы, если вы хотите пойти дальше). Все протоколы, ожидающие подтверждения перед отправкой дополнительных данных, будут иметь такую же проблему. Теоретически вы можете просто отправить все данные и не ждать подтверждения, но это обычно считается плохим, потому что вы можете «затопить» получателя, не давая ему возможности остановить пожарный шланг.
Для большинства протоколов вы можете настроить размер окна так, чтобы у вас было больше данных «в полете» одновременно, а некоторые протоколы имеют параметры, которые вы можете настроить, чтобы уменьшить влияние подтверждений, но все они имеют компромиссы, о которых вам нужно подумать. ваше приложение.