如何在乘客上的所有正在运行的红宝石线程上获得堆栈跟踪

时间:2011-01-31 23:30:41

标签: ruby redis passenger

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

enter image description here

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

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

有人可以告诉我如何获得堆栈跟踪,看看这里的瓶颈是否是Amazon RDS,Redis或其他什么?

谢谢!

2 个答案:

答案 0 :(得分:4)

我想通了 - 我在Redis中有一个SAVE配置参数,每分钟发射一次。很明显,redis的分叉/保存操作阻止了我的应用程序。我将配置参数更改为“3600 1”,这意味着我每小时只保存一次数据库,这是正常的,因为我将其用作缓存(数据保存在MYSQL中)。

答案 1 :(得分:0)

要回答您的原始问题,可以获得乘客正在牧养的正在运行的红宝石流程的“所有堆栈跟踪”。基本上向每个人发送SIGQUIT消息,他们将所有的回溯吐出到apache / nginx日志文件中,例如:

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

相关问题