Hôm nay Cloud365 sẽ giới thiệu đến các bạn một công cụ dùng để benchmark hệ thống Linux (CPU, File IO, MySQL). Đó là lệnh sysbench.

Sysbench là một công cụ benchmark cho phép bạn nhanh chóng biết được hiệu năng hệ thống, điều này rất quan trọng nếu bạn có đang chạy một cơ sở dữ liệu dưới tải trọng lớn. Sysbench là nền benchmark chuẩn có thể tùy chỉnh cao và phổ biến nhất cho MySQL.

Bài viết này sẽ giới thiệu cách benchmark CPU, file IO, RAM và hiệu suất MySQL của hệ thống của bạn với sysbench.

1. Cài đặt

Trên Debian/Ubuntu:

apt-get update -y
apt-get install sysbench -y

Trên CentOS/Fedora:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*
yum -y install epel-release
yum -y update
yum install sysbench -y

Để biết thêm các thông số của lệnh sysbench, dùng lệnh:

man sysbench

Vài kiểu benchmark với sysbench:

CPU – Mất bao lâu để CPU tính được số chính tối đa (maximum primary number)? Bạn cũng có thể thêm bao nhiêu thread tham gia vào quá trình benchmark này. Đây là cách rất trực tiếp và dễ dàng để đánh giá hiệu năng của CPU.

File IO – Benchmark file IO gồm tất cả các tình huống như like direct io, sync, async, vv… kiểm tra đọc/ghi tuần tự và đọc/ghi ngẫu nhiên, Điều này làm cho Benchmark IO của diskrất có thể mở rộng.

OLTP – Benchmark MySQL bao gồm các truy vấn SELECT /INSERT / UPDATE / DELETE trên nhiều tình huống sử dụng như bulk data loading, các cập nhật range-based , xóa high volume data. Không có benchmark mysql nào có thể hoàn thành mà không có sysbench.

2. Benchmark CPU

Dùng lệnh:

sysbench --test=cpu --cpu-max-prime=20000 run

Output mẫu:

[root@localhost ~]# sysbench --test=cpu --cpu-max-prime=20000 run
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Prime numbers limit: 20000

Initializing worker threads...

Threads started!

CPU speed:
    events per second:   279.75

General statistics:
    total time:                          10.0012s
    total number of events:              2799

Latency (ms):
        min:                                    3.28
        avg:                                    3.57
        max:                                   11.95
        95th percentile:                        3.75
        sum:                                 9993.02

Threads fairness:
    events (avg/stddev):           2799.0000/0.00
    execution time (avg/stddev):   9.9930/0.00

[root@localhost ~]#

Bạn chú ý vào dòng total time: 10.0012s

Bạn cần phải so sánh trên nhiều hệ thống khác nhau để hiểu giá trị này có ý nghĩa như thế nào.

3. Benchmark File IO

Đầu tiên cần tạo 1 file lớn hơn nhiều so với RAM, tôi tạo 1 file 150GB.

sysbench --test=fileio --file-total-size=150G prepare
[root@localhost ~]# sysbench --test=fileio --file-total-size=150G prepare
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.17 (using system LuaJIT 2.0.4)

128 files, 409600Kb each, 51200Mb total
Creating files for the test...
Extra file open flags: (none)
Creating file test_file.0
Creating file test_file.1
Creating file test_file.2
Creating file test_file.3
Creating file test_file.4
Creating file test_file.5
Creating file test_file.6
Creating file test_file.7
Creating file test_file.8
Creating file test_file.9
Creating file test_file.10
...

Chạy benchmark

sysbench --test=fileio --file-total-size=150G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run
[root@localhost ~]# sysbench --test=fileio --file-total-size=150G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run
sysbench: /usr/lib/libmysqlclient.so.18: no version information available (required by sysbench)
sysbench 0.4.12:  multi-threaded system evaluation benchmark
 
Running the test with following options:
Number of threads: 1
Initializing random number generator from timer.
 
 
Extra file open flags: 0
128 files, 1.1719Gb each
150Gb total file size
Block size 16Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Time limit exceeded, exiting...
Done.
 
Operations performed:  600 Read, 400 Write, 1186 Other = 2186 Total
Read 9.375Mb  Written 6.25Mb  Total transferred 15.625Mb  (53.316Kb/sec)
    3.33 Requests/sec executed
 
Test execution summary:
    total time:                          300.0975s
    total number of events:              1000
    total time taken by event execution: 158.7611
    per-request statistics:
         min:                                  0.01ms
         avg:                                158.76ms
         max:                               2596.96ms
         approx.  95 percentile:             482.29ms
 
Threads fairness:
    events (avg/stddev):           1000.0000/0.00
    execution time (avg/stddev):   158.7611/0.00
 
[root@localhost ~]#

Dòng bạn cần quan tâm là Read 9.375Mb  Written 6.25Mb  Total transferred 15.625Mb  (53.316Kb/sec)

