在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