2011-01-31 2 views
6

nginx/passengerで実行されているプロダクションルビーシナトラアプリを持っていて、リクエストがわかりにくくなるのをよく見ます。私は10秒ごとにマシンのクラスタ上で乗客状態を呼び出すためのスクリプトを書いて、その結果をグラフにプロットしました。乗客のすべての実行中のルビースレッドでスタックトレースを取得する方法

enter image description here

青い線はこれが4機全体の平均である60に常にスパイク待っグローバルキューを示し、青い線が60に当たったときに、それはすべてのマシンが限界に達していることを意味:これは私が見たものですでる。私は現在のpassenger_max_pool_sizeを20に設定しているので、最大プールサイズの3倍に達しており、おそらく後続のリクエストをドロップしています。

私のアプリは、Amazon RDS mysqlバックエンドとRedisインスタンスの2つの主要な外部リソースに依存しています。おそらく、これらのうちの1つが定期的に遅くなったり反応しなくなったりするため、この動作が起こります。

ここでボトルネックがAmazon RDS、Redis、または何か他のものであるかどうかをスタックトレースで取得する方法についてアドバイスをいただけますか?

ありがとうございます!

答えて

4

私はそれを理解しました - 1分に1回発射していたRedisのSAVE設定パラメータがありました。明らかに、赤字のフォーク/セーブ操作が私のアプリケーションをブロックしています。 configパラメータを "3600 1"に変更します。これは、データベースを1時間に1回しか保存しないことを意味します。これは、キャッシュとして使用しているためです(データはMYSQLに保存されています)。

+0

は私が待っていたどのくらい知っていることはできますか? AFAIKでは、自動保存はバックグラウンドで実行する必要があります。メモリページをコピーしている最中に300msの時間がかかるだけです。 – seppo0010

+0

経験的には、私のredisノードが数秒間ブロックするように見えますが、60秒間に5〜10秒程度のブロックが見られます。私はスレーブをスピンアップし、スレーブを使用して保存しようとします。 – esilver

0

元の質問に答えるために、乗客がシェーピングしている実行中のルビープロセスに対して「すべてのスタックトレース」を得ることができます。基本的にはそれぞれにSIGQUITメッセージを送信し、彼らは、Apache/nginxのログファイルに、元のすべてのバックトレースを吐き出すます:

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

関連する問題