這邊繼續來探討 Linux SysBench – https://benjr.tw/8715 裡面的 oltp (Online transaction processing,線上交易處理) 測試項目,因為會用到 MySQL 資料庫,所以先來看一下 MySQL 資料庫相關的基本知識.順便建立 sysbench oltp 要測試的資料庫.
測試環境 Ubuntu 14.04 (所需套件 sysbench , MySQL or MariaDB (Package : mariadb-server))
安裝 MySQL
預設是沒有安裝 MySQL 透過 apt-get 就可以安裝.
root@benjr:~# sudo apt-get install mysql-server
安裝完成後系統會要求建立 root 的密碼,這個 root 是 MySQL 的使用者,和系統上的 root 是不一樣的帳號,這一點不要搞混.
如果剛剛沒有設定 root (和系統上的 root 是不一樣的帳號) 資料庫號密碼可以透過指令來設定.
root@benjr:~# mysqladmin -u root password '123456'
要設定 MySQL 密碼請使用指令 mysqladmin, -u 就是你的使用者 (這邊的 root 是 MySQL 的 root 和系統上的 root 只是名稱相同,所以這邊修改任何密碼將不會改變 /etc/passwd 的任何東西).括號中的 'password' 就是妳輸入的密碼.
這樣下次登入就要使用密碼才能登入.如果你不滿意剛剛輸入的密碼,要修改的話那要加入參數 -p
root@benjr:~# mysqladmin -u root –p password 'abcdef' Enter Password:
這邊的 Enter Password 是剛剛第一次輸入的密碼,也就是123456,成功之後你的密碼就會變成abcdef.下次要再登入也就是用這個密碼.
建立資料庫
我們要為將來使用的 sysbench 測試建立一個資料庫 sbtest ,方法很簡單只要下面幾個步驟,建立一個資料庫名稱為 sbtest 以及使用者帳號 sbtester 為範例.
root@benjr:~# mysql -u root -p Enter password:
輸入MySQL 的 root 密碼,以剛剛的範例是 ‘abcdef’
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 to server version: 4.1.20 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> create database sbtest; Query OK, 1 row affected (0.00 sec)
這邊就是要建立 sysbench 專用的資料庫,create database 資料庫名稱你可以依據自己的需求做改變,注意每個指令後面都要加上 “;”
mysql> grant all privileges on sbtest.* to sbtester@localhost identified by 'sbpwd' ; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) mysql> exit; Bye
將剛剛建立的 sbtest 資料庫權限給 sbtester 這個帳號!這邊的 ‘sbpwd’是指 sbtester 的密碼,你可以依據你的喜好作變更,但是要記住之後跑 sysbench 會用到, 因為是本機端所以用 @localhost 為連線 (如果使要讓遠端可以連線,可以使用 ‘%’ 代表全部),不要忘了指令後面都要加上 “;”
grant all privileges on sbtest.* to sbtester@localhost identified by ‘sbpwd’ ;
各代表的意思
- grant all privileges
授權的權限 (ALL: SELECT, INSERT, DELETE …. etc) - sbtest.*
指定可以存取哪些 Db_name/Table - sbtester@localhost
username@localhost , username – 新增的使用者, localhost – 限制可從哪裡來存取, 可用 ‘%’ (代表全部) - identified by ‘sbpwd’
password: 使用者密碼
試一下剛剛建立好的 sbtest 資料庫和 sbtester 使用者吧!!
root@benjr:~# mysql -u sbtester -p Enter password:
這邊要輸入的密碼是 sbtester 的密碼,我剛剛設定的是 sbpwd .
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 to server version: 3.23.56 mysql> connect sbtest; Connection id: 7 Current database: sbtest +--------------------+ | Database | +--------------------+ | information_schema | | sbtest | +--------------------+ 2 rows in set (0.00 sec)
連線到 sbtest 資料庫看一下.如果你可以用 sbtester 連線到 sbtest 資料庫,那代表資料庫的連結沒有問題.
查詢目前所有已經建立的資料庫.大功告成,跳出來吧!!以後再也用不到了 MySQL 的指令了.
想了解更多關於資料庫請參考 https://benjr.tw/98238
sysbench – oltp 測試
前面準備了這麼久 sysbench oltp 已經可以開始測試了,步驟可以分為 prepare , run , cleanup
- prepare
在測試之前要先把資料庫的 table 準備好,使用 prepare 會使用下面的 SQL 語法建立在剛剛設定好的 sbtest 資料庫裡.CREATE TABLE `sbtest` ( `id` int(10) unsigned NOT NULL auto_increment, `k` int(10) unsigned NOT NULL default '0', `c` char(120) NOT NULL default '', `pad` char(60) NOT NULL default '', PRIMARY KEY (`id`), KEY `k` (`k`);
root@benjr:~# sysbench --test=oltp --db-driver=mysql --oltp-table-size=10000 --mysql-db=sbtest --mysql-user=sbtester --mysql-password=sbpwd prepare sysbench 0.4.12: multi-threaded system evaluation benchmark Creating table 'sbtest'... Creating 10000 records in table 'sbtest'...
- run
run 就代表要開始測試資料庫,這邊可以選擇測試模式 –oltp-test-mode (simple, complex , nontrx),預設為 complex .
Simple 模式: 使用下列的 SQL 語法來進行測試,其他模式請參考 sysbench-manual.pdf 說明.SELECT c FROM sbtest WHERE id=N
N 是一個亂數.
root@benjr:~# sysbench --test=oltp --db-driver=mysql --mysql-db=sbtest --mysql-user=sbtester --mysql-password=sbpwd run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1 Doing OLTP test. Running mixed OLTP test Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases) Using "BEGIN" for starting transactions Using auto_inc on the id column Maximum number of requests for OLTP test is limited to 10000 Threads started! Done. OLTP test statistics: queries performed: read: 140000 write: 50000 other: 20000 total: 210000 transactions: 10000 (125.25 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 190000 (2379.73 per sec.) other operations: 20000 (250.50 per sec.) Test execution summary: total time: 79.8411s total number of events: 10000 total time taken by event execution: 79.7106 per-request statistics: min: 6.34ms avg: 7.97ms max: 139.16ms approx. 95 percentile: 11.47ms Threads fairness: events (avg/stddev): 10000.0000/0.00 execution time (avg/stddev): 79.7106/0.00
這個測試結果要怎麼看??
- cleanup
cleanup 參數會把剛剛透過 prepare 建立的 table 刪除.root@benjr:~# sysbench --test=oltp --db-driver=mysql --mysql-db=sbtest --mysql-user=sbtester --mysql-password=sbpwd cleanup sysbench 0.4.12: multi-threaded system evaluation benchmark Dropping table 'sbtest'... Done.
詳細參數可以參考 sysbench 說明 http://manpages.ubuntu.com/manpages/trusty/man1/sysbench.1.html
更多參數的測試結果請參考 https://benjr.tw/95619
sysbench 測試遠端 MySQL
如果你是要讓 sysbench 測試遠端 MySQL ,就需要注意一下 Firewall , MySQL (my.cnf) 的設定.
設定 Ubuntu 防火牆
root@benjr:~# ufw enable root@benjr:~# ufw allow 3306
設定 MySQL 的 port , bind-address
root@benjr:~# vim /etc/mysql/my.cnf [client] port = 3306 [mysqld] #bind-address = 127.0.0.1
- sysbench 可以指定 port ,沒特別需要的話不用改設定.
- MySQL 預設只能透過本地端 127.0.0.1 來連線,所以需要將 bind-address = 127.0.0.1 用 # 註記起來( #後面文字表示為說明),或是把允許連線的 ip 填上也是可以的.
root@benjr:~# service mysql restart
如果使要讓遠端使用者可以連線 MYSQL 資料庫時,其權限設定需要修改一下,下面我就開放 172.16.0.0/24 (‘%’ 代表全部) 網段的主機可以來連線使用
root@benjr:~# mysql -u sbtester -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 to server version: 4.1.20 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> grant all privileges on sbtest.* to sbtester@'172.16.0.%' identified by 'sbpwd' ;
接下來遠端使用者就可以透過參數 –mysql-host 來測試遠端 MySQL Server.
root@benjr:~# sysbench --test=oltp --db-driver=mysql --oltp-table-size=10000 --mysql-db=sbtest --mysql-user=sbtester --mysql-password=sbpwd --mysql-host=172.16.0.1 run
sysbench 錯誤訊息
下面是我遇過的錯誤訊息,並找到的解決方式.
FATAL: unable to connect to MySQL server, aborting... FATAL: error 2003: Can't connect to MySQL server on '172.16.0.1' (111) ALERT: Error: failed to determine table 'sbtest' type! ALERT: MySQL error: Can't connect to MySQL server on '172.16.0.1' (111) FATAL: failed to get database capabilities!
- 可能是 IP 不對或是 port 錯誤,或是 MySQL 資料庫權限沒有開放,可以試試看 mysql 遠端連線指令(-h IP),確定連線無誤.
- 以及 my.cfg 設定有誤.
ALERT: Error: failed to determine table 'sbtest' type! ALERT: MySQL error: FATAL: failed to get database capabilities!
資料庫 Table 尚未建立,需透過 prepare 參數.
FATAL: unable to connect to MySQL server, aborting... FATAL: error 1045: Access denied for user 'sbtesterr'@'172.16.15.161' (using password: YES) FATAL: failed to connect to database server!
mysql 帳號密碼錯誤,可以試試看用 mysql 指令來試試連線是否錯誤.
Creating table 'sbtest'... ALERT: failed to execute MySQL query: `CREATE TABLE sbtest (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, k integer UNSIGNED DEFAULT '0' NOT NULL, c char(120) DEFAULT '' NOT NULL, pad char(60) DEFAULT '' NOT NULL, PRIMARY KEY (id) ) /*! ENGINE=innodb */`: ALERT: Error 1050 Table 'sbtest' already exists FATAL: failed to create test table
資料庫 table 已經規劃過了.
root@benjr:~# sysbench --test=oltp --oltp-table-size=10000 --mysql-db=test --mysql-user=root prepare sysbench 0.5: multi-threaded system evaluation benchmark PANIC: unprotected error in call to Lua API (cannot open oltp: No such file or directory)
需要指定 oltp.lua 檔案位置 (–test=/sysbench-0.5/sysbemch/tests/db/oltp.lua)
參考資料:
- https://wiki.mikejung.biz/Benchmarking#Install_Sysbench_0.4.12_on_Ubuntu_14.04_and_14.10
- http://www.netadmin.com.tw/article_content.aspx?sn=1511100003&jump=4
4 thoughts on “Sysbench oltp (1)”