我的 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
分配(没问题,因为我有 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是否仍然有效?