AF_XDP: связь между `FRAME_SIZE` и фактическим размером пакета - PullRequest
0 голосов
/ 04 марта 2020

Моя программа пользовательского пространства 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 все еще действительна?

...