我正在尝试从非阻塞,无延迟的tcp客户端套接字读取高频数据。我在旋转循环中进行读取,基本上看起来像这样:
while(true)
{
r = recv(socket,some_buffer,20000);
if (r > 0)
{
cout << calculate_delay() << endl;
}
}
这个线程单独在一个专用的核心上运行,而整个操作系统(在我的情况下是centos)在核心0上运行。所以没有任何东西可以干扰我的读取循环。我还使用带有openonload驱动程序的内核旁路网络板(solarflare)在读取网络数据时完全绕过内核。数据来自一个服务器,该服务器以恒定的500usec延迟线与我交叉连接。我的问题是,0.1%的时间里calculate_delay()返回10,15,100ms的延迟,这是荒谬和巨大的。为什么会发生这种情况?
服务器发送250bytes数据包,有时在1毫秒内发送5-10条消息。我还注意到我可以在接收套接字上同时接收500,1000,2000 ...字节的缓冲数据。 如果我在没有延迟的自旋循环中读取,为什么这种缓冲甚至会发生呢?
谢谢