0

私は 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 を使用しています。

4

1 に答える 1