1,520 瀏覽數

Sysbench – oltp (1)

這邊繼續來探討 Linux SysBench – http://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 是不一樣的帳號,這一點不要搞混.
mysql01
mysql02

如果剛剛沒有設定 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 的指令了.

想了解更多關於資料庫請參考 http://benjr.tw/12461

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

更多參數的測試結果請參考 http://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)
參考資料:

4 個網友的想法 “Sysbench – oltp (1)

  1. 自動參照通知: CentOS7 – Sysbench – Benjr.tw

  2. 自動參照通知: Sysbench – oltp (2) – Benjr.tw

  3. 自動參照通知: SQL 語法 (INSERT , SELECT , UPDATE , DELETE) – Benjr.tw

  4. 自動參照通知: Linux – SysBench – Benjr.tw

發表迴響