Проблема IP-пересылки - отбрасывание пакетов Rx во встроенной сети Linux

У меня есть компьютер и две встроенные системы на основе Linux, которые я пытаюсь связать вместе через IP-пересылку. Они охватывают две отдельные локальные сети. Обе сети являются проводными. Я могу пропинговать 10.10.10.6 с ПК и 10.10.30.1 с цели 1. Проблема возникает, когда я запускаю приложение на цели 1, которое генерирует здоровый (< 3 МБ / с) объем UDP-трафика, направленного на ПК. Производительность системы не может не отставать, и я вижу, что количество отброшенных пакетов RX постоянно увеличивается на интерфейсе цели 10.10.10.4.

Существует множество циклов ЦП на обеих целях. Итак, вопрос в том, почему цель 0 отбрасывает так много пакетов?

Есть ли что-то, что я могу сделать с конфигурацией, чтобы пройти через мириться? Увеличить размеры буфера?

+-----------+   +--------------------------------------+   +-------------------+ 
|  PC       |-->|              target 0                |-->|  target 1         |
|10.10.30.1 |   | eth1 =10.10.30.2   eth0 =10.10.10.4  |   | eth0 = 10.10.10.6 |
+-----------+   +--------------------------------------+   +-------------------+

цель 0 имеет два интерфейса Ethernet и ip_forwarding = 1

И у меня есть следующие настройки маршрута: на ПК:

Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
       10.10.10.6  255.255.255.255       10.10.30.2      10.10.30.1       1
       10.10.30.0    255.255.255.0       10.10.30.1      10.10.30.1       20

и на цели 0:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.30.0      *               255.255.255.0   U     0      0        0 eth1
10.10.10.0      *               255.255.255.0   U     0      0        0 eth0
default         10.10.10.6      0.0.0.0         UG    0      0        0 eth0
default         10.10.30.1      0.0.0.0         UG    0      0        0 eth1

и по цели 1:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.30.1      10.10.10.4      255.255.255.255 UGH   0      0        0 eth0
10.10.10.0      *               255.255.255.0   U     0      0        0 eth0
default         10.10.10.4      0.0.0.0         UG    0      0        0 eth0

Изменить: цель 0

# ip link list | grep mtu
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

цель 1

# ip link list | grep mtu
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

Подтверждено, что оба соединения установлены на 100 Мбит / с в полнодуплексном режиме.

Еще одна мысль:

Похоже, что ввод к цели 0 затопляется, может ли переключиться между двумя целями, буферизировать пакеты и затем затопить цель 0 большим пакетом данных?

Обновить:

При замене коммутатора 10/100/1000 на старый полудуплексный концентратор 10M система работает нормально, нет пропущенных пакетов.

В плохом состоянии дамп регистра ethtool показал, что число RX_DROP постоянно увеличивается. Это указывает на то, что процессор /Linux не может достаточно быстро удалить данные из чипа Ethernet. С концентратором 10M это больше не проблема.

Мне кажется, что Linux не настроен правильно, чтобы поддерживать более высокую (но не такую ​​высокую) скорость передачи данных. Я хотел бы понять, почему ОС / процессор не успевает?

2 ответа

Вы убедились, что все ссылки работают в дуплексном режиме?

dmesg | grep -i duplex

Должен дать вам эту информацию о Linux. Если это не удалось, попробуйте:

mii-tool <interface>

(Обратите внимание, что последний должен быть запущен от имени пользователя root.)

Каково распределение пакетов UDP по размеру? 3 Мбит / с может означать 2000 пакетов в секунду или 50 000 пакетов в секунду, в зависимости от размера ваших дейтаграмм.

3MBytes / second не должно беспокоить большинство современных аппаратных средств, поэтому меня интересует дуплекс всех ссылок. Полудуплексное соединение может привести к коллизиям, а также к увеличению буферизации.

Что касается вашего вопроса о том, что коммутатор может буферизовать кадры, это возможно, но обычно не настраивается. Можете ли вы предоставить информацию о марке / модели на коммутаторах?

Какой размер MTU установлен на target0 и target1?

Поскольку это L3, перенаправляющий пакет, больший, чем MTU на Target0, перед его передачей на интерфейс Target0 eth1 необходимо будет фрагментировать, возможно, это является причиной проблемы (однако нет никаких доказательств того, что это приведет к отбрасыванию пакетов RX).

Можете ли вы сделать список IP-ссылок | grep mtu 'на обеих мишенях?

Вы включили какую-либо фильтрацию IPtables или что-нибудь связанное с политикой IP /QoS?

Другие вопросы по тегам