Pull to refresh

Comments 8

Docker не docker, a cgroup ограничивает ресурсы.

Для FW узкое место перекладывание трафика с сетевого интерфейса? Что-то не верится.

Разработать средство ограничения числа используемых ядер процессора при обработке сетевого трафика.

То есть, вы полезли ковырять ядра, а почему не сетевой стек ядра линукс?

Исходя из задачи, например в лицензии можно было бы написать, что вам доступно 1 ядро на обработку, или 2, или все доступные ядра в системе. Ковырять сетевой стек тоже можно.

Не очень понял. Чтобы замедлить трафик, ограничили ресурсы для обработки, при этом целиком выделяет ядра, просто меньше чем нужно. В итоге какие-то потоки будут быстро обрабатываться, а какие-то нет. Но разве не смысл в том, чтобы все обрабатывались медленно?

Смысл был в том, чтобы можно было выбрать точное количество ядер ЦПУ которые будут участвовать в обработке трафика (не в программе число потоков создавать, а на уровне железа). Для этого каждое из ядер подключается каждый к своей очереди пакетов. Чем больше задано очередей, тем больше DMA может переложить пакетов из сетевой карты по разным очередям (размер каждой очереди ограничен и может переполняться). Когда у тебя задана одна очередь, она будет обслуживаться одним ядром, соответственно эта очередь будет быстрее переполняться, тем самым будет увеличиваться число отброшенных пакетов (что можно видеть по снятым показателям). Увеличивая число очередей, ты увеличиваешь объем памяти куда могут записываться пакеты из карты, а так же число ядер которые параллельно из этих очередей будут вычитывать.
Высокоуровневый путь, по которому проходит пакет от прибытия до приёмного буфера сокета выглядит так:

  1. Драйвер загружается и инициализируется.

  2. Пакет прибывает из сети в сетевую карту.

  3. Пакет копируется (посредством DMA) в кольцевой буфер памяти ядра.

  4. Генерируется аппаратное прерывание, чтобы система узнала о появлении пакета в памяти.

  5. Драйвер вызывает NAPI, чтобы начать цикл опроса (poll loop), если он ещё не начат.

  6. На каждом CPU системы работают процессы ksoftirqd. Они регистрируются во время загрузки. Эти процессы вытаскивают пакеты из кольцевого буфера с помощью вызова NAPI-функции poll, зарегистрированной драйвером устройства во время инициализации.

  7. Очищаются (unmapped) те области памяти в кольцевом буфере, в которые были записаны сетевые данные.

  8. Данные, отправленные напрямую в память (DMA), передаются для дальнейшей обработки на сетевой уровень в виде ‘skb’.

  9. Если включено управление пакетами, или если в сетевой карте есть несколько очередей приёма, то фреймы входящих сетевых данных распределяются по нескольким CPU системы.

  10. Фреймы сетевых данных передаются из очереди на уровни протоколов.

  11. Уровни протоколов обрабатывают данные.

  12. Данные добавляются в буферы приёма, прикреплённые к сокетам уровнями протоколов.

Хорошая статья! Приятно, когда компании не стесняются говорить о какой-то внутренней кухне в своих решениях, всегда интересно почитать такое.

Подскажите пожалуйста, какая у вас конфигурация trex и команда его запуска для этого тестирования, могли бы поделиться?

Второй вопрос у меня более каверзный, Positive Technologies для реализации NGFW решили отказаться от IP стека ядра, потому что он достаточно медленный и реализовали его внутри userspace, при этом взяв стек от FreeBSD и переписав его под себя. Вы рассматриваете такое решение вашей задачи?

Точной конфигурации уже не осталось, могу в общем сказать, что это был линейно возрастающий tcp трафик до 60Гб/с c числом сессий до 20000.
Решениями с использованием DPDK так же занимались.

Sign up to leave a comment.

Articles