2013-03-07 16 views
5

infoコマンドを使用してredis-cliを使用して情報を出力できないほど、Redisで応答待ち時間が非常に長くなります。Redisが応答するには時間がかかりすぎる

このサーバーは、約200個の同時プロセスからの要求を処理しますが、(少なくとも私たちの知る限り)あまり情報は保存しません。サーバーが応答すると、infoコマンドは約20〜30 MBのメモリを使用したことを報告します。

サーバー上でtopを実行すると、応答待ち時間が長い間、CPU使用率は95〜100%になります。

このような現象には、どのような原因が考えられますか?

+0

あなたの使用状況はどのように見えますか?大きな「並べ替え」が行われていますか?プロダクションコードで 'KEYS'を使用していますか?あなたはどこからでも 'MONITOR'を走っていますか?永続化戦略とは何ですか? –

+0

このインスタンスで永続性を無効にしました。現在、どこでも 'KEYS'や' MONITOR'コマンドを使用していません。少なくとも自分の知識の範囲では、私たちには「並べ替え」はありません。このインスタンスは 'rq'専用です(www.python-rq.org)。 –

答えて

8

提供されたデータに基づいて説明するのは難しいですが、私の推測です。明らかなレイテンシ・ソース(パーシスタンスにリンクされているレイテンシ・ソース)をチェックし、でRedisコマンドがCPUを酷使していないこと、そしてPython-rqでピックされたジョブ・データのサイズが巨大ではないと思います。

ドキュメントによると、Python-rqはジョブをハッシュオブジェクトとしてRedisに挿入し、Redisは関連するキー(500秒がデフォルト値のようです)を期限切れにしてジョブを削除します。何らかの重大なスループットがある場合、Redisには多くのアイテムが期限切れになるのを待っています。その数は保留中のジョブに比べて高くなります。

INFOコマンドの結果で期限切れになるアイテムの数を確認することで、この点を確認できます。

Redisの有効期限は、イベントループ(擬似バックグラウンドモード、100 msごと)で実行されるキーサンプリングに基づくアクティブなメカニズムと、キーにアクセスするときに適用される遅延メカニズムに基づいています。アクティブな有効期限メカニズムが実行されているときに、Redisコマンドを処理することはできません。

クライアントアプリケーションのパフォーマンスへの影響を避けるため、アクティブなメカニズムが起動されるたびに(デフォルトでは10個のキー)、限られた数のキーのみが処理されます。ただし、25%を超えるキーが期限切れになった場合は、より多くのキーとループを期限切れにします。これは、この確率的アルゴリズムがRedisが期限切れにしている鍵の数に自動的にその活動を適応させる方法です。

多くのキーが期限切れになると、この適応アルゴリズムはRedisのパフォーマンスに大きな影響を与える可能性があります。詳細はhereをご覧ください。

私の提案は、Python-rqが有効期限を設定してアイテムのクリーニングをRedisに委任するのを防ぐことです。これは、とにかくキューイングシステムにとっては貧弱な設計です。

+0

これは素晴らしい解決策のように思えます。そのような精巧な答えをありがとう。私はそれを試して、それがどのように動作するか見る。再度、感謝します! –

+0

うん、 'ジョブ' ttlを減らすときCPU使用量を減らすことに気づく。どうもありがとう! –

0

Redisが期限切れのキーを使用すると、ttlを減らしてもCPU使用を避けることができないと思います。

ディディエは、Python-rqの現在のアーキテクチャが、キーの有効期限切れ機能を使用して、クリーニングジョブをRedisに委任していると述べています。そして確かに、ディディエは最高の方法ではないと言ったように。 (これは、result_ttlが0より大きい場合にのみ使用されます)

次に、有効期限が近いキー/ジョブがある場合に問題が発生し、バーストが発生したときに問題が発生します雇用創出の

しかし、Pythonの-RQセットは、キーがこれを回避するために、それらの間に十分な時間との時間の周りに広がる必要があるので、次に、それは、あまりにも意味を持たないジョブは1つのワーカーに終了したとき、キーを期限切れ

状況

関連する問題