Обновить

Комментарии 9

а как эта штука показывает себя по сравнению с аналогами? ну там latency и пропускная способность

Пока не проводил корректное сравнение с аналогами на одинаковом стенде. Производительность сильно зависит от режима работы (XDP native/generic) и сложностью логики обработки, характером трафика и особенностями оборудования. В одном из следующих этапов планирую провести бенчмарки с измерением latency, PPS, throughput и загрузки CPU, а также сравнить поведение на RISCV и x86-64. К сожалению, ARM-платформы для тестирования у меня пока нет. Результаты планирую оформить в отдельную публикацию.

Сами BPF maps безопасны для конкурентного доступа: control plane может обновлять map, пока dataplane её читает. В текущей реализации при изменении существующей политики я не создаю новый набор связанных правил - сначала выполняется поиск политики по её ключу, после чего изменяется значение этого же элемента map. Например, при изменении действия с Drop на Allow меняется значение существующей записи.

Поэтому на уровне одной ACL-записи нет состояния, в котором dataplane может увидеть «половину» обновления: пакет либо обрабатывается по старым данным, либо после обновления - по новым. При этом пакет, который уже находится в процессе обработки, естественно, может завершиться по старому состоянию.

control plane умеет атомарно изменять записи? А что с добавлением и удалением? Я веду к тому что там за структура данных такая для мапы, которую можно на лету и читать и менять или там лочется вся мапа на чтение при изменении, но тогда это стопнет весь бизнес поток

Мапа не лочится. Когда приходит пакет, происходит чтение актуального на этот момент состояния мапы и принимается решение на его основе. Операции добавления, обновления и удаления отдельных записей выполняются без блокировки всей мапы, поэтому обработка трафика не останавливается.

Ну да, там не вся хэш мапа лочится, а только список в конкретном бакете спинлоком.

https://github.com/torvalds/linux/blob/0f23d56f17fdfc7db69d51f64c8b91bbab947aa9/kernel/bpf/hashtab.c#L83

что с поддержкой таблицы состояний, типа того же conntrack. :) какова ценность решения без таковой(?).

Ценность есть но не сейчас . В ходе пересмотра архитектуры состояния "минимально живого продукта "- порезал функционал и это было осознанно ,для того чтобы выделить - что живое и можно показать людям с примерами ,а что нужно пересмотреть и переделать . Да признаю,что хвосты остались . Но можно считать ,что это "заготовки" под будущий функционал ,например под Load balance ,*NAT и тд... Который будет в ближайшее время реализован .

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации