Виртуалка FreeBSD и мультикаст (страшное)

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Abyrvalg
мл. сержант
Сообщения: 129
Зарегистрирован: 2009-03-04 10:24:44

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение Abyrvalg » 2016-05-27 23:37:53

Здравствуй, достопочтенный All!

Есть замороченная, специфичная и нетривиальная проблема, об которую я (и не только я) сломал свой мосх. Надежды на решение почти нет... точнее, последняя надежда - это светлый коллективный разум...

На VMware vSphere живёт виртуалка:

Код: Выделить всё

FreeBSD test.example.com 10.3-RELEASE-p2 FreeBSD 10.3-RELEASE-p2 #0: Wed May  4 06:03:51 UTC 2016     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
К этой виртуалке подведено три vlan'а. Один из них - это обычный интернет, две других используются для получения мультимедийных мультикастов. Вот цитата из /etc/rc.conf:

Код: Выделить всё

ifconfig_vmx3f0="inet 172.16.220.27/24 descr vlan7"
ifconfig_vmx3f1="inet 192.168.100.100/24 descr vlan6"
ifconfig_vmx3f2="inet 192.168.200.200/24 descr vlan11"
defaultrouter="172.16.220.1"
static_routes="multicast1 multicast2 multicast3"
route_multicast1="234.5.2.0/24 -interface vmx3f2"
route_multicast2="235.5.2.0/24 -interface vmx3f1"
route_multicast3="239.13.2.0/24 -interface vmx3f2"
В результате имеем:

Код: Выделить всё

$ ifconfig
vmx3f0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        description: vlan7
        options=403bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,VLAN_HWTSO>
        ether 00:50:56:ab:e1:98
        inet 172.16.220.27 netmask 0xffffff00 broadcast 172.16.220.255
        nd6 options=9<PERFORMNUD,IFDISABLED>
        media: Ethernet 10Gbase-T
        status: active
vmx3f1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        description: vlan6
        options=403bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,VLAN_HWTSO>
        ether 00:50:56:ab:10:08
        inet 192.168.100.100 netmask 0xffffff00 broadcast 192.168.100.255
        nd6 options=9<PERFORMNUD,IFDISABLED>
        media: Ethernet 10Gbase-T
        status: active
vmx3f2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        description: vlan11
        options=403bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,VLAN_HWTSO>
        ether 00:50:56:ab:1c:a4
        inet 192.168.200.200 netmask 0xffffff00 broadcast 192.168.200.255
        nd6 options=9<PERFORMNUD,IFDISABLED>
        media: Ethernet 10Gbase-T
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Адреса 192.168.100.100 и 192.168.200.200 вписаны в конфиг от фонаря. Поскольку по соответствующим интерфейсам гуляет только мультикаст, смысла в них особого нет.

Маршрутизация:

Код: Выделить всё

$ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags      Netif Expire
default            172.16.220.1       UGS      vmx3f0
127.0.0.1          link#4             UH          lo0
172.16.220.0/24    link#1             U        vmx3f0
172.16.220.27      link#1             UHS         lo0
192.168.100.0/24   link#2             U        vmx3f1
192.168.100.100    link#2             UHS         lo0
192.168.200.0/24   link#3             U        vmx3f2
192.168.200.200    link#3             UHS         lo0
234.5.2.0/24       00:50:56:ab:1c:a4  US       vmx3f2
235.5.2.0/24       00:50:56:ab:10:08  US       vmx3f1
Сама виртуалка предназначена для работы с мультимедийными потоками (UDP). Для этого используется ffmpeg, а также multicat, с которым я основательно парился в соседней ветке.

Некоторое время тому назад я заметил следующую проблему. При попытке получить какой-либо мультикаст происходит неприемлемая задержка. Для мультикастов из vlan11, например, она составляет 10-20 минут. То есть, программа, которая работает с мультикастом, висит это время и лишь после этого начинает работать. Я пробовал обе упомянутые программы.

Заметив проблему, я попеременно продёргал несколько адресов из vlan6 и vlan11. Команды и выдача представлены ниже. (Для большей наглядности выдачу самого ffprobe убрал, оставил лишь временные метки.)

Код: Выделить всё

$ date; ffprobe udp://235.5.2.89:1234; date
четверг, 12 мая 2016 г. 14:54:46 (MSK)
четверг, 12 мая 2016 г. 14:55:12 (MSK)

$ date; ffprobe udp://234.5.2.89:1234; date
четверг, 12 мая 2016 г. 14:56:17 (MSK)
четверг, 12 мая 2016 г. 15:09:12 (MSK)

$ date; ffprobe udp://235.5.2.16:1234; date
четверг, 12 мая 2016 г. 15:10:50 (MSK)
четверг, 12 мая 2016 г. 15:11:22 (MSK)

