2016-11-19 24 views
0

我現在有一個問題,並會很高興與任何想法人可能有。來自運動鞋工作人員的Rails網絡電話極其緩慢

問題:在運動鞋工作人員中運行時,網絡調用非常慢(Redis,HTTP)。例如,在redis中設置密鑰需要約20秒,而HTTP獲取約38秒。從rails c開始,同樣的redis調用需要1秒鐘的時間,而HTTP調用則需要1秒鐘的時間。

設置:將盡可能簡潔,因爲我可以在這裏。

  • 一切都在泊塢運行(滑軌+工人,Redis的,Postgres的等)
  • 的Rails 4.2.7是主要的Web應用程序,使用作爲PUMA作爲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內查詢,但是需要30秒才能呈現爲JSON和傳輸(爲什麼它如此緩慢是與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