天天看点

redis-benchmark 限流控制redis-benchmark 限流控制

redis-benchmark 限流控制

由于自带的redis-benchmark不能按照设定的TPS执行,因此增加TPS控制功能。

多并发TPS控制

原理

X/(t+t') = TPS/1

    t' = X/TPS - t

    其中,X表示处理的请求数,t表示处理X笔请求花费的时间,t'表示需要等待的时间,TPS表示设定的TPS值
           

实现

利用redis-benchmark中自带的时间事件实现

int counts = ;
    int showThroughput(struct aeEventLoop *eventLoop, long long id, void *clientData) {
        REDIS_NOTUSED(eventLoop);
        REDIS_NOTUSED(id);
        REDIS_NOTUSED(clientData);


        if (config.liveclients == ) {
            fprintf(stderr,"All clients disconnected... aborting.\n");
            exit();
        }
        if (config.csv) return ;
        if (config.idlemode == ) {
            printf("clients: %d\r", config.liveclients);
            fflush(stdout);
            return ;
        }

        float dt = (float)(mstime()-config.start)/;
        float rps = (float)config.requests_finished/dt;

        float realtime_rps = ((float)config.requests_finished - pre_req)/(dt - pre_time);

        if(config.tps != ) {
            float time = ((float)config.requests_finished - pre_req)/config.tps - (dt - pre_time);  /* 计算等待时间 */

            sleep_time +=time;

            if (time > ) { 
                sleep(time);

                dt = dt + time;
                rps = (float)config.requests_finished/dt;
                realtime_rps = ((float)config.requests_finished - pre_req)/(dt - pre_time);
            }
        }
        pre_time = dt; /* 上一次时间事件的累积时间 */
        pre_req = config.requests_finished;  /* 上一次时间事件累积完成的请求数 */

        if (counts %  == ) {
            printf("%s: %.2f(avg) %.2f(real) 经过:%f秒\n", config.title, rps, realtime_rps, dt); 
        }

        counts++;

        return ; /* every 250ms */
    }
           

单并发TPS控制

当-c选项设置为1时,能够得到更准确的TPS控制,并且可用于计算请求延时,即发送1笔请求到收到这笔请求耗费的时间。

原理

/(t+t') = TPS/1

    t' = 1/TPS - t

    其中,t表示处理X笔请求花费的时间,t'表示需要等待的时间,TPS表示设定的TPS值
           

实现

实现类似,但是需要在readHandler和writeHandler中实现。

继续阅读