$ date; ffprobe udp://234.5.2.16:1234; date
четверг, 12 мая 2016 г. 15:11:58 (MSK)
четверг, 12 мая 2016 г. 15:24:12 (MSK)

$ date; ffprobe udp://235.5.2.125:1234; date
четверг, 12 мая 2016 г. 15:27:41 (MSK)
четверг, 12 мая 2016 г. 15:28:21 (MSK)

$ date; ffprobe udp://234.5.2.125:1234; date
четверг, 12 мая 2016 г. 15:32:51 (MSK)
четверг, 12 мая 2016 г. 15:44:12 (MSK)
Видно, что во всех трёх случаях для vlan6 (235.5.2.0) время работы составило примерно полминуты (21-32 сек), а для vlan11 (234.5.2.0) - 11-13 минут. При этом сам ffprobe работает буквально несколько секунд, всё остальное время - тупо ожидание.
Сперва я подумал было, что заметил разницу в поведении сетей. Но мои ожидания не оправдались. Потом и во vlan6 я стал ловить адовы задержки.

Пытался снять сетевой дамп:

Код: Выделить всё

sudo tcpdump -n -i vmxN multicast
где N = 0, 1, 2
По нему было видно, что прога долго-долго ждёт, ждёт, ждёт... никаких запросов по сети не отправляет... а спустя 10-20 минут вдруг:

Код: Выделить всё

...
15:09:07.249432 IP 192.168.200.200 > 234.5.2.89: igmp v2 report 234.5.2.89
15:09:07.284278 IP 77.94.170.2.37266 > 234.5.2.89.1234: UDP, length 1316
15:09:07.288049 IP 77.94.170.2.37266 > 234.5.2.89.1234: UDP, length 1316
...
15:24:06.797326 IP 192.168.200.200 > 234.5.2.16: igmp v2 report 234.5.2.16
15:24:06.835062 IP 77.94.170.2.37266 > 234.5.2.16.1234: UDP, length 1316
15:24:06.838520 IP 77.94.170.2.37266 > 234.5.2.16.1234: UDP, length 1316
15:24:06.841954 IP 77.94.170.2.37266 > 234.5.2.16.1234: UDP, length 1316 
...
14:55:07.425228 IP 192.168.100.100 > 235.5.2.89: igmp v2 report 235.5.2.89
14:55:07.471305 IP 192.168.80.38.1000 > 235.5.2.89.1234: UDP, length 1316
14:55:07.475151 IP 192.168.80.38.1000 > 235.5.2.89.1234: UDP, length 1316
14:55:07.478524 IP 192.168.80.38.1000 > 235.5.2.89.1234: UDP, length 1316
14:55:07.482486 IP 192.168.80.38.1000 > 235.5.2.89.1234: UDP, length 1316 
...
То есть, на отправленный запрос реакция очень быстрая: мультикаст полился сию же секунду. Но вот почему сам запрос поступает спустя 10-20 минут после запуска программы? Притом будь то ffprobe или multicat - совершенно разные программы...

Я продолжил копать. Запустил ещё раз ffprobe в трассировке (truss, аналог strace). Вот самые интересные куски из лога:

Код: Выделить всё

...
4339: socket(PF_INET,SOCK_DGRAM|SOCK_CLOEXEC,0) = 4 (0x4)
4339: close(4) = 0 (0x0)
4339: socket(PF_INET,SOCK_DGRAM|SOCK_CLOEXEC,0) = 4 (0x4)
4339: setsockopt(0x4,0xffff,0x800,0x7fffffffd38c,0x4) = 0 (0x0)
4339: setsockopt(0x4,0xffff,0x4,0x80a862028,0x4) = 0 (0x0)
4339: bind(4,{ AF_INET 234.5.2.125:1234 },16) = 0 (0x0)
4339: getsockname(4,{ AF_INET 234.5.2.125:1234 },0x7fffffffd6fc) = 0 (0x0)
4339: setsockopt(0x4,0x0,0xc,0x7fffffffd7a8,0x8) = 0 (0x0)
4339: setsockopt(0x4,0xffff,0x1002,0x7fffffffd784,0x4) = 0 (0x0)
4339: getsockopt(0x4,0xffff,0x1002,0x7fffffffd784,0x7fffffffd6fc) = 0 (0x0)
4339: fcntl(4,F_GETFL,) = 2 (0x2)
4339: fcntl(4,F_SETFL,O_NONBLOCK|0x2) = 0 (0x0)
4339: mmap(0x0,8388608,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34540093440 (0x80ac00000)
4339: mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366316544 (0x800646000)
4339: mmap(0x7fffdfdfd000,2101248,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_STACK,-1,0x0) = 140736949374976 (0x7fffdfdfd000)
4339: mprotect(0x7fffdfdfd000,4096,PROT_NONE) = 0 (0x0)
4339: thr_new(0x7fffffffd400,0x68) = 0 (0x0)
4339: fcntl(4,F_GETFL,) = 6 (0x6)
4339: fcntl(4,F_SETFL,0x2) = 0 (0x0)
4339: _umtx_op(0x80a817330,UMTX_OP_MUTEX_WAIT,0x0,0x0,0x0) = 0 (0x0)
4339: gettimeofday({ 1463131661.716110 },0x0) = 0 (0x0)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) ERR#60 'Operation timed out'
4339: gettimeofday({ 1463131661.823203 },0x0) = 0 (0x0)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) ERR#60 'Operation timed out'
4339: gettimeofday({ 1463131661.930169 },0x0) = 0 (0x0)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) ERR#60 'Operation timed out'
4339: gettimeofday({ 1463131662.037174 },0x0) = 0 (0x0)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) ERR#60 'Operation timed out'
4339: gettimeofday({ 1463131662.144199 },0x0) = 0 (0x0)
...
и дальше эта ошибка воспроизводится непрерывно все 10-15 минут, в течение которых висит программа.

