私は dpdk 19 アプリケーションを持っており、32 rx multiqueue with RSS を使用して nic(MT27800 Family [ConnectX-5] 100G) から読み取ります。
したがって、dpdk を使用して nic からトラフィックを受信する 32 のプロセスがあります。各プロセスは異なるキューから読み取り、データを 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 を使用しています。