2016-11-19 5 views
0

私は今、問題を抱えており、皆さんの考え方に非常に満足しています。Railsのネットワークコールはスニーカーの作業員から極端に遅い

問題:Sneakersワーカーで実行しているときにネットワークコールが非常に遅い(Redis、HTTP)。たとえば、キーを赤く設定すると約20秒かかり、HTTPは約38秒かかります。 rails cから同じredis呼び出しには、1秒間に<、HTTP呼び出しには約1秒かかります。

セットアップ:私はここで簡潔にしようとします。

  • すべては(Railsの+労働者、Redisの、Postgresの等。)
  • のRails 4.2.7ドッカーで実行されている2つの背景があり、Webサーバ
  • などとしてピューマを使用して、メインのWebアプリですスニーカーを介して処理され、RabbitMQメッセージを介してトリガーされるジョブ。これらの「ワーカー」には、ActiveRecordから継承した、実際のアクティビティを行うクラスへの呼び出しが含まれます(つまり、HTTP呼び出しを行うか、Redisと対話します)。
  • 私はWorkerクラス内でHTTP呼び出しを行い、 。また、デバッグのためにフォアグラウンドに移動しました。

Pumaは「シングル」モード(ワーカーなし、1スレッド)で実行するように設定されています。ここに私の現在のスニーカーの構成は次のとおりです。

# config/initializers/02_sneakers.rb 
    Sneakers.configure daemonize: false, 
         amqp: "amqp://rabbitmq", 
         # log: "log/sneakers.log", 
         log: STDOUT, 
         pid_path: "tmp/pids/sneakers.pid", 
         threads: 2, 
         workers: 1, 
         durable: true, 
         vhost: '/', 
         exchange: 'exchange', 
         exchange_type: 'direct' 

Sneakers.logger.level = Logger::DEBUG 

そして、私の労働者:

class StepWorker 
    include Sneakers::Worker 
    from_queue "queue", env: nil, timeout_job_after: 5.minutes, durable: true, ack: true 

    def work(raw_event) 
    logger.info { 'StepWorker received params: ' + raw_event } 
    message = JSON.parse(raw_event) 

    response = "" 
    time = Benchmark.measure { 
     response = RestClient.get('http://store/', { accept: :json }) 
    } 
    logger.info { "response: #{response.length} in #{time.real}" } 

    ack! 
    end 
end 

私もスニーカーに一部の人々と一緒に行くissueを持っています。どんなアイデアでも大歓迎です!

答えて

0

私は問題の原因につながり、スニーカーを排除する上記の質問には批判的な詳細を見逃しました。

ペイロードは〜10MBです。レールは約27msで照会できますが、JSONと転送としてレンダリングするのに30秒かかります(これはなぜconf/dockerに関連する別の問題です)。

Redisはペイロードサイズの結果としてタイムアウトします(ただし、10MBのスループットはそれほど遅くしないでください)。

タイミングの問題(再現できない)は、HTTPのテスト時にページ分割を無効にすることができなかったためです。ページングがなければ、サイズは10MBに達し、物事は崩れ始める。

ここでの答えは、問題はスニーカーに関連していないということですが、そのために根本的に複雑です。スニーカーを削除してコマンドを直接実行すると、はるかに良い出発点でした。

irb(main):002:0> time = Benchmark.measure { 
irb(main):003:1* response = RestClient.get('http://store?pagination=false', { accept: :json }) 
irb(main):004:1> } 
=> #<Benchmark::Tms:0x00555f80bd3708 @label="", @real=39.22218326000075, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.030000000000000027, @total=0.030000000000000027> 
irb(main):006:0> 
irb(main):007:0* time = Benchmark.measure { 
irb(main):008:1* StashService.set("cool", JSON.parse(response)) 
irb(main):009:1> } 
Redis::TimeoutError: Connection timed out 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/connection/ruby.rb:111:in `rescue in _write_to_socket' 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/connection/ruby.rb:104:in `_write_to_socket' 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/connection/ruby.rb:131:in `block in write' 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/connection/ruby.rb:130:in `loop' 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/connection/ruby.rb:130:in `write' 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/connection/ruby.rb:374:in `write' 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/client.rb:271:in `block in write' 
    from /usr/local/bundle/gems/redis-3.3.2/lib/redis/client.rb:250:in `io' 
... 
4.2.7/lib/rails/commands/commands_tasks.rb:68:in `console' 
    from /usr/local/bundle/gems/railties-4.2.7/lib/rails/commands/commands_tasks.rb:39:in `run_command!' 
    from /usr/local/bundle/gems/railties-4.2.7/lib/rails/commands.rb:17:in `<top (required)>' 
    from bin/rails:4:in `require' 
    from bin/rails:4:in `<main>' 
+0

別の情報を追加するだけです。 'development.rb'で次のように変更して、私のパフォーマンスの問題を解決しました:' config.assets.debug = false' – krsyoung

関連する問題