Как улучшить пропускную способность интерфейса TUN при использовании Erlang TUNCTL - PullRequest
0 голосов
/ 27 октября 2018

Я использую TUNCTL с {active, true} для получения пакетов UDP от интерфейса TUN.Процесс получает пакеты и отправляет их другому процессу, который работает, и отправляет их еще одному процессу, который выталкивает их в другой интерфейс с помощью gen_udp.Тот же процесс повторяется в противоположном направлении, я использую gen_udp для получения пакетов и отправки их на интерфейс TUN.

Я начинаю видеть переполнения на входящем интерфейсе TUN, когда загрузка ЦП близка к 50%, около 2500 пакетов/ сек.Я никогда не теряю пакетов на стороне gen_udp, только с помощью Tunctl.Почему мое приложение не получает все пакеты от интерфейса TUN, когда процессор не перегружен?Мой процесс не имеет сообщений в очереди сообщений.

Я играл с приоритетами процесса и размерами буфера, но ничего особенного.Общая загрузка процессора имеет значение.Мне удалось снизить нагрузку на процессор, но, хотя я увидел небольшое увеличение пропускной способности интерфейса TUN, теперь он, похоже, максимально увеличивается при более низкой загрузке процессора, скажем, 50% вместо 60%.

TUNCTL / Procket не может читать пакеты достаточно быстро или TUNCTL / Procket не получает достаточное количество процессорного времени по какой-то причине?Моя теория состоит в том, что Erlang Scheduler не знает, сколько ему нужно времени, поскольку он вызывает NIF, и он не знает о количестве необработанных сообщений на интерфейсе TUN.Нужно ли мне пачкать руки с C ++ и / или писать свой собственный NIF?MSANTOS HELP!

1 Ответ

0 голосов
/ 30 октября 2018

Как и ожидалось, проблема была в том, что TUNCTL не получал достаточное количество процессорного времени, когда активен true. Я использовал procket: read, который получает пакет из буфера TUN. Используя этот подход, вы можете указать, как часто нужно проверять буфер, который сообщает Erlang Scheduler, сколько времени требуется вашему процессу. Это позволило мне загружать процессор до 100% при необходимости и позволило мне получать все пакеты с интерфейса TUN, который мне был нужен. Узкое место решено.

...