Моя программа пользовательского пространства AF-XDP основана на этом руководстве: https://github.com/xdp-project/xdp-tutorial/tree/master/advanced03-AF_XDP
В настоящее время я пытаюсь проанализировать ~ 360 000 RTP-пакетов в секунду (проверка непрерывных порядковых номеров) но я теряю около 25 в секунду (это означает, что для 25 пакетов оператор previous_rtp_sqnz_nmbr + 1 == current_rtp_sqnz_nmbr
не выполняется).
Поэтому я попытался увеличить количество распределенных пакетов NUM_FRAMES
с 228 000 до 328 000. По умолчанию FRAME_SIZE
из XSK_UMEM__DEFAULT_FRAME_SIZE = 4096
это приводит к выделению 1281Mbyte
(без проблем, потому что у меня 32 ГБ ОЗУ), но по какой-то причине этот вызов функции:
static struct xsk_umem_info *configure_xsk_umem(void *buffer, uint64_t size)
{
printf("Try to allocate %lu\n", size);
struct xsk_umem_info *umem;
int ret;
umem = calloc(1, sizeof(*umem));
if (!umem)
return NULL;
ret = xsk_umem__create(&umem->umem, buffer, size, &umem->fq, &umem->cq,
NULL);
if (ret) {
errno = -ret;
return NULL;
}
umem->buffer = buffer;
return umem;
}
завершается неудачно с
Try to allocate 1343488000
ERROR: Can't create umem "Cannot allocate memory"
Не знаю почему? Но поскольку я знаю, что мои RTP-пакеты не превышают 1500 байт, я установил FRAME_SIZE 3072
, поэтому теперь я нахожусь на отметке 960Mbyte
(что работает без ошибок).
Однако сейчас я теряю половину полученных пакетов (это означает, что для 180 000 пакетов предыдущий порядковый номер не совпадает с текущим порядковым номером).
В связи с этим я задаю вопрос: какова связь между FRAME_SIZE
и фактический размер пакета? Потому что, очевидно, это не может быть тем же самым.
Редактировать: я использую 5.4.0-4-amd64 #1 SMP Debian 5.4.19-1 (2020-02-13) x86_64 GNU/Linux
и просто скопировал сюда хранилище libbpf
в мою кодовую базу: https://github.com/libbpf/libbpf
Так что я не знаю, действительна ли упомянутая здесь ошибка: https://github.com/xdp-project/xdp-tutorial/issues/76 все еще действительна?