Я пишу программу, использующую Boost Asio для получения многокаскадных сообщений от около 30 многоадресных IP-адресов в Linux с C ++. Я здесь для того, чтобы узнать, как минимизировать потери пакетов со стороны клиента во время выполнения. Я уже максимизировал приемный буфер NIC. Я использую 8-ядерный процессор. Мне также интересно, будет ли карта NIC создавать такое же количество очереди в буфере, которое равно числу сокетов в программе? Помимо настройки карты NIC, могу ли я что-то сделать на ядре Linux? Так как я считаю, что ядро будет делать буферное копирование с 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);
}
}
Проблема потери пакетов была вызвана аппаратным обеспечением, включая коммутатор и карты NIC. скорость передачи пакетов на самом деле составляет 2500 * 70 / сек, потому что было 70 сокетов udp. Настоятельно рекомендуем использовать инструмент мониторинга сети Wireshark, который предоставляет информацию о вашем текущем сетевом трафике.
Что касается решения Demon, Boost asio под хуком использует iocp в окне, а epoll в unix.
Нет необходимости настраивать размер буфера.
Других решений пока нет …