Точной конфигурации уже не осталось, могу в общем сказать, что это был линейно возрастающий tcp трафик до 60Гб/с c числом сессий до 20000. Решениями с использованием DPDK так же занимались.
Смысл был в том, чтобы можно было выбрать точное количество ядер ЦПУ которые будут участвовать в обработке трафика (не в программе число потоков создавать, а на уровне железа). Для этого каждое из ядер подключается каждый к своей очереди пакетов. Чем больше задано очередей, тем больше DMA может переложить пакетов из сетевой карты по разным очередям (размер каждой очереди ограничен и может переполняться). Когда у тебя задана одна очередь, она будет обслуживаться одним ядром, соответственно эта очередь будет быстрее переполняться, тем самым будет увеличиваться число отброшенных пакетов (что можно видеть по снятым показателям). Увеличивая число очередей, ты увеличиваешь объем памяти куда могут записываться пакеты из карты, а так же число ядер которые параллельно из этих очередей будут вычитывать. Высокоуровневый путь, по которому проходит пакет от прибытия до приёмного буфера сокета выглядит так:
Драйвер загружается и инициализируется.
Пакет прибывает из сети в сетевую карту.
Пакет копируется (посредством DMA) в кольцевой буфер памяти ядра.
Генерируется аппаратное прерывание, чтобы система узнала о появлении пакета в памяти.
Драйвер вызывает NAPI, чтобы начать цикл опроса (poll loop), если он ещё не начат.
На каждом CPU системы работают процессы ksoftirqd. Они регистрируются во время загрузки. Эти процессы вытаскивают пакеты из кольцевого буфера с помощью вызова NAPI-функции poll, зарегистрированной драйвером устройства во время инициализации.
Очищаются (unmapped) те области памяти в кольцевом буфере, в которые были записаны сетевые данные.
Данные, отправленные напрямую в память (DMA), передаются для дальнейшей обработки на сетевой уровень в виде ‘skb’.
Если включено управление пакетами, или если в сетевой карте есть несколько очередей приёма, то фреймы входящих сетевых данных распределяются по нескольким CPU системы.
Фреймы сетевых данных передаются из очереди на уровни протоколов.
Уровни протоколов обрабатывают данные.
Данные добавляются в буферы приёма, прикреплённые к сокетам уровнями протоколов.
Исходя из задачи, например в лицензии можно было бы написать, что вам доступно 1 ядро на обработку, или 2, или все доступные ядра в системе. Ковырять сетевой стек тоже можно.
Точной конфигурации уже не осталось, могу в общем сказать, что это был линейно возрастающий tcp трафик до 60Гб/с c числом сессий до 20000.
Решениями с использованием DPDK так же занимались.
Смысл был в том, чтобы можно было выбрать точное количество ядер ЦПУ которые будут участвовать в обработке трафика (не в программе число потоков создавать, а на уровне железа). Для этого каждое из ядер подключается каждый к своей очереди пакетов. Чем больше задано очередей, тем больше DMA может переложить пакетов из сетевой карты по разным очередям (размер каждой очереди ограничен и может переполняться). Когда у тебя задана одна очередь, она будет обслуживаться одним ядром, соответственно эта очередь будет быстрее переполняться, тем самым будет увеличиваться число отброшенных пакетов (что можно видеть по снятым показателям). Увеличивая число очередей, ты увеличиваешь объем памяти куда могут записываться пакеты из карты, а так же число ядер которые параллельно из этих очередей будут вычитывать.
Высокоуровневый путь, по которому проходит пакет от прибытия до приёмного буфера сокета выглядит так:
Драйвер загружается и инициализируется.
Пакет прибывает из сети в сетевую карту.
Пакет копируется (посредством DMA) в кольцевой буфер памяти ядра.
Генерируется аппаратное прерывание, чтобы система узнала о появлении пакета в памяти.
Драйвер вызывает NAPI, чтобы начать цикл опроса (poll loop), если он ещё не начат.
На каждом CPU системы работают процессы ksoftirqd. Они регистрируются во время загрузки. Эти процессы вытаскивают пакеты из кольцевого буфера с помощью вызова NAPI-функции poll, зарегистрированной драйвером устройства во время инициализации.
Очищаются (unmapped) те области памяти в кольцевом буфере, в которые были записаны сетевые данные.
Данные, отправленные напрямую в память (DMA), передаются для дальнейшей обработки на сетевой уровень в виде ‘skb’.
Если включено управление пакетами, или если в сетевой карте есть несколько очередей приёма, то фреймы входящих сетевых данных распределяются по нескольким CPU системы.
Фреймы сетевых данных передаются из очереди на уровни протоколов.
Уровни протоколов обрабатывают данные.
Данные добавляются в буферы приёма, прикреплённые к сокетам уровнями протоколов.
Исходя из задачи, например в лицензии можно было бы написать, что вам доступно 1 ядро на обработку, или 2, или все доступные ядра в системе. Ковырять сетевой стек тоже можно.