【发布时间】:2014-09-19 14:58:48
【问题描述】:
在 HFT 交易应用程序中,我需要从 udp 多播套接字接收数据。唯一的要求是延迟——这非常重要,以至于我可以“使用”一个 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 重写它并实现最佳延迟。我需要为每个线程处理一个套接字,所以我认为我不应该使用epoll,因为它更多地设计用于处理多个套接字。我应该使用什么?
更新我发现了类似的问题Low-latency read of UDP port
【问题讨论】:
-
不清楚为什么您认为阻塞的 recvfrom() 调用会很慢。确实,如果没有收到数据包,它不会在很长一段时间内返回,但是如果/当收到数据包时,它应该立即返回。您担心的是上下文切换开销吗?
-
顺便说一句,如果你想保证低延迟,你可以看看 Xenomai 的 Linux 实时扩展,因为这就是他们提供的。
-
@JeremyFriesner 阻止总是很昂贵,这就是人们“旋转”的原因
-
“阻塞总是很昂贵”
-
@JeremyFriesner 我认为这是因为当你阻止时,你会花时间“唤醒”,当你不阻止时,你会节省这段时间)