5

遅い Redis サーバーを模倣する最も簡単な方法を探しています (現在デバッグしているクライアントの観点から)。

理想的にはDEBUG SLEEP <seconds>コマンドですが、AFAIKにはそのようなものはありません。

たとえば、BLPOPブロック読み取りに使用できますが、ブロックを解除するには別のスレッドが必要です...もっと簡単な方法はありますか?

4

1 に答える 1

7

実際には、必要な処理を正確に実行するdebugsleepコマンドがあります。これは、debug.cファイルで次のように定義されています。

} else if (!strcasecmp(c->argv[1]->ptr,"sleep") && c->argc == 3) {
    double dtime = strtod(c->argv[2]->ptr,NULL);
    long long utime = dtime*1000000;

    usleep(utime);
    addReply(c,shared.ok);
} else {

1つの接続のみをブロックするBLPOPとは対照的に、Redisイベントループ全体(すべての接続)をブロックすることに注意してください。

> ./redis-cli debug sleep 2
 ... 2 seconds wait ...
OK

BLPOPでは、タイムアウトを指定できるため、2番目のスレッドは必要ありません。

> ./redis-cli blpop dummy_key_which_does_not_exist 2
 ... 2 seconds wait ...
(nil)

Redisを応答不能にする別の方法は、STOPおよびCONT信号を送信することです。インスタンスのpidを取得したら、次を起動します。

kill -STOP $pid
sleep 1
kill -CONT $pid

このシグナルトリックを使用すると、redisインスタンスのすべてのスレッドがフリーズします(つまり、イベントループだけではありません)。これには、I/Oバックグラウンドスレッドが含まれます。

于 2012-12-24T10:14:41.197 に答える