Today I decided to explore network latency in SmartOS virtual machines. Using the rbczmq ruby gem for ZeroMQ, I made two very simple scripts: a server that replies “hello” and a benchmark script that times how long it takes to send and receive 5000 messages after establishing the connection.
The server code is:
require 'rbczmq'
ctx = ZMQ::Context.new
sock = ctx.socket ZMQ::REP
sock.bind("tcp://0.0.0.0:5555")
loop do
sock.recv
sock.send "reply"
end
The benchmark code is:
require 'rbczmq'
require 'benchmark'
ctx = ZMQ::Context.new
sock = ctx.socket ZMQ::REQ
sock.connect(ARGV[0])
# establish the connection
sock.send "hello"
sock.recv
# run 5000 cycles of send request, receive reply.
puts Benchmark.measure {
5000.times {
sock.send "hello"
sock.recv
}
}
The test machines are:
* Mac laptop – server & benchmarking
* SmartOS1 (SmartOS virtual machine/zone) server & benchmarking
* SmartOS2 (SmartOS virtual machine/zone) benchmarking
* Linux1 (Ubuntu Linux in KVM virtual machine) server & benchmarking
* Linux2 (Ubuntu Linux in KVM virtual machine) benchmarking
The results are:
Source Dest Connection Time Req-Rep/Sec
------ ---- ---------- ---- --------
Mac Linux1 1Gig Ethernet 5.038577 992.3
Mac SmartOS1 1Gig Ethernet 4.972102 1005.6
Linux2 Linux1 Virtual 1.696516 2947.2
SmartOS2 Linux1 Virtual 1.153557 4334.4
Linux2 SmartOS1 Virtual 0.952066 5251.8
Linux1 Linux1 localhost 0.836955 5974.0
Mac Mac localhost 0.781815 6395.4
SmartOS2 SmartOS1 Virtual 0.470290 10631.7
SmartOS1 SmartOS1 localhost 0.374373 13355.7
localhost tests use 127.0.0.1
SmartOS has an impressive network stack. Request-reply times from one SmartOS machine to another are over 3 times faster than when using Linux under KVM (on the same host). This mightn’t make much of a difference to web requests coming from slow mobile device connections, but if your web server is making many requests to internal services (database, cache, etc) this could make a noticeable difference.
Like this:
Like Loading...
Related