Производительность WSARecvFrom с несколькими потоками

#sockets #winsock #serversocket #winsock2

Вопрос:

Я использую WSARecvFrom вызов для приема пакетов UDP на сервере UDP. Наблюдение таково: когда я использую несколько потоков, производительность WSARecvFrom ухудшается. Каковы факторы, связанные с потоковой передачей, которые влияют на производительность сокета и WSARecvFrom ? Каковы рекомендации по внедрению UDP-сервера, используемого WSASocket в случае высокой пропускной способности (~4000 пакетов в секунду).

Обновить

 Constructor(...)
{
    io = CreateThreadpoolIo(SocketHandle, IOCompletion, ...);
    for(i -> 0 to number_of_parallel_receives)
        ReceivePacket(...);
}

static void CALLBACK IOCompletion(...)
{
    ProcessPacket(...);
    IncrementCounter();
    ReceivePacket(...); // get next packet
}

void ReceivePacket(...)
{
    StartThreadpoolIo(io);
    WSARecvFrom(...); // callback routine is nullptr and handled with the ThreadPoolIO callback
}
 

Комментарии:

1. Как вы оцениваете производительность? Как выглядит ваш код?

2. Обновленный. Наблюдение состоит в том, что, когда я даже отключаю обработку, IOCompletion я все равно получаю меньше чисел в счетчике с большим WSAReceiveFrom количеством параллельных очередей.

3. Здесь действительно недостаточно информации или кода, чтобы ответить на этот вопрос, но… Попробуйте использовать IOCP вместо предупреждающего ввода-вывода? Для более позднего требуется, чтобы поток находился в «состоянии ожидания с возможностью оповещения» для доставки обратного вызова…