测试内存池
This commit is contained in:
@@ -91,12 +91,35 @@ void special_char_test(redisContext *c){
|
||||
}
|
||||
|
||||
void save(redisContext *c){
|
||||
must_ok((redisReply*)redisCommand(c, "SAVE"), "SET binary");
|
||||
must_ok((redisReply*)redisCommand(c, "SAVE"), "SAVE");
|
||||
|
||||
printf("[OK] SAVE\n");
|
||||
}
|
||||
|
||||
void pipline_set_test(redisContext *c, int start, int countN, const char *op){
|
||||
void printmem(redisContext *c){
|
||||
redisReply *r = (redisReply*)redisCommand(c, "MEMPRINT");
|
||||
if (r == NULL) {
|
||||
// 连接错误或命令发送失败
|
||||
printf("redisCommand failed: %s\n", c->errstr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (r->type == REDIS_REPLY_INTEGER) {
|
||||
if (r->integer == 1) {
|
||||
printf("MEMPRINT returned 1\n");
|
||||
} else {
|
||||
printf("MEMPRINT returned %lld\n", r->integer);
|
||||
}
|
||||
} else if (r->type == REDIS_REPLY_ERROR) {
|
||||
printf("Redis error: %s\n", r->str);
|
||||
} else {
|
||||
printf("Unexpected reply type: %d\n", r->type);
|
||||
}
|
||||
|
||||
printf("[OK] PRINT\n");
|
||||
}
|
||||
|
||||
void pipline_set_test(redisContext *c, int start, int countN, const char *op, char* k, char *v){
|
||||
/* ---------- 3) Pipeline 批处理测试 ---------- */
|
||||
const int N = countN;
|
||||
|
||||
@@ -104,8 +127,8 @@ void pipline_set_test(redisContext *c, int start, int countN, const char *op){
|
||||
int end = start + N;
|
||||
for (int i = start; i < end; i++) {
|
||||
char kk[64], vv[64];
|
||||
int kn = snprintf(kk, sizeof(kk), "p:%d", i);
|
||||
int vn = snprintf(vv, sizeof(vv), "v:%d", i);
|
||||
int kn = snprintf(kk, sizeof(kk), "%s:%d", k, i);
|
||||
int vn = snprintf(vv, sizeof(vv), "%s:%d", v, i);
|
||||
if (redisAppendCommand( c, "%s %b %b",
|
||||
op,
|
||||
kk, (size_t)kn,
|
||||
@@ -127,14 +150,14 @@ void pipline_set_test(redisContext *c, int start, int countN, const char *op){
|
||||
PRINT("[OK] SET pipeline batch %d\n", N);
|
||||
}
|
||||
|
||||
void pipline_get_test(redisContext *c, int start, int countN, const char *op){
|
||||
void pipline_get_test(redisContext *c, int start, int countN, const char *op, char* k, char *v){
|
||||
const int N = countN;
|
||||
|
||||
/* pipeline GET + 校验 */
|
||||
int end = start + N;
|
||||
for (int i = start; i < end; i++) {
|
||||
char kk[64];
|
||||
int kn = snprintf(kk, sizeof(kk), "p:%d", i);
|
||||
int kn = snprintf(kk, sizeof(kk), "%s:%d", k, i);
|
||||
if (redisAppendCommand( c, "%s %b",
|
||||
op,
|
||||
kk, (size_t)kn) != REDIS_OK) {
|
||||
@@ -147,7 +170,7 @@ void pipline_get_test(redisContext *c, int start, int countN, const char *op){
|
||||
redisReply *r = NULL;
|
||||
if (redisGetReply(c, (void**)&r) != REDIS_OK || !r) die(c, "redisGetReply GET failed");
|
||||
char expect[64];
|
||||
int en = snprintf(expect, sizeof(expect), "v:%d", i);
|
||||
int en = snprintf(expect, sizeof(expect), "%s:%d", v, i);
|
||||
must_bulk_eq(r, expect, (size_t)en, "pipeline GET reply");
|
||||
|
||||
if(i%10000 == 0) PRINT("RECV: %d\n", i);
|
||||
@@ -156,14 +179,14 @@ void pipline_get_test(redisContext *c, int start, int countN, const char *op){
|
||||
PRINT("[OK] GET pipeline batch %d\n", N);
|
||||
}
|
||||
|
||||
void pipline_del_test(redisContext *c, int start, int countN, const char *op){
|
||||
void pipline_del_test(redisContext *c, int start, int countN, const char *op, char* k){
|
||||
const int N = countN;
|
||||
|
||||
/* cleanup:pipeline DEL */
|
||||
int end = start + N;
|
||||
for (int i = start; i < end; i++) {
|
||||
char kk[64];
|
||||
int kn = snprintf(kk, sizeof(kk), "p:%d", i);
|
||||
int kn = snprintf(kk, sizeof(kk), "%s:%d", k, i);
|
||||
if (redisAppendCommand( c, "%s %b",
|
||||
op,
|
||||
kk, (size_t)kn) != REDIS_OK) {
|
||||
@@ -190,15 +213,15 @@ long long test_nopersist_noreplica(redisContext *c, int rounds, long long batch_
|
||||
long long total_ops = batch_size*rounds;
|
||||
|
||||
for(int i = 0;i < total_ops ; i += batch_size){
|
||||
pipline_set_test(c, i, batch_size, "RSET");
|
||||
pipline_set_test(c, i, batch_size, "RSET", "p", "v");
|
||||
}
|
||||
|
||||
for(int i = 0;i < total_ops ; i += batch_size){
|
||||
pipline_get_test(c, i, batch_size, "RGET");
|
||||
pipline_get_test(c, i, batch_size, "RGET", "p", "v");
|
||||
}
|
||||
|
||||
for(int i = 0;i < total_ops ; i += batch_size){
|
||||
pipline_del_test(c, i, batch_size, "RDEL");
|
||||
pipline_del_test(c, i, batch_size, "RDEL", "p");
|
||||
}
|
||||
|
||||
gettimeofday(&tv_end, NULL);
|
||||
@@ -209,6 +232,35 @@ long long test_nopersist_noreplica(redisContext *c, int rounds, long long batch_
|
||||
return qps;
|
||||
}
|
||||
|
||||
long long test_memory(redisContext *c, int rounds, long long batch_size, int mod){
|
||||
struct timeval tv_begin, tv_end;
|
||||
gettimeofday(&tv_begin, NULL);
|
||||
|
||||
long long total_ops = batch_size*rounds;
|
||||
|
||||
if(mod == 1){
|
||||
for(int i = 0;i < total_ops ; i += batch_size){
|
||||
pipline_set_test(c, i, batch_size, "RSET","p1","v");
|
||||
pipline_set_test(c, i, batch_size, "RSET","p2","v");
|
||||
pipline_del_test(c, i, batch_size, "RDEL","p1");
|
||||
}
|
||||
}else if(mod == 2){
|
||||
for(int i = 0;i < total_ops ; i += batch_size){
|
||||
pipline_set_test(c, i, batch_size, "RSET","p3","v");
|
||||
pipline_del_test(c, i, batch_size, "RDEL","p2");
|
||||
pipline_del_test(c, i, batch_size, "RDEL","p3");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gettimeofday(&tv_end, NULL);
|
||||
int time_used = TIME_SUB_MS(tv_end, tv_begin);
|
||||
long long qps = total_ops *6*1000/time_used;
|
||||
printf("BATCH (N=%lld) --> time_used=%d ms, qps=%lld\n", total_ops *3, time_used, qps);
|
||||
|
||||
return qps;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if(argc < 4) {
|
||||
printf("invalid input\n");
|
||||
@@ -227,6 +279,8 @@ int main(int argc, char **argv) {
|
||||
if(mode == 0){
|
||||
save(c);
|
||||
}else if(mode == 1){
|
||||
printmem(c);
|
||||
}else if(mode == 2){
|
||||
basic_command_test(c);
|
||||
}else if(mode == 3){
|
||||
int rounds = 10;
|
||||
@@ -239,29 +293,47 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
printf("average qps:%lld\n", total_qps/testrounds);
|
||||
}else if(mode == 4){
|
||||
int rounds = 10;
|
||||
long long batch_size = 100000;
|
||||
int testrounds = 5;
|
||||
long long total_qps = 0;
|
||||
|
||||
}else if(mode == 5){
|
||||
for(int i = 0;i < testrounds; ++ i){
|
||||
total_qps += test_nopersist_noreplica(c, rounds, batch_size);
|
||||
}
|
||||
printf("average qps:%lld\n", total_qps/testrounds);
|
||||
|
||||
}else if(mode == 51){
|
||||
int rounds = 30;
|
||||
long long batch_size = 100000;
|
||||
test_memory(c, rounds, batch_size, 1);
|
||||
|
||||
|
||||
}else if(mode == 52){
|
||||
int rounds = 30;
|
||||
long long batch_size = 100000;
|
||||
test_memory(c, rounds, batch_size, 2);
|
||||
|
||||
}else if(mode == 10){
|
||||
pipline_set_test(c, 0, 1000, "SET");
|
||||
pipline_set_test(c, 0, 1000, "SET","p","v");
|
||||
}else if(mode == 11){
|
||||
pipline_get_test(c, 0, 1000, "GET");
|
||||
pipline_get_test(c, 0, 1000, "GET","p", "v");
|
||||
}else if(mode == 12){
|
||||
pipline_del_test(c, 0, 1000, "DEL");
|
||||
pipline_del_test(c, 0, 1000, "DEL","p");
|
||||
|
||||
}else if(mode == 20){
|
||||
pipline_set_test(c, 0, 1000, "RSET");
|
||||
pipline_set_test(c, 0, 1000, "RSET","p","v");
|
||||
}else if(mode == 21){
|
||||
pipline_get_test(c, 0, 1000, "RGET");
|
||||
pipline_get_test(c, 0, 1000, "RGET","p", "v");
|
||||
}else if(mode == 22){
|
||||
pipline_del_test(c, 0, 1000, "RDEL");
|
||||
pipline_del_test(c, 0, 1000, "RDEL","p");
|
||||
|
||||
}else if(mode == 30){
|
||||
pipline_set_test(c, 0, 1000, "HSET");
|
||||
pipline_set_test(c, 0, 1000, "HSET","p","v");
|
||||
}else if(mode == 31){
|
||||
pipline_get_test(c, 0, 1000, "HGET");
|
||||
pipline_get_test(c, 0, 1000, "HGET","p", "v");
|
||||
}else if(mode == 32){
|
||||
pipline_del_test(c, 0, 1000, "HDEL");
|
||||
pipline_del_test(c, 0, 1000, "HDEL","p");
|
||||
}
|
||||
|
||||
redisFree(c);
|
||||
|
||||
Reference in New Issue
Block a user