Я разрабатываю проект, в котором мне нужно обмениваться пакетами UDP между двумя контейнерами докеров на одном хосте. Хост представляет собой новый выделенный сервер под управлением сервера Ubuntu 14.04LTS (Dell PowerEdge R410, 32 ГБ ОЗУ, процессор Intel Xeon E5640 @ 2,67 ГГц).
При разработке своего проекта я заметил, что теряю пакеты между двумя док-контейнерами, поэтому я разработал следующий сценарий, чтобы продемонстрировать свою проблему:
Я создал 3 контейнера докеров из Ubuntu: 14.04, работающих на одном хосте, назовем их контейнер №1, контейнер №2 и контейнер №3. Версия докера 1.11.1 (сборка 5604cbe).
Контейнер №1 работает
iperf
:iperf -c 225.2.2.2 -u -T 32 -t 60 -i 1 -b 700M
(генерирует пакеты UDP и рассылает их в течение 60 секунд с пропускной способностью 700 Мбит/сек).Контейнер №2 работает
iperf
:iperf -s -u -B 225.2.2.2 -i 1
(прослушивает тот же многоадресный адрес).Контейнер № 3 работает
tcpdump
:tcpdump -i eth0 port 5001
(который прослушивает порт, который Контейнер № 1 будет многоадресно передавать пакеты).
По прошествии 60 секунд контейнер №1 сообщает, что отправил 2786350 дейтаграмм.
Контейнер №2 сообщает, что:
Interval Transfer Bandwidth Jitter Lost/Total Datagrams
0.0-60.0 sec 3.81 GBytes 546 Mbits/sec 0.001 ms 2250/2786349 (0.081%)
Контейнер №3 сообщает, что:
2770477 packets captured
2786351 packets received by filter
15874 packets dropped by kernel
Итак, пара вопросов:
Почему контейнеры №2 и №3 не сообщают о одинаковом количестве полученных пакетов (контейнер №2 имеет на 1 дейтаграмму меньше, а контейнер №3 — на 1 больше)?
Почему количество потерянных пакетов сильно отличается, если это контролируемая виртуальная сеть? Кроме того, что означает «пакеты, отброшенные ядром»?
Почему я вообще теряю пакеты? Опять же, это контролируемая виртуальная среда, сетевое оборудование не используется.
Заранее спасибо.