6

Rubyが提供する最速のロガーを見つけたいです。私の直感によると、このレースではsyslogが勝つでしょう。しかし、私の直感は間違っているようです。Syslogは、私がテストした3つのロガーの中で最も遅いことがわかりました。MacBook Pro、OSX 10.6(Snow Leopard)、Intel Core2 Duo、4GBのRAM、MacPortsから構築されたRuby1.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 |

Syslogには「hello#{i}」という単純な形式しか使用していないことに注意してください(理論的にはこれはさらに高速になるはずですが、そうではありません)。また、私のMacのデフォルトのsyslogdには、制限されたメッセージクォータ(500 /秒)があるようです。次のメッセージがsyslogで時々生成されます。

*** process 1962 exceeded 500 log message per second limit  -  remaining messages this second discarded ***
4

4 に答える 4

3

わかりました。スクリプトを更新して log4r を含めました。これは、非常に多くのさまざまな機能をサポートしているため、私の好みです。(ローリングログ、イェーイ!)

また、バッファリングされたロガーに .flush を含め、テスト時間を短縮して、永遠にかからないようにしました。log4r は、バッファ付きロガーよりわずかに遅いだけでした。それが私の選択です。

# loggers_bench.rb

require 'rbench'

require 'active_support'
require 'stringio'
buffered = ActiveSupport::BufferedLogger.new('buffered.log')
require 'logger'
logger   = Logger.new('logger.log')
require 'syslog'
syslog   = Syslog.open('rb_syslog')
require 'log4r'
log4r = Log4r::Logger.new 'mylog'
log4r.outputters = Log4r::FileOutputter.new('log', :filename => 'log4r.log')

TIMES = 5_000

RBench.run(TIMES) do
  column :syslog,    :title => 'Syslog'
  column :logger,    :title => 'Logger'
  column :buffered,  :title => 'ActiveSuppoort::BufferedLogger'
  column :log4r,     :title => 'log4r'


  report '#info' do
    syslog {
      10.times do |i|
        syslog.info "hello #{i}"
      end
    }

    logger {
      10.times do |i|
        logger.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
    }

    buffered {
      10.times do |i|
        buffered.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
      buffered.flush
    }

    log4r {
      10.times do |i|
        log4r.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
    }
  end
end
#                Syslog |  Logger | ActiveSuppoort::BufferedLogger |   log4r |
# ----------------------------------------------------------------------------
# #info           2.377 |   2.040 |                          1.425 |   1.532 |
于 2011-03-22T18:42:48.247 に答える
2

の名前の最初の部分は、BufferedLogger受信するとすぐにメッセージを書き込むと予想される他の 2 つと比較して、その速度を説明していると思います。

トレードオフは、ストア内のフラッシュされていないメッセージによる大規模なクラッシュに起因するログ情報の損失の可能性に対する、IO 負荷の削減によるバッファリングされたオブジェクトのスループットの向上です。

すべてのメッセージ セキュリティを失うことなく、複雑さを増してスループットを向上させるために、2 つの形式を組み合わせることができるのではないかと考えています。時折の損失は痛みを引き起こしません) と、法的または診断目的で単に保持しなければならないメッセージ用に選択した、バッファリングされていないものです。

必須のメッセージの量が、便利なメッセージに比べて比較的少ない場合 (そうあるべきか、このアプローチがおそらく不必要に複雑である場合)、どの非バッファ型ロガーを使用するかはあまり重要ではありません。

于 2009-09-09T10:40:55.470 に答える
0

また、ロギング(http://github.com/TwP/logging)フレームワークも確認する必要があります。log4rおよびコアrubyloggerとの比較を行うために確認できるベンチマーク(https://github.com/TwP/logging/blob/master/test/benchmark.rb)ファイルがあります。

于 2012-07-25T23:08:29.080 に答える
0

syslog-ng で試した結果は次のとおりです。

TIMES: 50
user system total real
SYSLOG 0.000000 0.000000 0.000000 ( 0.006187)
LOGGER 0.000000 0.010000 0.010000 ( 0.003698)
BUFFERED 0.000000 0.000000 0.000003 ( 0 9.000000)

bufferred ロガーの方が優れているようです。

于 2010-07-06T08:40:00.403 に答える