c ++を使用したLinuxで、ブーストasioを使用して約30のマルチケースIPからマルチケースメッセージを受信するプログラムを作成しています。私は、実行時にクライアント側からのパケット ドロップを最小限に抑える方法の進歩を求めるためにここにいます。すでに NIC 受信バッファを最大化しています。8コアのCPUを使用しています。また、NIC カードは、プログラム内のソケットの数と同じ数のバッファ キューを作成するのでしょうか? NIC カードを構成する以外に、Linux カーネルで何かできることはありますか? カーネルは、プログラムが NIC からデータをコピーする前に、最初に NIC からバッファ コピーを行うと思いますよね?
template<typename msg, int id>
void data_service<msg, id>::on_rt_recv( char* p_raw_packet, int p_length, const boost::system::error_code& error )
{
if (!error)
{
//post to strand and wait to proceed
processing_strand_.post(boost::bind(&data_service::on_rt_recv_handler, this,
p_raw_packet,
p_length));
//continue to listen as soon as possible
auto new_buffer = get_new_buffer();
rt_socket_[p_line]->async_receive_from(boost::asio::buffer(new_buffer, BUFFER_SIZE_), rt_endpoint_,
boost::bind(&data_service::on_rt_recv, this,
new_buffer,
boost::asio::placeholders::bytes_transferred,
boost::asio::placeholders::error));
}
else if (error != boost::asio::error::operation_aborted)
{
memory_pool_.free((void*)p_raw_packet);
}
}