You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This influxdb client is not using persistent connections. This causes a
significant performance loss. Below is a benchmark script that writes a
single point to influxdb. Running it takes 44 seconds of time:
$ ruby -Ilib t.rb
Writing 1000 points
user system total real
write_points 19.270388 1.394931 20.665319 ( 44.622170)
This works out to a write speed of about 22 points per second, or about
50ms per point.
This is:
* Pretty slow. If you are generating points quickly maximum resolution
of 50ms is not great. A user may lose data because they cannot sample
quickly enough.
* Pretty inefficient. For each point written the client library must
establish a TCP connection, establish a TLS session, finally write
some data. Any data written may be restricted by the TCP slow-start
windowing algorithm.
Much more ruby code must be run, almost half the time spent is in the
"user" category, time that could be doing anything else in a ruby
application, or time that could be used by other processes.
This commit caches HTTP connections across requests. Running the same
benchmark takes 4.26 seconds:
$ ruby -Ilib t.rb
Writing 1000 points
user system total real
write_points 0.551663 0.084603 0.636266 ( 4.261201)
This works out to a speed of 234 points per second, or about 5ms per
point. Writing points now no longer need to recreate a TCP connection,
renegotiate a TLS session, or be held up by TCP window sizing
limitations.
This is much more efficient in terms of CPU time used per point, instead
of ~46% of time taken occurring in the "user" category, now only 13% of
time is in "user". The balance of the time is now spent waiting for IO
to complete.
Benchmark script:
require "benchmark"
require "influxdb"
n = Integer ENV["N"] rescue 1_000
influxdb =
InfluxDB::Client.new url: ENV["INFLUX_URL"],
username: ENV["INFLUX_USER"],
password: ENV["INFLUX_PASS"],
time_precision: "u"
def write_point counter, influxdb
points = [
{
series: "test",
values: {
counter: counter,
},
},
]
influxdb.write_points points
end
puts "Writing #{n} points"
Benchmark.bm 12 do |bm|
bm.report "write_points" do
n.times do |i|
write_point i, influxdb
end
end
end
0 commit comments