【发布时间】:2012-11-12 13:01:57
【问题描述】:
我们有一个应用程序,我们通过 TCP 套接字发送数据。为此,我们使用 8 个 TCP 连接。套接字发送和接收在后台线程中调用。只有一个线程遍历套接字数组以通过所有套接字发送数据(顺序)。
发送者线程中的代码类似于:
for(i = 0; i < 8; i++) {
nBytesWrriten = send (tcpsock[i], data2, nleft, 0))
//error handling and process more data
}
接收线程是这样的:
for(i = 0; i < 8; i++) {
sz[i] = recv (tcpsock[i], data, MAX_UDT_SIZE, 0);
//process data
}
一切正常,数据已传输,但有时需要的时间太长。 在检查日志时,我发现在大多数情况下,发送者线程工作得很好,但有时,在“发送”调用之前和之后的时间戳会有很大的延迟(有时超过一秒)。
所有发送和接收操作都在工作线程中进行。这与在发送调用之前/期间抢占线程有关吗?我可以避免在发送调用之前抢占线程吗?或者是接收线程在发送准备好更多数据的同时还没有收到套接字上的数据,因此导致延迟?
由于发送数据花费的时间太长,我该如何优化?
谢谢
【问题讨论】:
-
您可以使用Wireshark 之类的工具来检查是否存在比您的应用程序更低级别的延迟。
-
您的套接字是否无阻塞 (
O_NONBLOCK)?如果没有,send()调用将不会返回,直到所有数据都被本地 TCP 堆栈接受(这仅与线路上的内容有些相关,可能是即时的,也可能需要一些时间)。包括一个 wireshark/tcpdump 跟踪可能会有所帮助。