我有一个 dpdk 19 应用程序,并从 nic(MT27800 Family [ConnectX-5] 100G) 读取 32 rx multiqueue with RSS 。
所以有 32 个进程使用 dpdk 从 nic 接收流量,每个进程从不同的 Queue 读取,从 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。