2011-01-31 66 views
6

我有一个运行在nginx/passenger上的生产ruby sinatra应用程序,而且我经常看到请求会被莫名其妙地拖延。我写了一个脚本,每10秒钟在我的机器群集上调用乘客状态,并将结果绘制在图上。这是我所看到的:如何在乘客上的所有正在运行的红宝石线程上获取堆栈跟踪

enter image description here

蓝线表示全球排队等候不断飙升到60这是跨4台机器的平均,所以当蓝线打60,这意味着每台机器刷爆出。我将当前的passenger_max_pool_size设置为20,因此它达到最大池大小的3倍,然后推测会丢弃后续请求。

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

任何人都可以告诉我如何获得堆栈跟踪,看看这里的瓶颈是亚马逊RDS,Redis,还是其他?

谢谢!

回答

4

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

+0

我能知道多久的等待? AFAIK,自动保存应该在后台进行,并且应该只在复制内存页面时延迟,这应该是300ms以上。 – seppo0010 2011-02-01 02:03:29

相关问题