工作中遇到疑问:tpcc-mysql预热阶段具体干了什么?
先上答案:预热阶段与正式测试时进行的操作是一样的!
结果很惊人,探索过程如下:
网上找不到解答,研究了下代码,记录如下:
lampup_time
首先,确定了一下记录预热时间的变量:lampup_time,并以此为关键词进行检索,发现以下代码:
printf("\nRAMP-UP TIME.(%d sec.)\n",lampup_time);
fflush(stdout);
sleep(lampup_time);
printf("\nMEASURING START.\n\n");
fflush(stdout);
与使用时的输出吻合。但没有获得有用信息。
线程数组
之后将重点放到研究其线程数组t上,猜测具体预热操作在其中完成:
for( t_num=0; t_num < num_conn; t_num++ ){
thd_arg[t_num].port= port;
thd_arg[t_num].number= t_num;
pthread_create( &t[t_num], NULL, (void *)thread_main, (void *)&(thd_arg[t_num]) );
}
点进thread_main函数,其主体内容为mysql资源的初始化和释放,夹在中间有一句:
r = driver(t_num);
猜测具体sql操作在其中,点进去。咱来细品driver这个函数:
int driver (int t_num)
{
int i, j;
/* Actually, WaitTimes are needed... */
while( activate_transaction ){
switch(seq_get()){
case 0:
do_neword(t_num);
break;
case 1:
do_payment(t_num);
break;
case 2:
do_ordstat(t_num);
break;
case 3:
do_delivery(t_num);
break;
case 4:
do_slev(t_num);
break;
default:
printf("Error - Unknown sequence.\n");
}
}
return(0);
}
它用一个switch语句选择五种操作,刚好与tpcc的五种操作相对应:
- do_neword:New-Order
- do_payment:Payment
- do_ordstat:Delivery
- do_delivery:Order-Status
- do_slev:Stock-Level
再去看了下seq_get()函数,它里面主要是用随机函数生成一个数组,根据数组值来决定采用上文的哪种操作方式。随机函数里的一些操作保证了五种操作的占比适当。
那么问题来了,预热操作呢,遍寻该文件也找不到,再结合这句意味深长的注释“Actually, WaitTimes are needed…”,妈耶作者是偷懒压根没写预热操作诶!结合main中的代码sleep(lampup_time); 搁这预热操作和正式测试阶段操作是一样的!
!!??