0

HFT 取引アプリケーションでは、udp マルチキャスト ソケットからデータを受信する必要があります。唯一の要件はレイテンシーです。これは非常に重要なので、1 つの CPU コアを「消費」することができます。ぐるぐる回しても大丈夫です。これは私が現在Windowsに持っているものです:

void Receiver::ThreadMethod() {
    //UINT32 seq;
    sockaddr_in Sender;
    int SenderAddrSize = sizeof(Sender);

    while (stayConnected) {
        int res=recvfrom(socketId,buf,sizeof(char) * RECEIVE_BUFFER_SIZE,0, (SOCKADDR *)& Sender, &SenderAddrSize);
        if (res == SOCKET_ERROR) {
            printf("recvfrom failed, WSAGetLastError: %d\n", WSAGetLastError());
            continue;
        }
        //seq = *(UINT32*)buf;
        //printf("%12s:seq=%6d:len=%4d\n", inet_ntoa(Sender.sin_addr), seq, res);
        unsigned char* buf2 = reinterpret_cast<unsigned char*>(buf);
        feed->ProcessMessage(res, buf2);
    }
}

recvfromブロックするため、非常に遅くなる可能性があります(または私が間違っていますか?)。これを Linux 用に書き直して、最高のレイテンシーを実現する必要があります。スレッドごとに 1 つのソケットだけを処理する必要があるため、epoll多くのソケットを処理するように設計されているため、使用しないでください。何を使えばいいですか?

upd同様の質問を見つけましたUDPポートの低遅延読み取り

4

1 に答える 1

0

UNIX ではfcntl、ソケットを非ブロッキングに設定するために使用する必要があります。

fcntl(socket, F_SETFL, O_NONBLOCK);

さらに、クライアントが複数のソケットを処理する必要がある場合 (たとえば、複数のフィードを集約するため)、select一度に複数のファイル記述子を処理するための呼び出しを使用し、使用可能なデータがある場合は、どのソケットにデータがあるかを確認する必要があります (これにより、とりわけ、何もせずにすべてのソケットをループします)

レイテンシーに関しては、NIC のタイプや構成、カーネル設定 (おそらくカーネルをバイパスする NIC を持つ) などの他の要因がレイテンシー (測定予定) にかなりの影響を与えます。

于 2014-09-18T19:43:34.480 に答える