【问题标题】:Reading from TCPSocket is slow in Ruby / Rails在 Ruby / Rails 中从 TCPSocket 读取速度很慢
【发布时间】:2009-09-01 06:50:04
【问题描述】:

我有一段简单的代码写入套接字,然后从服务器读取响应。服务器非常快(每次在 5 毫秒内响应)。然而,虽然写入套接字很快——从套接字读取响应总是慢得多。有什么线索吗?

module UriTester
  module UriInfo
    class << self
      def send_receive(socket, xml)
#        socket = TCPSocket.open("service.server.com","2316")
        begin
        start = Time.now
          socket.print(xml)           # Send request
        puts "just printed the xml into socket #{Time.now - start}"
        rescue Errno::ECONNRESET
        puts "looks like there is an issue!!!"
          socket = TCPSocket.open("service.server.com","2316")
          socket.print(xml)           # Send request
        end
        response=""
        while (line =socket.recv(1024))
          response += line
          break unless line.grep(/<\/bcap>/).empty?
        end
        puts "SEND_RECEIVE COMPLETED. IN #{Time.now - start}"
#        socket.close
        response
      end
    end
  end
end

谢谢!

【问题讨论】:

  • 您实际尝试测量的是什么以及为什么?

标签: ruby-on-rails optimization tcp network-programming


【解决方案1】:

在这种情况下,写入套接字总是比读取快得多,因为写入是机器本地的,读取必须等待来自网络的响应。

更详细地说,当对write / send 的调用返回时,系统会告诉您N 个字节已成功复制到套接字内核空间缓冲区。这并不意味着数据实际上已经通过网络发送。事实上,数据可以在套接字缓冲区中存放很长时间(假设您使用的是 TCP)。这是因为称为Nagle algorithm 的东西旨在有效利用网络带宽。这种看不见的 Nagle 延迟会增加往返时间以及您获得响应的时间。出于同样的原因,服务器也可能会延迟其响应,从而增加响应时间。

因此,当您确定写入时间并且它快速返回时,这实际上并没有任何用处。

如前所述,从套接字读取的时间会更长,因为当您为读取计时时实际上是在计时往返行程时间加上服务器响应时间,这总是比复制所需的时间慢得多从用户空间程序到内核缓冲区的数据。

您实际上要测量的是什么?为什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多