【问题标题】:How can I optimize simple socket communication?如何优化简单的套接字通信?
【发布时间】:2013-12-11 16:02:47
【问题描述】:

客户端发送消息。服务器读取消息并写入回复。客户阅读回复。重复。每条消息短于 500 字节。套接字未关闭。

我在 LAN 上的两台台式电脑之间每秒收到大约 800 个请求+响应。主机上的网络活动几乎不引人注意。

如果我不做readReply(或在单独的线程中做),整个过程会爆炸到 30.000 msg/sec 或更多!这也会使主机上的网络活动达到峰值。

我的问题:

  1. 对于单个套接字上的请求/响应协议来说,800 msg/sec 是一个合理的数字吗?

  2. 删除 readReply 调用如何提高性能???

  3. 除了使用 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


【解决方案1】:

基本问题是延迟:网络帧/数据包到达目的地所需的时间。

例如,1 毫秒的延迟将速度限制为最多 1000 帧/秒。 2 ms 的延迟可以处理 500 fps,10 ms 可以处理 100 fps 等等。

  1. 在这种情况下,当延迟为 0.5 毫秒时,预计管理 1600 fps (800*2)。

  2. 我认为这是因为您设法每帧发送更多数据。不过,它会在一段时间后填满客户端中的 TCP 缓冲区。

  3. 如果可能,批处理(管道)消息。从客户端批量发送10条消息,然后等待服务器回复。服务器也应该在一个块中发送所有 10 个回复。理论上这应该会使速度快 10 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    相关资源
    最近更新 更多