Обработка UDP MPEG-TS

191 views
Skip to first unread message

Max Lapshin

unread,
Dec 2, 2010, 5:00:15 PM12/2/10
to erlang-...@googlegroups.com
Исходные данные: есть около 50 потоков, которые на скорости около
мегабита шлют MPEG-TS пакеты по UDP.
Надо превратить это в HTTP на одного клиента.

Мегабит — это порядка 125 килобайт в секунду. Пакет MPEG-TS — ровно
188 байт. Это порядка 700 пакетов в секунду.
50 потоков — 35000 пакетов в секунду.

Дальше симптомы такие:
если UDP включать в режиме {active,once}, то через небольшое время
данные начинают теряться.
Если включать в режиме {active,true}, то очень скоро (сейчас уточняю
конкретные цифры) начинает линейно расти потребление памяти. Скорее
всего просто забивается очередь сообщений.

Надо отметить, что 50 HTTP MPEG-TS потоков erlyvideo переживает без проблем.

На основании этих данных я сделал вывод, что erlang просто не успевает
шедулить столько пакетов. Беда в том, что на каждый MPEG-TS пакет
приходит отдельное сообщение. Думаю, что если бы ядро или кто-то ещё
сам бы группировал данные, было бы сильно проще.

Пока остается очень неприятный вариант: писать свой драйвер, который
будет открывать сокет, подписываться на него, аккумулировать данные и
слать дальше.


Вопросы такие:
1) убедительно ли звучат мои предположения о том, что беда в количестве пакетов?
2) можно ли заставить слать мне сообщения, склеенные в пачки, а не
кусочками по 188 байт?
3) есть ли шанс обойтись без собственного драйвера?

Дмитрий Омелечко

unread,
Dec 2, 2010, 5:14:48 PM12/2/10
to erlang-...@googlegroups.com
попробуй "растянуть" значения в sysctl

у меня вот на таком адекватно началась работа с UDP

## common

net.core.wmem_max = 8388608
net.core.rmem_max = 8388608
net.core.wmem_default = 65536
net.core.rmem_default = 65536

## tune TCP

net.ipv4.tcp_mem = 8388608 8388608 8388608
net.ipv4.tcp_wmem = 4096 65536 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608

## tune UDP

net.ipv4.udp_mem = 8388608 8388608 8388608
net.ipv4.udp_rmem_min = 1024000
net.ipv4.udp_wmem_min = 1024000


3 декабря 2010 г. 0:00 пользователь Max Lapshin <max.l...@gmail.com> написал:


> Исходные данные: есть около 50 потоков, которые на скорости около
> мегабита шлют MPEG-TS пакеты по UDP.
> Надо превратить это в HTTP на одного клиента.
>

> Мегабит -- это порядка 125 килобайт в секунду. Пакет MPEG-TS -- ровно


> 188 байт. Это порядка 700 пакетов в секунду.

> 50 потоков -- 35000 пакетов в секунду.


>
> Дальше симптомы такие:
> если UDP включать в режиме {active,once}, то через небольшое время
> данные начинают теряться.
> Если включать в режиме {active,true}, то очень скоро (сейчас уточняю
> конкретные цифры) начинает линейно расти потребление памяти. Скорее
> всего просто забивается очередь сообщений.
>
> Надо отметить, что 50 HTTP MPEG-TS потоков erlyvideo переживает без проблем.
>
> На основании этих данных я сделал вывод, что erlang просто не успевает
> шедулить столько пакетов. Беда в том, что на каждый MPEG-TS пакет
> приходит отдельное сообщение. Думаю, что если бы ядро или кто-то ещё
> сам бы группировал данные, было бы сильно проще.
>
> Пока остается очень неприятный вариант: писать свой драйвер, который
> будет открывать сокет, подписываться на него, аккумулировать данные и
> слать дальше.
>
>
> Вопросы такие:
> 1) убедительно ли звучат мои предположения о том, что беда в количестве пакетов?
> 2) можно ли заставить слать мне сообщения, склеенные в пачки, а не
> кусочками по 188 байт?
> 3) есть ли шанс обойтись без собственного драйвера?
>

> --
> Страница рассылки: http://groups.google.com/group/erlang-russian
>  Jabber-конференция: erl...@conference.jabber.ru
>  Новости: http://erlanger.ru
> Написать письмо: erlang-...@googlegroups.com
> Отписаться: erlang-russia...@googlegroups.com
>

Max Lapshin

unread,
Dec 2, 2010, 5:16:56 PM12/2/10
to erlang-...@googlegroups.com
А что это значит? Я так понимаю, что заставить UDP склеить соседние
пакеты невозможно: он такой by design пакетный.

