fork_test.pl
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #!/my/gnu/bin/perl -w
  2. # This is a test with uses 5 processes to insert, update and select from
  3. # two tables.
  4. # One inserts records in the tables, one updates some record in it and
  5. # the last 3 does different selects on the tables.
  6. #
  7. $opt_loop_count=10000; # Change this to make test harder/easier
  8. ##################### Standard benchmark inits ##############################
  9. use Mysql;
  10. use Getopt::Long;
  11. use Benchmark;
  12. package main;
  13. $opt_skip_create=$opt_skip_in=$opt_verbose=$opt_fast_insert=
  14.   $opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=0;
  15. $opt_host=""; $opt_db="test";
  16. GetOptions("host=s","db=s","loop-count=i","skip-create","skip-in","skip-delete",
  17. "verbose","fast-insert","lock-tables","debug","fast","force") || die "Aborted";
  18. $opt_verbose=$opt_debug=$opt_lock_tables=$opt_fast_insert=$opt_fast=$opt_skip_in=$Mysql::db_errstr=$opt_force=undef;  # Ignore warnings from these
  19. print "Testing 5 multiple connections to a server with 1 insert, 1 updaten";
  20. print "and 3 select connections.n";
  21. $firsttable  = "bench_f1";
  22. $secondtable = "bench_f2";
  23. ####  
  24. ####  Start timeing and start test
  25. ####
  26. $start_time=new Benchmark;
  27. if (!$opt_skip_create)
  28. {
  29.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  30.   $Mysql::QUIET = 1;
  31.   $dbh->Query("drop table $firsttable");
  32.   $dbh->Query("drop table $secondtable");
  33.   $Mysql::QUIET = 0;
  34.   print "Creating tables $firsttable and $secondtable in database $opt_dbn";
  35.   $dbh->Query("create table $firsttable (id int(6) not null, info varchar(32), marker char(1), primary key(id))") or die $Mysql::db_errstr;
  36.   $dbh->Query("create table $secondtable (id int(6) not null, row int(3) not null,value double, primary key(id,row))") or die $Mysql::db_errstr;
  37.   $dbh=0; # Close handler
  38. }
  39. $|= 1; # Autoflush
  40. ####
  41. #### Start the tests
  42. ####
  43. test_1() if (($pid=fork()) == 0); $work{$pid}="insert";
  44. test_2() if (($pid=fork()) == 0); $work{$pid}="update";
  45. test_3() if (($pid=fork()) == 0); $work{$pid}="select1";
  46. test_4() if (($pid=fork()) == 0); $work{$pid}="select2";
  47. test_5() if (($pid=fork()) == 0); $work{$pid}="select3";
  48. $errors=0;
  49. while (($pid=wait()) != -1)
  50. {
  51.   $ret=$?/256;
  52.   print "thread '" . $work{$pid} . "' finnished with exit code $retn";
  53.   $errors++ if ($ret != 0);
  54. }
  55. if (!$opt_skip_delete && !$errors)
  56. {
  57.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  58.   $dbh->Query("drop table $firsttable");
  59.   $dbh->Query("drop table $secondtable");
  60. }
  61. print ($errors ? "Test failedn" :"Test okn");
  62. $end_time=new Benchmark;
  63. print "Total time: " .
  64.   timestr(timediff($end_time, $start_time),"noc") . "n";
  65. exit(0);
  66. #
  67. # Insert records in the two tables
  68. sub test_1
  69. {
  70.   my ($dbh,$tmpvar,$rows,$found,$i);
  71.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  72.   $tmpvar=1;
  73.   $rows=$found=0;
  74.   for ($i=0 ; $i < $opt_loop_count; $i++)
  75.   {
  76.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  77.     $sth=$dbh->Query("insert into $firsttable values ($i,'This is entry $i','')") || die "Got error on insert: $Mysql::db_errstrn";
  78.     $row_count=($i % 7)+1;
  79.     $rows+=1+$row_count;
  80.     for ($j=0 ; $j < $row_count; $j++)
  81.     {
  82.       $sth=$dbh->Query("insert into $secondtable values ($i,$j,0)") || die "Got error on insert: $Mysql::db_errstrn";
  83.     }
  84.     if (($tmpvar % 10) == 0)
  85.     {
  86.       $sth=$dbh->Query("select max(info) from $firsttable") || die "Got error on select max(info): $Mysql::db_errstrn";
  87.       $sth=$dbh->Query("select max(value) from $secondtable") || die "Got error on select max(info): $Mysql::db_errstrn";      
  88.       $found+=2;
  89.     }
  90.   }
  91.   $dbh=0;
  92.   print "Test_1: Inserted $rows rows, found $found rowsn";
  93.   exit(0);
  94. }
  95. #
  96. # Update records in both tables
  97. #
  98. sub test_2
  99. {
  100.   my ($dbh,$id,$tmpvar,$rows,$found,$i,$max_id,$tmp);
  101.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  102.   $tmpvar=111111;
  103.   $rows=$found=$max_id=$id=0;
  104.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  105.   {
  106.     $tmp=(($tmpvar + 63) + $i)*3;
  107.     $tmp=$tmp-int($tmp/100000)*100000; 
  108.     $tmpvar^= $tmp;
  109.     $tmp=$tmpvar - int($tmpvar/10)*10;
  110.     if ($max_id*$tmp == 0)
  111.     {
  112.       $max_id=0;
  113.       $sth=$dbh->Query("select max(id) from $firsttable where marker=''") || die "Got error select max: $Mysql::db_errstrn";
  114.       if ((@row = $sth->FetchRow()) && defined($row[0]))
  115.       {
  116. $found++;
  117. $max_id=$id=$row[0];
  118.       }
  119.     }
  120.     else
  121.     {
  122.       $id= $tmpvar % ($max_id-1)+1;
  123.     }
  124.     if ($id)
  125.     {
  126.       $sth=$dbh->Query("update $firsttable set marker='x' where id=$id") || die "Got error update $firsttable: $Mysql::db_errstrn";
  127.       $rows+=$sth->affected_rows;
  128.       if ($sth->affected_rows)
  129.       {
  130. $sth=$dbh->Query("update $secondtable set value=$i where id=$id") || die "Got error update $firsttable: $Mysql::db_errstrn";
  131. $rows+=$sth->affected_rows;
  132.       }
  133.     }
  134.   }
  135.   $dbh=0;
  136.   print "Test_2: Found $found rows, Updated $rows rowsn";
  137.   exit(0);
  138. }
  139. #
  140. # select records
  141. #
  142. sub test_3
  143. {
  144.   my ($dbh,$id,$tmpvar,$rows,$i);
  145.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  146.   $tmpvar=222222;
  147.   $rows=0;
  148.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  149.   {
  150.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  151.     $id=$tmpvar % $opt_loop_count;
  152.     $sth=$dbh->Query("select id from $firsttable where id=$id") || die "Got error on select from $firsttable: $Mysql::db_errstrn";
  153.     $rows+=$sth->numrows;
  154.   }
  155.   $dbh=0;
  156.   print "Test_3: Found $rows rowsn";
  157.   exit(0);
  158. }
  159. #
  160. # Note that this uses row=1 and in some cases won't find any matching
  161. # records
  162. #
  163. sub test_4
  164. {
  165.   my ($dbh,$id,$tmpvar,$rows,$i);
  166.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  167.   $tmpvar=333333;
  168.   $rows=0;
  169.   for ($i=0 ; $i < $opt_loop_count; $i++)
  170.   {
  171.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  172.     $id=$tmpvar % $opt_loop_count;
  173.     $sth=$dbh->Query("select id from $secondtable where id=$id") || die "Got error on select form $secondtable: $Mysql::db_errstrn";
  174.     $rows+=$sth->numrows;
  175.   }
  176.   $dbh=0;
  177.   print "Test_4: Found $rows rowsn";
  178.   exit(0);
  179. }
  180. sub test_5
  181. {
  182.   my ($dbh,$id,$tmpvar,$rows,$i,$max_id);
  183.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  184.   $tmpvar=444444;
  185.   $rows=$max_id=0;
  186.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  187.   {
  188.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  189.     if ($max_id == 0 || ($tmpvar % 10 == 0))
  190.     {
  191.       $sth=$dbh->Query("select max(id) from $firsttable") || die "Got error select max: $Mysql::db_errstrn";
  192.       if ((@row = $sth->FetchRow()) && defined($row[0]))
  193.       {
  194. $max_id=$id=$row[0];
  195.       }
  196.       else
  197.       {
  198. $id=0;
  199.       }
  200.     }
  201.     else
  202.     {
  203.       $id= $tmpvar % $max_id;
  204.     }
  205.     $sth=$dbh->Query("select value from $firsttable,$secondtable where $firsttable.id=$id and $secondtable.id=$firsttable.id") || die "Got error on select form $secondtable: $Mysql::db_errstrn";
  206.     $rows+=$sth->numrows;
  207.   }
  208.   $dbh=0;
  209.   print "Test_5: Found $rows rowsn";
  210.   exit(0);
  211. }