При использовании nc
, scp
, wget
для передачи файлов между 2 машинами по выделенному каналу 2 Мбит/с я получаю скорость от 0,5 до 1 Мбит/с. Однако, когда я использую iperf -c 10.0.1.4 -t 20 -P 12
(например), я могу максимизировать скорость канала (получая стабильные 2 Мбит/с).
Есть ли способ сделать однопотоковую передачу (например, как это делает scp
), чтобы использовать всю/большую часть ссылки? Какие-то настройки tcp или iptables...?
решение1
Для начала давайте признаем, что вы сравниваете яблоки и апельсины.
nc
, scp
и wget
обычно передают с помощью одного сокета TCP. Однако, когда вы используете iperf -P 12
, вы используетедвенадцатьпараллельные TCP-сокеты. Это нетривиальное различие. Чем больше у вас параллельных соединений, тем больше будет потребление полосы пропускания. Фактически,speedtest.net
использует несколько параллельных потоков TCP для надежного измерения пропускной способности полосы пропускания, даже если в вашем соединении наблюдаются значительные потери пакетов, которые могут заблокировать один сокет TCP; я видел, как они перегружали соединения с потерями в 1,5% (что привело бы к снижению пропускной способности обычного сокета TCP).
Основные причины неоптимальных односокетных TCP-передач — потеря пакетов и задержка/джиттер. Вам нужно определить и исправить, есть ли у вас какие-либо текущие потери пакетов через ваш канал... Я обычно используюmtr
илиwinmtr
для этого...
mpenning@mpenning-T61:~$ mtr -n <destination_ip>
HOST: mpenning-T61 Loss% Snt Last Avg Best Wrst StDev
1. 10.239.84.1 0.0% 407 8.8 9.1 7.7 11.0 1.0
2. 66.68.3.223 0.0% 407 11.5 9.2 7.1 11.5 1.3
3. 66.68.0.8 0.0% 407 19.9 16.7 11.2 21.4 3.5
4. 72.179.205.58 0.0% 407 18.5 23.7 18.5 28.9 4.0
5. 66.109.6.108 5.2% 407 16.6 17.3 15.5 20.7 1.5 <----
6. 66.109.6.181 4.8% 407 18.2 19.1 16.8 23.6 2.3
7. 4.59.32.21 6.3% 407 20.5 26.1 19.5 68.2 14.9
8. 4.69.145.195 6.4% 406 21.4 27.6 19.8 79.1 18.1
9. <destination_ip> 6.8% 406 22.3 23.3 19.4 32.1 3.7
Если вы видите переход, на котором вы постоянно теряете пакеты с течением времени,ипереходы за ним теряют пакеты, тогда вам нужно исправить то, что вызывает потерю пакетов. Я обычно измеряю в течение как минимум пяти или десяти минут... часто в течение часов, если я не вижу проблему немедленно.
Другая ситуация — задержка... вам нужно будет более подробно оценить проблему, указав подробности о сквозной задержке, а также информацию об ОС src/dest, прежде чем кто-то сможет отреагировать на нее.
Итак, у вас есть выбор... либо:
- Выясните, что является причиной снижения производительности
- Разбейте ваши передачи на несколько файлов и передавайте их параллельно (чтобы преодолеть любые факторы, снижающие вашу пропускную способность в данный момент)