Отсутствуют 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
Итак, пара вопросов:
Почему контейнеры № 2 и № 3 не сообщают об одном и том же количестве полученных пакетов (в контейнере № 2 на 1 меньше дейтаграммы, а в контейнере № 3 больше)?
Почему количество потерянных пакетов сильно отличается, если это контролируемая виртуальная сеть? Кроме того, что означает "пакеты, отброшенные ядром"?
Почему я теряю пакеты в первую очередь? Еще раз, это управляемая виртуальная среда, сетевое оборудование не используется.
Заранее спасибо.
1 ответ
пакеты, "отброшенные ядром" (это количество пакетов, которые были отброшены из-за недостатка места в буфере механизмом захвата пакетов в ОС, в которой работает tcpdump, если ОС сообщает эту информацию приложениям; если нет, будет сообщено как 0).
ядро записывает захваченные данные в специальный буфер, а tcpdump считывает данные из этого буфера. Если буфер заполнен, пакет отбрасывается.
Сеть часто быстрее, чем диск, что означает, что иногда вы не можете просто захватить все пакеты. Но так как количество упакованных упаковок невелико, это не ваш случай, поэтому вы можете сделать следующее.
- Увеличьте буфер для параметров tcpdump, -B или --buffer-size, размер в КБ. По умолчанию 2048 КБ.
- sudo nice -10 tcpdump - дать tcpdump дополнительный приоритет (или даже -20)
- если у вас на linux sudo nice -10 ionice -c 1 tcpdump дополнительный приоритет записи на диск