Sto eseguendo ripetute chiamate send/recv su socket TCP in Ruby, e ho trovato differenze significative di velocità tra due usi socket semplicemente messo, riutilizzare un socket sta dimostrando più lento di chiusura continua e ri -apire uno.Ruby caratteristiche prestazioni socket
Il server è quindi:
s = TCPServer.new(4545)
while(c = s.accept)
while(m = c.gets)
c.puts(m.chomp)
end
end
s.close
riecheggia semplicemente la richiesta al client.
client 1 riconnette ogni volta:
t1 = Time.now
1000.times{
s = TCPSocket.new('127.0.0.1', 4545)
s.puts('test')
s.gets
s.close
}
puts "Reconnecting: #{Time.now - t1}s"
client 2 trattiene il socket aperto:
t1 = Time.now
s = TCPSocket.new('127.0.0.1', 4545)
s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) #Nagle
1000.times{
s.puts('test')
s.gets
}
s.close
puts "Persistent: #{Time.now - t1}s"
Il risultato dell'esecuzione di questo codice è la seguente:
% ruby test_client.rb
Reconnecting: 0.233751849s
Persistent (w/Nagle): 79.925120196s
Persistent (NODELAY): 39.958955967s
E ' mi rendo conto che riutilizzare una presa dovrebbe farmi risparmiare tempo (non durare più di 347 volte!). Ho provato a chiamare IO#flush
dopo aver scritto alle prese, ma questo non fa differenza. Disabilitare l'algoritmo di Nagle aiuta in una certa misura, ma non abbastanza vicino.
Che cosa causerebbe il codice sopra (in esecuzione su Linux 3.8.5 e ruby 2.0.0) da eseguire con una così grande discrepanza di velocità e come posso correggerlo?
bella spiegazione perché nagle è lento [via] (http://alouche.net/2009/10/29/the-nagles-algorithm-and-tcp-throughput/) – dakull