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中实现。