Кончается это вот так:

Код: Выделить всё

...
4339: nanosleep({ 0.001000000 }) = 0 (0x0)
4339: gettimeofday({ 1463133045.812361 },0x0) = 0 (0x0)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) ERR#60 'Operation timed out'
4339: nanosleep({ 0.001000000 }) = 0 (0x0)
4339: gettimeofday({ 1463133045.921438 },0x0) = 0 (0x0)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) ERR#60 'Operation timed out'
4339: nanosleep({ 0.001000000 }) = 0 (0x0)
4339: gettimeofday({ 1463133046.030375 },0x0) = 0 (0x0)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) ERR#60 'Operation timed out'
4339: nanosleep({ 0.001000000 }) = 0 (0x0)
4339: gettimeofday({ 1463133046.139466 },0x0) = 0 (0x0)
4339: recvfrom(4,''G\^D\M-c\^P\0\0\0\^A\a:?\M^TF''...,65536,0x0,NULL,0x0) = 1316 (0x524)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) = 0 (0x0)
4339: _umtx_op(0x80a806e58,UMTX_OP_NWAKE_PRIVATE,0x1,0x0,0x0) = 0 (0x0)
4339: gettimeofday({ 1463133046.180207 },0x0) = 0 (0x0)
4339: recvfrom(4,''G\^D\M-c\^[\M-V\M-?\^W\^N\M^_''...,65536,0x0,NULL,0x0) = 1316 (0x524)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffdf68) = 0 (0x0)
4339: _umtx_op(0x80a806e58,UMTX_OP_NWAKE_PRIVATE,0x1,0x0,0x0) = 0 (0x0)
4339: mmap(0x0,8388608,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34548482048 (0x80b400000)
4339: madvise(0x80a861000,0x1000,0x5) = 0 (0x0)
4339: madvise(0x80a883000,0x10000,0x5) = 0 (0x0)
4339: madvise(0x80a8c4000,0x10000,0x5) = 0 (0x0)
4339: gettimeofday({ 1463133046.186198 },0x0) = 0 (0x0)
4339: recvfrom(4,''G\^D\M-k\^YNZ\M^R\M-j\M-g6\M^N''...,65536,0x0,NULL,0x0) = 1316 (0x524)
4339: _umtx_op(0x803373750,UMTX_OP_WAIT_UINT_PRIVATE,0x0,0x18,0x7fffffffbb88) = 0 (0x0)
4339: _umtx_op(0x80a806e58,UMTX_OP_NWAKE_PRIVATE,0x1,0x0,0x0) = 0 (0x0)
...
после чего программа отрабатывает.

Для эксперимента собрал такую же виртуалку с теми же vlan'ами на, свят-свят, Windows 7. После того, как прописал на ней конкретные маршруты для 234.0.0.0 и 235.0.0.0, виндовый ffprobe стал хватать мультикасты довольно шустро. С Linux'ом ещё не пробовали, но предполагаю, что он тоже будет вести себя адекватно. И вот только Фря подводит...

Гуглёж ничего не дал. Фантазия исчерпана :( Если не починим, придётся переползать на какой-нибудь Debian или CentOS. Надежда лишь на сообщество.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Abyrvalg
мл. сержант
Сообщения: 129
Зарегистрирован: 2009-03-04 10:24:44

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение Abyrvalg » 2016-06-04 11:52:27

Судя по гробовому молчанию, придётся таки ставить Линьюх :( :(

Аватара пользователя
dekloper
ст. лейтенант
Сообщения: 1331
Зарегистрирован: 2008-02-24 15:43:19
Откуда: давно здесь сидим..
Контактная информация:

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение dekloper » 2016-06-14 12:23:47

для начала точно выяснить наличие\отсутствие связи с виртуализацией
на первый взгляд это как бе не при чом, если на 7-ке пашет
с другой стороны, большой вопрос, что происходит на виртуальном л2 и в каком состоянии поток приходит в виртуалку (мошт аддон какойнить есх-овский делает чонить с гостем)

на уровне гостевой фряхи

копать\дебажить сорс мультикат-а, выяснять, что вызывает таймаут
похоже на некорректный lock\unlock, в результате - ждем синхронизации..
dtrace-ом поглядеть как себя ведет mutex
ТОВАгИЩИ! БгАТЬЯ И СЕСТгЫ! ДОЛОЙ гАВНОДУШИЕ!

Abyrvalg
мл. сержант
Сообщения: 129
Зарегистрирован: 2009-03-04 10:24:44

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение Abyrvalg » 2016-06-14 13:59:33

Уже разобрались, помог откат на 9.3.

Аватара пользователя
dekloper
ст. лейтенант
Сообщения: 1331
Зарегистрирован: 2008-02-24 15:43:19
Откуда: давно здесь сидим..
Контактная информация:

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение dekloper » 2016-06-14 15:23:10

не хороший камень в 10-ю ветку..
чтож они там натварили такого..
ТОВАгИЩИ! БгАТЬЯ И СЕСТгЫ! ДОЛОЙ гАВНОДУШИЕ!

Abyrvalg
мл. сержант
Сообщения: 129
Зарегистрирован: 2009-03-04 10:24:44

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение Abyrvalg » 2016-06-14 15:29:53

Можно взглянуть на мои мучения в другом форуме, где народ оперативно откликнулся.
http://www.bsdportal.ru/viewtopic.php?f=9&t=27882

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение xM » 2016-06-14 18:26:20

Abyrvalg писал(а): Можно взглянуть на мои мучения в другом форуме, где народ оперативно откликнулся.
Я там почитывал дискуссию в процессе. Вы способ решить нашли, а причину так и не выяснили. Что всегда печально.
IT voodoo blog https://kostikov.co

Abyrvalg
мл. сержант
Сообщения: 129
Зарегистрирован: 2009-03-04 10:24:44

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение Abyrvalg » 2016-06-14 22:36:58

Увы, увы... Нет такой возможности :( И знаний пока не хватает, и время поджимает, сверху поторапливали...

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение xM » 2016-06-14 22:40:10

Вообще у FreeBSD крутые мэйл-листы где тусят разработчики. Вот там бы пообщались. Заодно бы и вы с проблемой разобрались, и они бы пофиксили (или показали в чём у вас проблема) на пользу общества.
IT voodoo blog https://kostikov.co

Abyrvalg
мл. сержант
Сообщения: 129
Зарегистрирован: 2009-03-04 10:24:44

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение Abyrvalg » 2016-08-23 17:08:52

Тема давняя, но считаю нужным поделиться. Как выяснилось, проблема распадается на несколько связанных между собой и с виртуальной инфраструктурой.

1) Виртуальный свитч vSphere испытывает некоторые трудности при работе с IGMPv3. Потому рекомендуется использовать v2.

1) Фря по необъяснимым причинам игнорирует sysctl net.inet.igmp.default_version=2 и продолжает слать запросы IGMPv3, что вкупе с предыдущей проблемой и составляет грабли.

3) Фря ещё вдобавок не всегда отвечает на запросы IGMPv2. В итоге на коммутаторах заканчивается срок действия подписки и они перестают форвардить трафик. Опытным путем была выявлена зависимость этой проблемы с сетевым адаптером vmxnet3. Лечится заменой адаптера vmxnet3 на e1000. Эта замена также заставляет фряху использовать IGMPv2, даже несмотря на sysctl net.inet.igmp.default_version=3.

Вот такие дела. Спасибо тому айтишнику, который во всём этом разобрался.
Теперь виртуалка на Фре, с которой мы начинали это повествование, работает с мультикастом как часы.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение xM » 2016-08-23 19:23:24

Круто. PR отправили по мотивам?
IT voodoo blog https://kostikov.co

Abyrvalg
мл. сержант
Сообщения: 129
Зарегистрирован: 2009-03-04 10:24:44

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение Abyrvalg » 2016-08-23 22:36:32

Нет, я этого не умею и вообще слабо представляю, что к чему.
К тому же, тестировали на 9.3. Как я писал ранее в этом треде, откатился на неё с 10-ки, и некоторое время было всё ок.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Виртуалка FreeBSD и мультикаст (страшное)

Непрочитанное сообщение xM » 2016-08-24 0:04:33

Это сообщение об ошибке.
https://bugs.freebsd.org
IT voodoo blog https://kostikov.co