c - 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_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是否仍然有效?
解决方案
推荐阅读
- php - 无法在 Linux 服务器上使用 PHP 写入文件
- office-js - 如何使用 getTextRanges 分隔段落
- r - .r 文件扩展名的大小限制是多少?
- sql - 根据多列分组查找最近更新的行
- python - 在函数调用上使用 tqdm 进度条
- r - 如何在r中将数据类型因子转换为double?
- javascript - 如何在 Highcharts 中按状态和图表对 SharePoint 项目的数量进行分组?
- php - Ajax 没有将我重定向到下一页
- python-3.x - 神经网络批量标准化中 Gamma 和 Beta 的初始化
- sql - ilike "%s%" 查询中的 SQL 排序顺序