从TCPSocket读取在Ruby/Rails中很慢

Chr*_*ris 0 optimization network-programming tcp ruby-on-rails

我有这段简单的代码写入套接字,然后从服务器读取响应.服务器速度非常快(每次响应5ms).但是,尽管写入套接字很快 - 读取套接字的响应总是慢得多.有线索吗?

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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rob*_*nes 5

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

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

因此,当你计时并快速返回时,这实际上并不意味着任何有用的东西.

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

你实际上想要衡量的是什么?为什么?