new*_*ple 6 ruby comparison benchmarking logging syslog
我想找到 Ruby 提供的最快的记录器。我的直觉告诉我 syslog 会在这场比赛中获胜。但我的直觉似乎是错误的。Syslog 是我测试过的三个记录器中最慢的。我使用的是我的 MacBook Pro、OSX 10.6 (Snow Leopard)、Intel Core2 Duo、4GB 内存和由 MacPorts 构建的 Ruby 1.8.7。难道我做错了什么?或者 Ruby 的 syslog 实现就是这么慢?如果结果与我的不同,请随时发布您的结果。也欢迎您将您最喜欢的 Ruby 记录器添加到基准测试中。我的目标是找到可用的最快的记录器。我只对纯性能(吞吐量)感兴趣。像多目标日志记录这样的功能在这里不是问题。
# loggers_bench.rb
require 'rbench'
require 'activesupport'
require 'syslog'
require 'logger'
buffered = ActiveSupport::BufferedLogger.new('buffered.log')
logger = Logger.new('logger.log')
syslog = Syslog.open('rb_syslog')
TIMES = 10_000
RBench.run(TIMES) do
column :syslog, :title => 'Syslog'
column :logger, :title => 'Logger'
column :buffered, :title => 'ActiveSuppoort::BufferedLogger'
report '#info' do
syslog {
300.times do |i|
syslog.info "hello #{i}"
end
}
logger {
300.times do |i|
logger.info "#{Time.now} logging_logger[Process.pid]: INFO logging_logger : hello #{i}"
end
}
buffered {
300.times do |i|
buffered.info "#{Time.now} logging_logger[Process.pid]: INFO logging_logger : hello #{i}"
end
}
end
end
# > RUBYOPT=rubygems ruby loggers_bench.rb
# Syslog | Logger | ActiveSuppoort::BufferedLogger|
# -----------------------------------------------------------------
# #info 158.316 | 117.882 | 98.707 |
Run Code Online (Sandbox Code Playgroud)
请注意,对于 Syslog,我只使用了更简单的形式:“hello #{i}”(理论上这应该更快,但事实并非如此)。此外,我的 Mac 的默认 syslogd 似乎有一个有限的消息配额(500/秒)。系统日志中不时生成以下消息:
*** process 1962 exceeded 500 log message per second limit - remaining messages this second discarded ***
Run Code Online (Sandbox Code Playgroud)
我猜BufferedLogger名称的第一部分解释了它的速度,与其他两个部分相比,我希望在收到消息后立即写入消息。
权衡是缓冲对象吞吐量的提高和 IO 负载的减少,以及存储中未刷新消息的大规模崩溃可能导致的日志信息丢失。
我想知道,为了在不损失所有消息安全性的情况下增加吞吐量并以增加复杂性为代价,是否可以将两种形式结合起来:使用缓冲记录器来获取有用但不需要 100.0000% 完整的信息(即小信息)偶尔的丢失不会造成痛苦),以及您为法律或诊断目的而必须拥有的消息选择的非缓冲消息之一。
如果与“锦上添花”相比,必备消息的数量相对较低(而且应该如此,或者这种方法可能不必要地复杂),那么您使用哪种非缓冲记录器并不重要。