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

Я занимаюсь разработкой проекта, в котором мне нужно обмениваться пакетами UDP между двумя док-контейнерами на одном хосте. Хост - это новый выделенный сервер под управлением сервера Ubuntu 14.04LTS (Dell PowerEdge R410, 32 ГБ ОЗУ, процессор Intel Xeon E5640 @ 2.67 ГГц).

Разрабатывая свой проект, я заметил, что терял пакеты между двумя док-контейнерами, поэтому я разработал следующий сценарий, чтобы продемонстрировать свою проблему:

Я создал 3 docker-контейнера из Ubuntu:14.04, работающие на одном хосте, назовем их контейнером № 1, контейнером № 2 и контейнером № 3. Версия Docker - 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 больше)?

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

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

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

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 дополнительный приоритет записи на диск
Другие вопросы по тегам