监控缓慢的 nginx/unicorn 请求

监控缓慢的 nginx/unicorn 请求

我目前正在使用 Nginx 将请求代理到独角兽服务器运行西纳特拉应用程序。该应用程序仅定义了几个路由,这些路由对 PostgreSQL 数据库进行相当简单(非成本高昂)的查询,并最终以 JSON 格式返回数据,这些服务由上帝

我目前发现该应用服务器的响应时间非常慢。我还有另外两台通过 Nginx 代理的 Unicorn 服务器,它们的响应非常正常,所以我认为我可以排除 Nginx 的任何错误。

这是我的上帝配置:

# God configuration

APP_ROOT = File.expand_path '../', File.dirname(__FILE__)

God.watch do |w|
  w.name = "app_name"
  w.interval = 30.seconds # default

  w.start = "cd #{APP_ROOT} && unicorn -c #{APP_ROOT}/config/unicorn.rb -D"

  # -QUIT = graceful shutdown, waits for workers to finish their current request before finishing
  w.stop = "kill -QUIT `cat #{APP_ROOT}/tmp/unicorn.pid`"

  w.restart = "kill -USR2 `cat #{APP_ROOT}/tmp/unicorn.pid`"

  w.start_grace = 10.seconds
  w.restart_grace = 10.seconds
  w.pid_file = "#{APP_ROOT}/tmp/unicorn.pid"

  # User under which to run the process
  w.uid = 'web'
  w.gid = 'web'

  # Cleanup the pid file (this is needed for processes running as a daemon)
  w.behavior(:clean_pid_file)

  # Conditions under which to start the process
  w.start_if do |start|
    start.condition(:process_running) do |c|
      c.interval = 5.seconds
      c.running = false
    end
  end

  # Conditions under which to restart the process
  w.restart_if do |restart|
    restart.condition(:memory_usage) do |c|
      c.above = 150.megabytes
      c.times = [3, 5] # 3 out of 5 intervals
    end

    restart.condition(:cpu_usage) do |c|
      c.above = 50.percent
      c.times = 5
    end
  end

  w.lifecycle do |on|
    on.condition(:flapping) do |c|
      c.to_state = [:start, :restart]
      c.times = 5
      c.within = 5.minute
      c.transition = :unmonitored
      c.retry_in = 10.minutes
      c.retry_times = 5
      c.retry_within = 2.hours
    end
  end
end

这是我的 Unicorn 配置:

# Unicorn configuration file

APP_ROOT = File.expand_path '../', File.dirname(__FILE__)

worker_processes 8

preload_app true

pid "#{APP_ROOT}/tmp/unicorn.pid"

listen 8001

stderr_path "#{APP_ROOT}/log/unicorn.stderr.log"
stdout_path "#{APP_ROOT}/log/unicorn.stdout.log"

before_fork do |server, worker|
  old_pid = "#{APP_ROOT}/tmp/unicorn.pid.oldbin"

  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end
end

我检查了上帝状态日志,但似乎 CPU 和内存使用率绝不超出范围。我还有一些可以杀死高内存工作者的方法,可以在 GitHub 博客页面上找到这里

tail -f当在 Unicorn 日志上运行时,我看到一些请求,但请求很少,当我每秒大约有 60-100 个请求时,似乎出现了问题。此日志还显示工人正在收割并按预期启动。

所以我的问题是,我该如何调试它?我接下来应该采取什么步骤?我非常困惑,服务器有时会快速响应,但有时它会在很长一段时间内(可能是也可能不是高峰流量时间)非常慢。

任何建议都将不胜感激。

答案1

我会先用以下工具查看总体系统运行状况在顶上。接下来,我将仔细研究postgres 正在做什么如果这不能发现问题,我会使用 tcpdump(或者更好的沙克)来查看浏览器、ngnix 和 unicorn 之间的通信。与此同时,我会尝试斯特拉斯在 nginx 和 unicorn 上。

相关内容