首页 > 解决方案 > AF_XDP: `FRAME_SIZE` 和数据包实际大小的关系

问题描述

我的 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_SIZEXSK_UMEM__DEFAULT_FRAME_SIZE = 4096导致1281Mbyte分配(没问题,因为我有 32GB 的 RAM),但无论出于何种原因,此函数调用:

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-repository 从这里复制到我的代码库中:https ://github.com/libbpf/libbpf

所以不知道这里提到的错误:https ://github.com/xdp-project/xdp-tutorial/issues/76是否仍然有效?

标签: clinuxsocketsbpfxdp-bpf

解决方案


推荐阅读