Andrey Nikolaev

unread,
Dec 5, 2010, 8:51:24 AM12/5/10
to erlang-...@googlegroups.com
Как ты уже успел заметить - UDP не умеет клеить пакеты. Смущают 34k
pps. Есть возможность замерить сеть с помощью netperf?

2010/12/3 Max Lapshin <max.l...@gmail.com>:


> Исходные данные: есть около 50 потоков, которые на скорости около
> мегабита шлют MPEG-TS пакеты по UDP.
> Надо превратить это в HTTP на одного клиента.
>

> Мегабит -- это порядка 125 килобайт в секунду. Пакет MPEG-TS -- ровно


> 188 байт. Это порядка 700 пакетов в секунду.

> 50 потоков -- 35000 пакетов в секунду.


>
> Дальше симптомы такие:
> если UDP включать в режиме {active,once}, то через небольшое время
> данные начинают теряться.
> Если включать в режиме {active,true}, то очень скоро (сейчас уточняю
> конкретные цифры) начинает линейно расти потребление памяти. Скорее
> всего просто забивается очередь сообщений.
>
> Надо отметить, что 50 HTTP MPEG-TS потоков erlyvideo переживает без проблем.
>
> На основании этих данных я сделал вывод, что erlang просто не успевает
> шедулить столько пакетов. Беда в том, что на каждый MPEG-TS пакет
> приходит отдельное сообщение. Думаю, что если бы ядро или кто-то ещё
> сам бы группировал данные, было бы сильно проще.
>
> Пока остается очень неприятный вариант: писать свой драйвер, который
> будет открывать сокет, подписываться на него, аккумулировать данные и
> слать дальше.
>
>
> Вопросы такие:
> 1) убедительно ли звучат мои предположения о том, что беда в количестве пакетов?
> 2) можно ли заставить слать мне сообщения, склеенные в пачки, а не
> кусочками по 188 байт?
> 3) есть ли шанс обойтись без собственного драйвера?
>

Max Lapshin

unread,
Dec 5, 2010, 8:55:42 AM12/5/10
to erlang-...@googlegroups.com
Пока я сделал так: написал linked-in драйвер, который открывает UDP
порт, подписывается на его события и внутри себя буферизует до 1500
байт.

Joel Reymont

unread,
Dec 6, 2010, 5:33:59 PM12/6/10
to Erlang в России
А чем этот подход отличается от встроенного linked-in драйвера?

Max Lapshin

unread,
Dec 6, 2010, 5:36:51 PM12/6/10
to erlang-...@googlegroups.com
2010/12/7 Joel Reymont <joe...@gmail.com>:

> А чем этот подход отличается от встроенного linked-in драйвера?
>

От драйвера prim_inet он отличается тем, что я буферизую несколько UDP
пакетов в один.

Max Lapshin

unread,
Dec 6, 2010, 6:11:52 PM12/6/10
to erlang-...@googlegroups.com
2010/12/7 Joel Reymont <joe...@gmail.com>:

> А чем этот подход отличается от встроенного linked-in драйвера?
>

Я сейчас как раз на продуктиве делаю замеры, но пока ситуация такая:
после написания собственного linked-in драйвера,
данные перестали теряться, но начала расти память.

Я сделал вывод, что linked-in драйвер начал успевать считывать пакеты,
но теперь не успевает отдавать HTTP клиентам.
Загрузка в пике 300 mbit/s

twin

unread,
Dec 7, 2010, 2:18:22 PM12/7/10
to erlang-...@googlegroups.com
У нас в данный момент в компании один сервер принимает примерно 50 каналов ТВ, на выходе получается 17-19 kP/s около 220Мбит/с. Но все отдается по UDP. размер пакета если не ошибаюсь 1366.
Попробую внести немного ясности, UDP не требует ответа (ACK пакета), не нужно ждать этого ответа и при его задержке держать пакет в буфере для повторной отправки. Проблема роста памяти как мне кажется в этом.

7 декабря 2010 г. 4:11 пользователь Max Lapshin <max.l...@gmail.com> написал:
--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com



--
С уважением, Алексей.
г.Екатеринбург.
тел. +73433451059
ICQ 301833245

Max Lapshin

unread,
Dec 7, 2010, 3:21:11 PM12/7/10
to erlang-...@googlegroups.com
Да, но надо ретранслировать его в HTTP, потому что UDP теряет данные.

TCP прекрасно справляется с 950 мбит/с, вопрос только в том, что я
что-то делаю не так =(

Reply all
Reply to author
Forward
0 new messages