【发布时间】:2013-12-11 16:02:47
【问题描述】:
客户端发送消息。服务器读取消息并写入回复。客户阅读回复。重复。每条消息短于 500 字节。套接字未关闭。
我在 LAN 上的两台台式电脑之间每秒收到大约 800 个请求+响应。主机上的网络活动几乎不引人注意。
如果我不做readReply(或在单独的线程中做),整个过程会爆炸到 30.000 msg/sec 或更多!这也会使主机上的网络活动达到峰值。
我的问题:
对于单个套接字上的请求/响应协议来说,800 msg/sec 是一个合理的数字吗?
删除 readReply 调用如何提高性能???
除了使用 UDP 之外,还可以做些什么来改善这一点? 还有其他可能使用的协议吗?
服务器:
while (true) {
message = readMessage();
writeReply("Thanks");
}
客户:
while (true) {
writeMessage("A message");
reply = readReply();
}
注意事项:
- 我在 Java 和 Php 中都实现了这一点,并得到了大致相同的结果。
- Ping 延迟
【问题讨论】:
-
一个建议 - 在套接字上阻塞等待。如果 readReply() 必须等待对方“唤醒 - 停止阻塞”然后读取套接字然后发送回复,那么 readReply() 就会阻塞,除了消耗时间直到回复出现,什么都不做。等待时间取决于双方量子切片的持续时间以及 cpu 执行其他进程的繁忙程度。
-
每秒 800 条消息(实际上是 1600 条,因为你是双向的)如果你的 ping 时间大约为 1 毫秒,你可以获得的最大值大约是。使用 UDP 对您没有帮助,因为数据包在 TCP/UDP/IP 堆栈上上下传输的时间比在网络上花费的时间长得多。如果您想提高性能,请实现一些滑动窗口协议:发送者在等待第一个回复之前最多发送 20 条消息。
-
@jimmcnamara '等待是双方量子切片持续时间的函数',仅当双方都超载时,即。拥有比核心更多的就绪线程。由于网络延迟以及很可能是 nagle 算法,OP 糟糕的性能为 99.99%。
-
您可以通过管道传输您的请求吗?客户端在发送请求 2 之前是否必须等待服务器对请求 1 的回复?
标签: java performance sockets network-protocols