2013-09-23 15 views
9

私はServiceStackのRedisクライアントと一緒にキャッシュするためにRedisを頻繁に使用するいくつかの.NET Webアプリケーションで作業します。すべてのケースで私は同じマシンでRedisを実行しています。私はBasicRedisClientManagerPooledRedisClientManager(常にシングルトンとして実装されています)の両方を使用しており、両方のアプローチでいくつか問題がありました。ServiceStackを使用してRedis接続を管理するにはどうすればよいですか?

BasicRedisClientManagerでは、しばらくの間うまくいきましたが、結局Redisは接続を拒否し始めます。 netstatを使って、デフォルトのRedisポートへの何千ものTCP接続がTIME_WAITステータスでぶら下がっていることがわかりました。

次に、PooledRedisClientManagerに切り替えました。これはすぐに問題を解決するように見えました。しかし、それほど時間がかかりませんでした。私たちは、PooledRedisClientManager.GetClientによって引き起こされたスレッド待機(System.Threading.Monitor.Wait呼び出し)に絞り込んだ時々のCPUスパイクに気付きました。

コードでは、(ServiceStackの便利なExecAsショートカットを使用して)get-in-get-outアプローチを使用しているため、一般的な接続は非常に頻繁に取得されますが、できるだけ短く保持されます。

トラフィックは控えめですが、私たちはStackExchangeではありません。私は、ServiceStackクライアントが仕事に就いていると思っていますが、何か間違っていると思います。 PooledRedisClientManagerは正しいアプローチですか?単にプールのサイズを大きくすることをお勧めしますか?それとも、コードで問題が隠されている可能性がありますか?

ここで一般的なガイダンスを探していますが、私はこの時点で助けが必要な特定のコードはありません。前もって感謝します。

+0

純粋なトータルスペキュレーション - 私はAppHarborを使用していましたが、Redis接続が保持され、Redis接続の制限に当たっている問題がありました。サイトは基本的にゼロのトラフィックを受け取るので、IISがアイドルタイムアウトを起こしてアプリケーションをシャットダウンし、Redis接続を正しく処理しないためだと推測します。しかし、SS 'RedisClientManagers'は 'Dispose'で接続を閉じることを処理します。繰り返しますが、ちょうど投機ですが、接続を破棄しないIISアイドルタイムアウトや、新しいRedis接続を作成するいくつかの 'Application_Starts'が考えられます。 – paaschpa

+0

接続が閉じられていますか? redis-cliを使用してCLIENT LISTコマンドを確認する –

答えて

4

すべてのRedis接続が削除されていることは間違いありませんか? ServiceStackで

ServiceViewPageBase(あなたがSSカミソリを使用している場合)にRedisプロパティには、自分自身を配置んが、任意の時間には、あなた自身が、あなたがそれを自分で処分する必要があり、プールからの接続を要求します。

しかし、これにもかかわらず、私たちは最近、私たちのプールがすべての接続から使い尽くされているという問題もありました。私の同僚の一人が、Razorページに適切なクリーンアップがなく、プルリクエストを出したことを発見しましたhere - これは、ServiceStack v4.0.21以降、Razorページに正しい廃棄のみが行われたことを意味します。その修正がv3ブランチにバックポートされているかどうかは確認していません。

私の同僚はまた不適切な処分を追跡するのに役立つTrackingRedisClientsManagerを追加しました。 here

PooledRedisClientManagerby using this helper methodの統計を確認することもできます。私たちは適当に感じるように統計情報をチェックするために小さなカミソリのページに投げました)しかし、特定のノードのプールの状態を監視するために、もっと良いコードを書くこともできます。

関連する問題