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

esi*_*ver 6 ruby passenger redis

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

在此输入图像描述

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

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

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

谢谢!

esi*_*ver 4

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