在HFT交易應用程序中,我需要從udp多播套接字接收數據。唯一的要求是延遲 - 這非常重要,我可以「花費」一個CPU內核。無論旋轉或其他什麼都可以。這是我目前在Windows中:以最低的延遲從linux的多播套接字接收數據
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版本,並實現最佳的延遲。我需要每個線程只處理一個套接字,所以我認爲我不應該使用epoll
,因爲它設計了更多處理多個套接字。我應該使用什麼?
UPD我找到了類似的問題Low-latency read of UDP port
目前尚不清楚爲什麼你認爲阻塞recvfrom()調用會很慢。確實如果沒有收到數據包,它將不會長時間返回,但是如果/當收到數據包時它應該立即返回。您擔心的是上下文切換開銷嗎? – 2014-09-18 19:50:46
順便說一句,如果你想保證低延遲,你可以看看Xenomai的Linux實時擴展,因爲這是他們提供的。 – 2014-09-18 19:51:48
@JeremyFriesner阻止永遠是昂貴的,這就是爲什麼人們「旋轉」 – javapowered 2014-09-18 20:00:11