0

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);
    }
}
4

1 に答える 1

0

パケット損失の問題は、スイッチや NIC カードなどのハードウェアが原因でした。70 個の udp ソケットがあったため、パケット レートは実際には 2500 * 70 /秒です。現在のネットワーク トラフィックに関する情報の負荷を提供する Wireshark を呼び出すネットワーク監視ツールを強くお勧めします。

Demonソリューションに関しては、フックの下のBoost asioはwindowでiocpを使用し、unixではepollを使用します。

バッファサイズも調整する必要はありません。

于 2013-01-18T01:23:52.470 に答える