5

PythonでRedisサーバーを使用しています。

私のアプリケーションはマルチスレッド (プロセスごとに 20 ~ 32 のスレッドを使用) であり、別のマシンでアプリを実行しています。

Redis の CPU 使用率が 100% になり、Redis サーバーが応答しなくなったり遅くなったりすることがあります。

アプリケーションごとに合計 4 つの接続の 1 つの接続プールを使用したいと考えています。たとえば、最大 20 台のマシンでアプリを実行する場合、redis サーバーへの接続数は 20*4 = 80 になります。

POOL = redis.ConnectionPool(max_connections=4, host='192.168.1.1', db=1, port=6379)
R_SERVER = redis.Redis(connection_pool=POOL)

class Worker(Thread):

    def __init__(self):
        self.start()

    def run(self):
        while True:
            key = R_SERVER.randomkey()
            if not key: break
            value = R_SERVER.get(key)


    def _do_something(self, value):
        # do something with value
        pass

if __name__ = '__main__':
    num_threads = 20
    workers = [Worker() for _ in range(num_threads)]
    for w in workers:
       w.join()

上記のコードは、コマンドの実行時に最大サイズ 4 の接続プールから接続を取得する 20 のスレッドを実行する必要があります。

接続が解除されるのはいつですか?

このコードによると ( https://github.com/andymccurdy/redis-py/blob/master/redis/client.py ):

    #### COMMAND EXECUTION AND PROTOCOL PARSING ####
def execute_command(self, *args, **options):
    "Execute a command and return a parsed response"
    pool = self.connection_pool
    command_name = args[0]
    connection = pool.get_connection(command_name, **options)
    try:
        connection.send_command(*args)
        return self.parse_response(connection, command_name, **options)
    except ConnectionError:
        connection.disconnect()
        connection.send_command(*args)
        return self.parse_response(connection, command_name, **options)
    finally:
        pool.release(connection)

各コマンドの実行後、接続が解放され、プールに戻ります

私がアイデアを正しく理解し、上記のコード例が説明どおりに機能することを誰かが確認できますか?

redis 接続を見ると、常に 4 つ以上あるからです。

編集:コードで、関数のfinallyの前にreturnステートメントがあることに気付きました。最終的には何の目的ですか?

4

2 に答える 2

0

Matthew Scragg が述べたように、finally 節はテストの最後に実行されます。この特定のケースでは、接続を開いたままにしておくのではなく、終了時に接続を解放してプールに戻す役割を果たします。

無応答については、サーバーの動作を確認してください。Redis インスタンスのメモリ制限は? どのくらいの頻度でディスクに保存していますか? AWS インスタンスなどの Xen ベースの VM で実行していますか? レプリケーションを実行していますか? 実行している場合、いくつのスレーブが良好な状態にあるか、または頻繁にデータの完全な再同期を要​​求していますか? あなたのコマンドは「保存」していますか?

これらの質問のいくつかは、コマンド ライン インターフェイスを使用して答えることができます。たとえば redis-cli info persistence、ディスクへの保存プロセスに関する情報やredis-cli info memory、メモリ消費量に関する情報が表示されます。

永続性情報を取得する場合、具体的に調べたいのはrdb_last_bgsave_statusrdb_last_bgsave_time_sec. これらは、最後の保存が成功したかどうか、および保存にかかった時間を示します。時間がかかるほど、リソースの問題が発生する可能性が高くなり、無応答として現れるスローダウンが発生する可能性が高くなります。

于 2014-07-21T15:56:42.957 に答える