2016-05-11 12 views
1

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

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

я создал 3 Docker контейнеры из убунту: 14.04, работающих на одном хосте , давайте назовем их контейнером №1, контейнером № 2 и контейнером №3. Версия докера - 1.11.1 (build 5604cbe).

  • Контейнер # 1 работает iperf: iperf -c 225.2.2.2 -u -T 32 -t 60 -i 1 -b 700M (он генерирует UDP-пакеты и многоадресной передачи их на 60с с 700Mbit/сек доступ к каналу).

  • Контейнер №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. Почему я теряю пакеты в первую очередь? Еще раз, это контролируемая виртуальная среда, ни одно сетевое оборудование не используется.

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

ответ

3

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

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

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

  1. Увеличение буфера для ТСРйитра, -B или --buffer размера опции, размер в КБ. Значение по умолчанию - 2048 КБ.
  2. Суды хорошие -10 ТСРйитр - дать TCPDUMP дополнительного приоритет (или даже -20)
  3. если вы на Linux Судо хорошего -10 ionice -c 1 ТСРйитра приоритет дополнительных записей на диске