【发布时间】:2022-01-19 14:31:55
【问题描述】:
我有一个 dpdk 19 应用程序,并从 nic(MT27800 Family [ConnectX-5] 100G) 中读取 32 rx multiqueue with RSS。
所以有 32 个进程使用 dpdk 从 nic 接收流量,每个进程从不同的队列读取,从 mbuf 复制数据到分配的内存,累积到 6MB 并通过无锁队列将其发送到另一个线程,其他线程只将数据写入磁盘。因此 I/O 写入缓存在 linux 内存中。
所有进程都以cpu亲和力运行,grub中有isolcpus
这是从队列中读取的 32 个进程中每个进程发生的一些伪代码,我不能放真正的代码,太多了
MainFunction()
{
char * local_buf = new...
int nBufs = rte_eth_rx_burst(pi_nPort, pi_nQNumber, m_mbufs, 216);
for(mbuf in m_mbufs)
{
memcpy(local_buf+offset, GetData(mbuf),len);//accumulate to buf
if(local_buf.len > MAX)
{
PushToQueue(local_buf);
local_buf = new ...
}
rte_pktmbuf_free(mbuf);
}
}
WriterThreadMainFunc
{
While(QueueNotEmpty)
{
buf = PullFromQ
WriteToDisk(buf)
delete buf;
}
}
当服务器内存完全缓存时(我知道它仍然可用),我开始看到 nic 出现下降。
如果我每分钟从磁盘中删除数据,缓存的内存就会被释放,并且 nic 不会丢失。因此,水滴显然与缓存的数据相关联。在第一次下降之前,应用程序可以在没有下降的情况下运行 2 小时。该进程不使用太多内存,每个进程为 500 MB。
我怎样才能避免在 nic 跌落?
total used free shared buff/cache available
Mem: 125G 77G 325M 29M 47G 47G
Swap: 8.0G 256K 8.0G
我使用 Centos 9.7 linux 3.10.0-1160.49.1.el7.x86_64。
【问题讨论】:
-
请添加代码 sn-p 以更好地了解应用程序和线程模型。也不清楚来自 NIC 的 rx_burst 是否会跟进写入磁盘中的数据。也请阅读如何提出好问题
-
@VipinVarghese 我更新了问题,希望现在很清楚。对不起,我不能把完整的代码放在这里
-
@davidboo 所描述的问题是由于磁盘内容未定期刷新而是由 vfs 保留页面 (4KB)。这会导致你的记忆力下降。 DPDK 使用大页面(在 x86 2MB 和 1GB 上)我谦虚地请求修复写入磁盘的问题(这不是 DPDK 问题)。
-
@VipinVarghese 我不明白这个提议,它在第一次下降前 2 小时运行。可用内存为 47 G。我需要做哪些不同的事情?
-
@davidboo 我没有提出任何建议。我指出了为什么你的
disk content not flushed periodically but held page (4KB) by vfs,因为你正在写入磁盘,所以你能帮我改一下你的问题吗?