Отсутствуют пакеты UDP между контейнерами докеров

Я разрабатываю проект, в котором мне нужно обмениваться пакетами 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

Итак, пара вопросов:

  1. Почему контейнеры №2 и №3 не сообщают о одинаковом количестве полученных пакетов (контейнер №2 имеет на 1 дейтаграмму меньше, а контейнер №3 — на 1 больше)?

  2. Почему количество потерянных пакетов сильно отличается, если это контролируемая виртуальная сеть? Кроме того, что означает «пакеты, отброшенные ядром»?

  3. Почему я вообще теряю пакеты? Опять же, это контролируемая виртуальная среда, сетевое оборудование не используется.

Заранее спасибо.


person Miguel Cunha    schedule 11.05.2016    source источник


Ответы (1)


пакеты, «отброшенные ядром» (это количество пакетов, которые были отброшены из-за нехватки буферного пространства механизмом захвата пакетов в ОС, на которой работает tcpdump, если ОС сообщает эту информацию приложениям; если нет, то будет сообщено как 0).

ядро записывает захваченные данные в специальный буфер, а tcpdump считывает данные из этого буфера. Если буфер заполнен, пакет отбрасывается.

Сеть часто быстрее, чем диск, что означает, что иногда вы не можете просто захватить все пакеты. Но поскольку количество сброшенных упаковок невелико, это не ваш случай, поэтому вы можете сделать следующее.

  1. Увеличьте буфер для параметров tcpdump, -B или --buffer-size, размер в КБ. По умолчанию 2048 КБ.
  2. sudo nice -10 tcpdump — дать tcpdump дополнительный приоритет (или даже -20)
  3. если вы используете linux sudo nice -10 ionice -c 1 tcpdump дополнительный приоритет записи на диск
person Anatoliy Orlov    schedule 12.05.2016