Xóa file 150 GB đã tạo:

sysbench --test=fileio --file-total-size=150G cleanup

4. Benchmark mysql

Truy cập vào mysql và tạo db tên sysbench

Sau đó, dùng lệnh sau để tạo 1000000 bản ghi

sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password='passwordmysql' --mysql-db=sysbench --db-driver=mysql --tables=2 --table-size=1000000  prepare

Thay đổi passwordmysql với password mysql của bạn.

Output mẫu:

[root@localhost ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password='passwordmysql' --mysql-db=sysbench --db-driver=mysql --tables=2 --table-size=1000000  prepare
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Creating table 'sbtest1'...
Inserting 1000000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...
Creating table 'sbtest2'...
Inserting 1000000 records into 'sbtest2'
Creating a secondary index on 'sbtest2'...
[root@localhost ~]#

Trong đó:

  • --mysql-user : user sử dụng mysql
  • --mysql-password : password của user
  • --tables : Số bảng tạo
  • --table-size : Số bản ghi trong 1 bảng

Kiểm tra DB vừa tạo:

mysql -u root -p
> use sysbench;
> show table status like 'sbtest%' \G;

Mẫu:

mysql> show table status like 'sbtest%' \G;
*************************** 1. row ***************************
        Name: sbtest1
        Engine: InnoDB
        Version: 10
    Row_format: Compact
        Rows: 987448
Avg_row_length: 209
    Data_length: 207290368
Max_data_length: 0
Index_length: 14172160
    Data_free: 0
Auto_increment: 1000001
    Create_time: 2020-05-13 16:55:39
    Update_time: NULL
    Check_time: NULL
    Collation: latin1_swedish_ci
    Checksum: NULL
Create_options:
        Comment:
*************************** 2. row ***************************
        Name: sbtest2
        Engine: InnoDB
        Version: 10
    Row_format: Compact
        Rows: 986400
Avg_row_length: 228
    Data_length: 225132544
Max_data_length: 0
Index_length: 14172160
    Data_free: 0
Auto_increment: 1000001
    Create_time: 2020-05-13 16:56:06
    Update_time: NULL
    Check_time: NULL
    Collation: latin1_swedish_ci
    Checksum: NULL
Create_options:
        Comment:
2 rows in set (0.00 sec)

ERROR:
No query specified

Đẩy tải MySQL:

sysbench /usr/share/sysbench/select_random_points.lua --table-size=2000000 --num-threads=100 --rand-type=uniform --db-driver=mysql --mysql-db=sysbench --mysql-user=root --mysql-password=passwordmysql --time=30 run

Output mẫu:

[root@localhost ~]# sysbench /usr/share/sysbench/select_random_points.lua --table-size=2000000 --num-threads=100 --rand-type=uniform --db-driver=mysql --mysql-db=sysbench --mysql-user=root --mysql-password=passwordmysql run
WARNING: --num-threads is deprecated, use --threads instead
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 100
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            82667
        write:                           0
        other:                           0
        total:                           82667
    transactions:                        82667  (8218.14 per sec.)
    queries:                             82667  (8218.14 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          10.0569s
    total number of events:              82667

Latency (ms):
        min:                                    0.15
        avg:                                   12.11
        max:                                 1714.04
        95th percentile:                       22.69
        sum:                              1001460.17

Threads fairness:
    events (avg/stddev):           826.6700/277.16
    execution time (avg/stddev):   10.0146/0.01

[root@localhost ~]#

Thông số bạn cần quan tâm là transactions: 82667 (8218.14 per sec.)

Làm sạch DB sau khi test xong:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-db=sysbench --mysql-user=root --mysql-password='passwordmysql' --tables=1 cleanup

5. Benchmark RAM

Dùng lệnh:

sysbench --test=memory --num-threads=4 run

Output mẫu:

[root@localhost ~]# sysbench --test=memory --num-threads=4 run
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
WARNING: --num-threads is deprecated, use --threads instead
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 4
Initializing random number generator from current time


Running memory speed test with the following options:
  block size: 1KiB
  total size: 102400MiB
  operation: write
  scope: global

Initializing worker threads...

Threads started!

Total operations: 47007331 (4699425.66 per second)

45905.60 MiB transferred (4589.28 MiB/sec)


General statistics:
    total time:                          10.0006s
    total number of events:              47007331

Latency (ms):
         min:                                    0.00
         avg:                                    0.00
         max:                                   22.02
         95th percentile:                        0.00
         sum:                                19982.18

Threads fairness:
    events (avg/stddev):           11751832.7500/122424.02
    execution time (avg/stddev):   4.9955/0.08

[root@localhost ~]#

Bạn cần chú ý đến dòng:

Total operations: 47007331 (4699425.66 per second)

45905.60 MiB transferred (4589.28 MiB/sec)

Kết luận

Như vậy chúng tôi đã giới thiệu đến cho bạn vài bài test cơ bản với sysbench. Chúc các bạn thành công!!