Производительность перенаправления пакетов ядра Linux

2060
Bob Somers

Я уже давно пользуюсь Linux-боксом в качестве роутера. Ничего особенного, просто включите пересылку в ядре, включите маскарадинг и настройте iptables, чтобы пробить несколько дыр в брандмауэре.

Недавно мой друг указал на проблему с производительностью. Кажется, что одиночные соединения TCP имеют очень низкую производительность. Вы должны открыть несколько параллельных TCP-соединений, чтобы получить приличную скорость.

Например, у меня есть интернет-соединение 10 Мбит. Когда я загружаю файл из известного быстрого источника, используя что-то вроде DownThemAll! Расширение для Firefox (которое открывает несколько параллельных TCP-соединений). Я могу получить его, чтобы максимально увеличить пропускную способность моего нисходящего потока на уровне около 1 МБ / с. Однако, когда я загружаю тот же файл с помощью встроенного в Firefox менеджера загрузок (использует только одно TCP-соединение), он запускается быстро, а скорость увеличивается до тех пор, пока он не превысит 100–350 КБ / с.

Я проверил внутреннюю сеть, и у нее, похоже, нет проблем. Все проходит через переключатель 100 Мбит. Я также запускал iperf как изнутри (от маршрутизатора до моего рабочего стола), так и извне (от моего рабочего стола до Linux-бокса, которым я владею в сети) и не видел никаких проблем. Он достигает около 1 МБ / с, как и должно быть. Speedtest.net также сообщает о скорости 10 Мбит.

Нагрузка на машину с Linux все время составляет около 0,00, 0,00, 0,00, и у нее много свободной оперативной памяти. Это старый ноутбук с процессором Pentium M 1,6 ГГц и 1 ГБ оперативной памяти. Внутренняя сеть подключена к встроенному сетевому адаптеру Intel, а кабельный модем подключен к 32-разрядной сетевой карте Netgear FA511 PCMCIA.

Я думаю, что проблема с пересылкой пакетов в маршрутизаторе, но я, честно говоря, не уверен, где проблема может быть. Есть ли что-нибудь, что могло бы существенно замедлить один поток TCP?

2

2 ответа на вопрос

1
Bob Somers

Проблема была исправлена. Была какая-то аппаратная проблема (все еще не знаю, что) на машине. После установки того же дистрибутива Linux и перенастройки брандмауэра и переадресации пакетов одинаково на другой машине проблема больше не возникает.

Странный.

0
David Spillett

Скорее всего, это проблема производительности для каждого потока на удаленном конце или у вашего интернет-провайдера - каждый отдельный поток регулируется намеренно (вашим интернет-провайдером) или просто из-за перегрузки (на удаленном сайте, у вашего интернет-провайдера или где-либо еще). между).

Это вряд ли будет ошибкой с вашей стороны.

В качестве примера того, как это работает, когда проблема заключается в перегрузке, представьте веб-сервер с соединением 10000 Кбайт / с и без других ограничений / узких мест. Если имеется 100 активных подключений, загружающих большие объекты, каждое из них (без учета различий, вызванных различиями в задержках и перегрузках между каждым клиентом и сервером) получит в среднем около 100 Кбайт / с. Если вы откроете пять подключений вместо одного, вы получите что-то более похожее на 480 Кбайт / с (10000/104 * 5), в то время как каждый отдельный поток получает что-то вроде 95 Кбайт / с (10000/104 * 1). Конечно, в этом примере вы единственный, кто использует несколько соединений, что вряд ли имеет место в реальной жизни. А также эта математика работает только в том случае, если управление трафиком в условиях перегруженности приводит к справедливой средней скорости передачи каждому потоку,

Спасибо, но я тоже это проверил. Мы поменяли местный маршрутизатор Linksys, и проблема не возникла. Он был в состоянии загрузить на 10 Мбит на одном TCP-потоке. Я также протестировал загрузку файла из моего Linux-бокса в сети (который, я знаю, не ограничен), и он столкнулся с той же проблемой. Bob Somers 15 лет назад 0
Странный. Я бы не ожидал, что Linux повлияет на трафик таким образом, если не будет настроено какое-то явное формирование трафика. Если вы настроили правила маршрутизации / фильтрации / искажения для маскарадинга и переадресации портов вручную, вы бы знали, сделали ли вы это, но если бы вы использовали инструмент или скрипт GUI из другого места, возможно, стоит проверить содержимое активных ip_tables и правил очередей, чтобы увидеть, есть ли там что-то неожиданное. David Spillett 15 лет назад 0