memtest怎么算合格
转载
1.1、测试代码
Set部分:
void testSingleSet( memcached_st *memc, unsigned int testTimes, string value ){
unsigned int i = 0;
memcached_return rc;
char buf[30] = {0};
struct timeval tpstart,tpend;
float timeuse;
gettimeofday(&tpstart,NULL);
for( i = 0; i < testTimes; i++ ){
sprintf( buf, "%d", i);
string key(buf);
size_t value_length = value.length();
size_t keyLength = key.length();
rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
if(rc !=MEMCACHED_SUCCESS)
{
//cout<<"Save data:"<<value<<" sucessful!"<<endl;
getchar();
}
}
gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("Set %u items Used Time:%f/n", testTimes, timeuse);
}
|
Get部分:
void testSingleGet( memcached_st *memc, unsigned int testTimes, size_t valueLength ){
unsigned int i = 0;
memcached_return rc;
char buf[30] = {0};
struct timeval tpstart,tpend;
float timeuse;
gettimeofday(&tpstart,NULL);
for( i = 0; i < testTimes; i++ ){
sprintf( buf, "%d", i);
string key(buf);
size_t value_length = valueLength;
size_t keyLength = key.length();
char* result = memcached_get(memc,key.c_str(), keyLength, &value_length, &flags, &rc);
if(rc != MEMCACHED_SUCCESS)
{
//cout<<"Get value:"<<result<<" sucessful!"<<endl;
getchar();
}
}
gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("Get %u Used Time:%f/n", testTimes, timeuse);
}
|
Delete部分:
void testSingleDel( memcached_st *memc, unsigned int testTimes ){
char buf[20];
memcached_return rc;
struct timeval tpstart,tpend;
float timeuse;
gettimeofday(&tpstart,NULL);
for( unsigned int i = 0; i < testTimes; i++ ){
sprintf( buf, "%d", i);
string key(buf);
//string value = "test";
//string value = "1|1|1301449476|67|33|13272|13272|79|23|7|3|3|74|1|2.000000|4.000000|1.000000|3|3|PandaTest";
//size_t value_length = value.length();
size_t key_length = key.length();
rc=memcached_delete( memc, key.c_str(), key_length, expiration );
if(rc != MEMCACHED_SUCCESS)
{
//cout<<"Delete key:"<<key<<" sucessful!"<<endl;
getchar();
}
}
gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("Delete %u items Used Time:%f/n", testTimes, timeuse);
}
|
遍历部分:
memcached_return_t my_memcached_dump_fn(const memcached_st *ptr, const char *key,
size_t key_length, void *context){
memCount++;
return MEMCACHED_SUCCESS;
}
void testList( memcached_st *memc ){
unsigned int i = 0;
memcached_return rc;
//char* context = (char*)malloc(10);
char* context;
memcached_dump_fn fn = my_memcached_dump_fn;
struct timeval tpstart,tpend;
float timeuse;
gettimeofday(&tpstart,NULL);
memcached_dump(memc, &fn, context, 1);
gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("List %u items Used Time:%f/n",memCount, timeuse);
printf("The memCount is %u/n", memCount);
}
|
1.2、测试结果
1. 测试结果说明:
从测试数据可以看出来,memcache的删除并不是直接删除的,删除的东西还是存在的,只是无法get出来而已(这个我测试了,get会出错的),而超时的数据和被删除的处理方法是一样的,只是无法get,但是可以遍历找到相应的Key。
结果显示,当数据量达到100000后,遍历过的数据和实际插入的数据的数量开始产生差异。说明当数据量到达一定程度之后,遍历出现了问题。而且遍历得到的仅仅是已经缓存在哪里的key的值,不包含其中的value,所以如果做处理的话,还需要将他们get出来。
上述结果都是对长度很短的Key进行操作,长度最多不会超过6位,如果我们将Key和value的长度加倍,进行10万次操作,可以看出对value和key的长度对memcache的性能并没有太大的影响。
3. 仿真测试:
如果将所有的数据进行仿真,然后统计处理仅仅计算delay, loss, openport的平均值,在遍历不出错的情况下,我进行了测试,所需时间大概为2.419011 s,然后处理的数量是40000条。如果数量加大,会出现遍历不到,或者遍历到了但是没有调用回调函数的情况。
2. 使用Memcache可能带来的问题:
1. 因为遍历程序完全可以遍历到那些失效和被删除的k-v对,所以,如果使用memcache,那么我们在遍历的时候会发现我们遍历到了异常多的数据,然后用这些key去get,当get的时候,会对其生命周期和是否被删除进行检查,这时候那些被删除和已经失效的数据将不能get出来,但是已经浪费了大量的时间,同时,如果对于get错误记录日志的话,还会造成日志文件的大量浪费。
2. 由于遍历程序仅仅能够遍历key,同时对相应的key进行的操作需要在回调函数中解决,所以不能进行复杂的操作,只能将key放入容器中,等待遍历完进行处理,这样需要很多的内存空间。而且这些key中有些是失效的,是的有效利用率更低。
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。