【问题标题】:How to get a stack trace on all running ruby threads on passenger如何在乘客上所有正在运行的 ruby​​ 线程上获取堆栈跟踪
【发布时间】:2011-06-18 22:40:21
【问题描述】:

我有一个在 nginx/passenger 上运行的生产 ruby​​ sinatra 应用程序,我经常看到请求莫名其妙地停滞不前。我编写了一个脚本,每十秒调用一次我的机器集群上的乘客状态,并将结果绘制在图表上。这是我看到的:

蓝线显示全局队列等待不断飙升至 60。这是 4 台机器的平均值,所以当蓝线达到 60 时,意味着每台机器都已满员。我将当前的 Passenger_max_pool_size 设置为 20,因此它达到了最大池大小的 3 倍,然后可能会丢弃后续请求。

我的应用程序依赖于两个关键的外部资源——一个 Amazon RDS mysql 后端和一个 Redis 实例。也许其中之一是周期性地变得缓慢或反应迟钝,从而导致这种行为?

谁能告诉我如何获取堆栈跟踪以查看这里的瓶颈是 Amazon RDS、Redis 还是其他东西?

谢谢!

【问题讨论】:

    标签: ruby redis passenger


    【解决方案1】:

    我想通了——我在 Redis 中有一个 SAVE 配置参数,它每分钟触发一次。显然,redis 的分叉/保存操作阻碍了我的应用程序。我将配置参数更改为“3600 1”,这意味着我每小时只保存一次数据库,这没关系,因为我将它用作缓存(数据保存在 MYSQL 中)。

    【讨论】:

    • 我能知道等了多长时间吗? AFAIK,自动保存应该在后台,并且应该只在复制内存页面时延迟,应该是 300 毫秒。
    • 根据经验,我的 redis 节点似乎会阻塞几秒钟,我会说我在任何给定的 60 秒内看到大约 5 -10 秒的阻塞。我将尝试启动一个奴隶并使用奴隶来保存。
    【解决方案2】:

    要回答您最初的问题,可以获得乘客正在引导的正在运行的 ruby​​ 进程的“所有堆栈跟踪”。基本上向每个人发送 SIGQUIT 消息,他们会将所有回溯吐出到 apache/nginx 日志文件中,例如:

    https://gist.github.com/rdp/905759f88134229c2969b9f242188615

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多