小型的mysql測試工具,主要有自帶的mysqlslap、super-smack和mybench。嗯,我這里的小型的意思是指工具安裝過程簡單。mysqlslap的使用方法遍地都是,就不先詳細寫了。根據個人偏好寫寫mybench吧,畢竟是perl的。安裝很簡單,如下: cpanm DBI DBD::mysql Tim
小型的mysql測試工具,主要有自帶的mysqlslap、super-smack和mybench。嗯,我這里的小型的意思是指工具安裝過程簡單。 mysqlslap的使用方法遍地都是,就不先詳細寫了。根據個人偏好寫寫mybench吧,畢竟是perl的。 安裝很簡單,如下:
cpanm DBI DBD::mysql Time::HiRes wget http://jeremy.zawodny.com/mysql/mybench/mybench-1.0.tar.gz tar zxvf mybench-1.0.tar.gz cd mybench-1.0 perl MakeFile.PL && make && make install
但是使用就不是太簡單了——mysqlslap會自己生成(-a選項)sql,super-smack則帶了一個gen-data程序生成數據然后自動導入,但是mybench沒有,所以只能自己搞定數據。 不過mybench還是自己生成了一個測試模版的腳本在/usr/bin/bench_example,很簡單的就知道怎么做了。 example如下:
#!/usr/bin/perl -w eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}' if 0; # not running under some shell use strict; use MyBench; use Getopt::Std; use Time::HiRes qw(gettimeofday tv_interval); use DBI; my %opt; Getopt::Std::getopt('n:r:h:', \%opt); #這是我見過的最hardcode的perl腳本了(呃,除了我自己寫的垃圾),連db庫、用戶名、密碼都不給運行參數的 my $num_kids = $opt{n} || 10; my $num_runs = $opt{r} || 100; my $db = "test"; my $user = "test"; my $pass = ""; my $port = 3306; my $host = $opt{h} || "192.168.0.1"; my $dsn = "DBI:mysql:$db:$host;port=$port"; my $callback = sub { my $id = shift; my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 1 }); #為測試準備的請求,測select就寫select,測insert就寫insert唄~ #如果不修改,也就是說測試用的是test.mytable表,而且必須有一個列叫id my $sth = $dbh->prepare("SELECT * FROM mytable WHERE ID = ?"); my $cnt = 0; my @times = (); ## wait for the parent to HUP me local $SIG{HUP} = sub { }; sleep 600; #腳本定義的每個進程執行多少次請求 while ($cnt < $num_runs) { my $v = int(rand(100_000)); ## time the query my $t0 = [gettimeofday]; #真正的執行sql請求,通過上面的rand知道,之前準備的test.mytable的id列必須是int格式,同時不少于10w行(又一處hard) $sth->execute($v); #通過前后兩次gettimeofday獲得sql的exec耗時 my $t1 = tv_interval($t0, [gettimeofday]); #完成一次請求執行,加入數組 push @times, $t1; $sth->finish(); $cnt++; } ## cleanup $dbh->disconnect(); #計算本進程全部請求的各項數據,幾個大小和均來自MyBench模塊 my @r = ($id, scalar(@times), min(@times), max(@times), avg(@times), tot(@times)); return @r; }; #將上面這個函數交給MyBench模塊的fork_and_work執行,即并發指定數量請求,返回總的結果 my @results = MyBench::fork_and_work($num_kids, $callback); #計算總的數據 MyBench::compute_results('test', @results); exit; __END__
然后看看/usr/lib/perl5/site_perl/5.8.8/MyBench.pm,主要內容就是fork和compute:
package MyBench; use strict; $main::VERSION = '1.0'; use Exporter; @MyBench::ISA = 'Exporter'; #導出求最大值、最小值、平均值、綜合值的函數給外面用 @MyBench::EXPORT = qw(max min avg tot); sub fork_and_work($$) { #關閉
好了,開始準備數據,比較懶,直接用super-smack的gen-data先出了一些./gen-data -n 100000 -f %n,%80-12s%12n,%512-512s,%d > /root/data,然后進mysql里執行:
USE test; CREATE TABLE mytable (id INT(11) NOT NULL AUTO_INCREMENT, col1 CHAR(100), col2 CHAR(100), col3 INT(11), PRIMARY KEY (id) )ENGINE=InnoDB DEFAULT CHARSET=utf8; LOAD DATA LOCAL INFILE 'data' REPLACE INTO TABLE 'mytable' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; INSERT INTO mytable (col1,col2,col3) SELECT col1,col2,col3 FROM mytable;
最后執行./select_bench -h 10.168.170.92 -n 10 -r 1000就能看到結果了: forking: ++++++++++ sleeping for 2 seconds while kids get ready waiting: ———- test: 10000 0.00017 0.006809 0.0010413514 10.413514 9602.9063772325 clients : 10 queries : 10000 fastest : 0.00017 slowest : 0.006809 average : 0.0010413514 serial : 10.413514 q/sec : 9602.9063772325
原文地址:mysql測試小工具mybench試用, 感謝原作者分享。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com