【发布时间】:2012-12-05 21:39:57
【问题描述】:
我编写了一个简单的 tcp 服务器应用程序,其中用于读取的 fd_set 包括连接套接字描述符。服务器应用程序只要接收到消息,就简单地发送一个 ACK。客户端应用程序仅在收到来自服务器的 ACK 后才发送下一条消息。
// timeval == NULL
select(maxfd, &read_set, NULL, NULL, NULL)
当我这样做时,性能约为 3K 消息/秒。发送 ack 和收到客户端响应之间的延迟为 0.3ms。
// tm.tv_sec=0 and tm.tv_usec=0
select(maxfd, &read_set, NULL, NULL, tm)
但如果我这样做,性能会达到 8K 消息/秒,延迟会下降到 0.18 毫秒。
在后一种情况下,选择变成投票。有人可以解释为什么后一种情况比第一种情况好得多吗?
【问题讨论】:
-
如果您担心延迟,请查看epoll。至于差异,它们是否一致?也许您可以阅读 libc/kernel 源代码以了解它的不同之处。
-
就像工程中的所有事情一样,这是一种权衡。从系统的角度来看,“select (..., NULL)”在几乎所有情况下都是明显的胜利:它迅速响应;它不会占用系统资源。但是,在您的情况下,“选择(...,tm = 0)”表现更好。为什么? 1) 因为你有一个连续的网络流量流,并且 2) 你只关心响应网络。