2013-05-27 19 views
8

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?

risposta

7

Disabilitare l'algoritmo di Nagle su entrambe le correzioni prese client e server: questa

s = TCPServer.new(4545) 
while(c = s.accept) 
    c.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) 
    while(m = c.gets) 
    c.puts(m.chomp) 
    end 
end 
s.close 

conseguente:

% ruby test_client.rb 
Reconnect: 0.189858182s 
Persistent: 0.030973398s 

Spero che questo aiuti qualcuno.

+0

bella spiegazione perché nagle è lento [via] (http://alouche.net/2009/10/29/the-nagles-algorithm-and-tcp-throughput/) – dakull