我有一个简单的客户端<>服务器设置,其中客户端每秒向端口2000多次发送UDP数据包到服务器。服务器有一个线程,它具有一个在端口2000上侦听的开放BSD套接字,并使用阻塞recvfrom
调用读取数据。而已。我在服务器的recvfrom
调用中设置了一个简单的tic toc计时器,并在通过Wifi运行时绘制了结果。安静期后的WiFi滞后峰值
当服务器连接通过WiFi接入点,它在类似通常recvfrom的调用也采取0.015秒。然而,在没有数据包发送的短时间的无线电静默之后(大约半秒),服务器上的下一个数据包将导致recvfrom呼叫需要很长时间(在0.6到3秒之间),然后是一连串非常快速的通话(约0.000005秒),然后恢复正常(约0.015秒)。以下是一些示例数据:
0.017361 <--normal
0.014914
0.015633
0.015867
0.015621
... <-- radio silence
1.168011 <-- spike after period of radio silence
0.000010 <-- bunch of really fast recvfrom calls
0.000005
0.000006
0.000005
0.000006
0.000006
0.000005
0.015950 <-- back to normal
0.015968
0.015915
0.015646
如果仔细观察,您可以在图表中注意到这一点。
当我通过LAN(即使用电缆)将服务器连接到接入点时,一切正常,并且recvfrom调用总是需要大约0.015秒。但通过Wifi,我得到了这些疯狂的尖峰。
这到底是怎么回事?
P.S.服务器运行的是Mac OS X,客户端是通过Wifi连接到接入点的iPhone。我试着在iPad上运行客户端并获得相同的结果。该接入点是Apple Airport Extreme基站,其网络可通过Apple Airport Express进行扩展。我也尝试过使用Thompson路由器和简单的(非WDS网络),但仍然遇到同样的问题。
UPDATE
我在C#中改写了部分服务器在Windows .NET和测试它在无线上网的保持一切相同,问题就消失了。所以这表明它是Mac OS X上的OS /网络堆栈/套接字问题。
无线信道有多忙?这看起来像MAC层造成的突发流量 – KillianDS
你可以使用[Wireshark](http://www.wireshark.org/download.html)来看看吗? – CodeCaster
@KillianDS网络上有大约5个Wifi设备,但它们都很安静。 – lms