Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách đánh giá hiệu suất của MySQL bằng SysBench

Trong bài viết này, chúng ta sẽ thảo luận về sysbench, tiêu chuẩn thực tế cho phép đo điểm chuẩn của MySQL. Chúng ta sẽ xem xét các khái niệm cơ bản về cách sử dụng sysbench và cách chúng ta có thể sử dụng sysbench để tìm hiểu về MySQL và điều thứ hai là khía cạnh quan trọng nhất đối với chúng ta. Trên thực tế, chúng tôi sẽ sử dụng sysbench như một công cụ để tạo ra lưu lượng truy cập mà chúng tôi biết rất nhiều vì sysbench sẽ lưu trữ một số thông tin về lưu lượng được tạo mỗi giây.

Kiểm tra MySQL SysBench

Sysbench là một công cụ điểm chuẩn đa luồng dựa trên luaJIT, đây là tiêu chuẩn thực tế cho các điểm chuẩn của MySQL, nó cần có khả năng kết nối với cơ sở dữ liệu.

Cài đặt Sysbench

Đầu tiên, chúng tôi cần cài đặt sysbench, tôi đang cài đặt sysbench trên một máy chủ khác để chúng tôi có thể kiểm tra tác động thực tế của tải trên máy chủ MySQL của chúng tôi.

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
yum -y install sysbench

Điều đó khiến việc cài đặt sysbench rất dễ dàng, tốt hơn hết là cho phép sysbench tương tác với Máy chủ MySQL ở cấp tường lửa, vì đây là môi trường thử nghiệm, tôi đã tắt tường lửa trên cả hai máy chủ để ngăn chặn bất kỳ khó khăn nào.

Môi trường sẵn sàng cho SysBench:

Đối với bài kiểm tra này, tôi đang tạo cơ sở dữ liệu sbtest và người dùng sbtest_user và sẽ cấp tất cả PRIVILEGES cho sbtest_user trên cơ sở dữ liệu sbtest.

sử dụng root;

mysql> create database sbtest
mysql> create user sbtest_user identified by 'password';
mysql> grant all on sbtest.* to `sbtest_user`@`%`;
mysql> show grants for sbtest_user;
+---------------------------------------------------------+
| Grants for [email protected]%                                |
+---------------------------------------------------------+
| GRANT USAGE ON *.* TO `sbtest_user`@`%`                 |
| GRANT ALL PRIVILEGES ON `sbtest`.* TO `sbtest_user`@`%` |
+---------------------------------------------------------+

Hiệu suất của MySQL bằng SysBench

Cấu hình điểm chuẩn:

Bước chuẩn bị của sysbench tạo ra các bảng với dữ liệu sẽ được sử dụng trong điểm chuẩn. Trong ví dụ này, chúng ta đang chạy lệnh chuẩn bị. Có một vài tham số với MySQL ở phần đầu, đó sẽ là các tham số kết nối. Các tham số khác là tham số của kiểm tra oltp_read_write.lua và chúng tôi đang chỉ định chính kiểm tra đó là oltp_read_write.lua và chúng tôi đang chạy lệnh chuẩn bị. Tùy chọn bắt đầu với MySQL đang chỉ định kết nối MySQL, tên máy chủ và cổng để kết nối, tên người dùng và mật khẩu để kết nối và lược đồ mặc định cho kết nối. Các bảng và tham số table_size là thuộc tính của kiểm tra oltp_read_write.lua.

Điều này có nghĩa là bước chuẩn bị sẽ tạo ra 16 bảng với 10.000 quy tắc trong mỗi bảng. Bước tiếp theo là chạy điểm chuẩn.

Để chạy thông thường, tất cả các tham số sẽ được chuyển cho chuẩn bị và một số tham số bổ sung mà chúng tôi đang xem xét bây giờ, những tham số này dành riêng cho quá trình chạy thực tế của điểm chuẩn. “TIME” tham số chỉ định giới hạn thời gian để điểm chuẩn chạy, không có nghĩa là thời gian không giới hạn, điểm chuẩn sẽ chạy cho đến khi chúng ta nhấn control + c. Đây là cách chúng tôi sẽ sử dụng sysbench trong phòng thí nghiệm và đây là cách mọi người thường sử dụng nó trong học tập chứ không phải trong thiết lập điểm chuẩn.

Chúng tôi chỉ muốn giải phóng lưu lượng truy cập vào thứ gì đó chúng tôi sẽ kiểm tra và chúng tôi có thể dừng nó bằng control + c sau khi chúng tôi hoàn tất quá trình kiểm tra.

“khoảng thời gian báo cáo” các tham số chỉ định tần suất thống kê sysbench được in. Thông thường, điều này được đặt thành 1 giống như trong ví dụ của chúng tôi, cái này làm cho sysbench in ra dòng trong mỗi giây. Ngay cả trong các thiết lập đo điểm chuẩn, thông số này vẫn được sử dụng rộng rãi vì hãy tưởng tượng nếu chúng ta có một điểm chuẩn kéo dài một giờ và cuối cùng chúng ta chỉ có thống kê tổng hợp, điều đó không cho biết bất cứ điều gì về việc phân phối dữ liệu như hiệu suất trên máy chủ theo thời gian. . “Chủ đề” tùy chọn chỉ định số lượng luồng máy khách hoặc kết nối MySQL để sử dụng trong sysbench. Số lượng chuỗi của ứng dụng khách cũng sẽ ảnh hưởng đến số lượng chuỗi máy chủ có thể được sử dụng. “tỷ lệ” tham số chỉ định tỷ lệ đến của các giao dịch sysbench như một cách thực sự đáp ứng tải do điểm chuẩn gây ra. Nếu các giao dịch có thể tiếp tục, chúng sẽ được xếp hàng đợi, đây lại là thứ thường được sử dụng trong loại thiết lập này, những gì chúng ta sẽ sử dụng bây giờ trong một kiểu thiết lập học tập.

Từ máy chủ sysbench:

Chuẩn bị tập dữ liệu:

Trên máy ảo đo điểm chuẩn, chúng ta sẽ chạy lệnh chuẩn bị sysbench để tạo cơ sở dữ liệu cho điểm chuẩn của chúng ta.

Ở đây, chúng ta có thể thấy rằng chúng ta đang sử dụng sbtest_user, nó làm tên người dùng, mật khẩu là mật khẩu và chúng ta đang kết nối với 192.168.66.5 DB làm máy chủ cơ sở dữ liệu.

sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password=password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
/usr/share/sysbench/oltp_read_write.lua prepare

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Creating table 'sbtest1'...
Inserting 10000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...
.
.
.
Creating table 'sbtest16'...
Inserting 10000 records into 'sbtest16'
Creating a secondary index on 'sbtest16'..

Bạn có cơ sở dữ liệu sbtest ngay tại đây, hãy thay đổi lược đồ mặc định thành cơ sở dữ liệu sbtest, kiểm tra xem chúng ta có những bảng nào.

Chúng tôi đã chỉ định rằng điểm chuẩn sẽ tạo ra mười sáu bảng và nó đã tạo ra 16 bảng, chúng tôi có thể xem nó ở đây

mysql> show tables;
+------------------+
| Tables_in_sbtest 
+------------------+
| sbtest1          |
| sbtest2          |
.
.
.
| sbtest16         |
+------------------+
16 rows in set (0.01 sec)

Hãy kiểm tra một vài bản ghi từ bảng.

mysql> select * from sbtest1 limit 6;

chúng tôi sẽ chạy một điểm chuẩn. Điểm chuẩn này sẽ có một dòng đầu ra cho mỗi giây vì chúng tôi đặt khoảng cách giữa các mối quan hệ bằng một và nó có bốn chuỗi khách hàng vì chúng tôi đặt các chuỗi bằng bốn.

--events=N                      limit for total number of events [0]
--time=N                        limit for total execution time in seconds [10]

Hai cài đặt trên (sự kiện và thời gian) chi phối thời gian SysBench sẽ tiếp tục chạy. Nó có thể thực thi một số truy vấn hoặc có thể tiếp tục chạy trong một thời gian xác định trước.

Trên máy chủ sysbench:

sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password=password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
--threads=4 \
--time=0 \
--events=0 \
--report-interval=1 \ 
/usr/share/sysbench/oltp_read_write.lua run

WARNING: Both event and time limits are disabled, running an endless test
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with the following options:
Number of threads: 4
Report intermediate results every 1 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!

[ 1s ] thds: 4 tps: 62.79 qps: 1320.63 (r/w/o: 933.91/257.15/129.57) lat (ms,95%): 80.03 err/s: 0.00 reconn/s: 0.00
[ 2s ] thds: 4 tps: 77.01 qps: 1530.26 (r/w/o: 1065.18/312.05/153.03) lat (ms,95%): 61.08 err/s: 0.00 reconn/s: 0.00
[ 3s ] thds: 4 tps: 74.03 qps: 1463.67 (r/w/o: 1025.47/289.13/149.07) lat (ms,95%): 70.55 err/s: 0.00 reconn/s: 0.00
[ 4s ] thds: 4 tps: 69.99 qps: 1414.84 (r/w/o: 991.89/282.97/139.98) lat (ms,95%): 65.65 err/s: 0.00 reconn/s: 0.00
[ 5s ] thds: 4 tps: 74.02 qps: 1488.34 (r/w/o: 1048.24/292.07/148.03) lat (ms,95%): 74.46 err/s: 0.00 reconn/s: 0.00
[ 6s ] thds: 4 tps: 72.99 qps: 1444.89 (r/w/o: 1003.92/294.98/145.99) lat (ms,95%): 70.55 err/s: 0.00 reconn/s: 0.00
[ 7s ] thds: 4 tps: 63.00 qps: 1271.04 (r/w/o: 890.03/255.01/126.00) lat (ms,95%): 87.56 err/s: 0.00 reconn/s: 0.00
[ 8s ] thds: 4 tps: 72.99 qps: 1439.82 (r/w/o: 1008.87/284.96/145.98) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00
[ 9s ] thds: 4 tps: 74.00 qps: 1488.01 (r/w/o: 1038.01/302.00/148.00) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00

vì vậy chúng tôi có thể thấy rằng nó đang thực hiện khoảng 70 80 giao dịch mỗi giây trên máy của tôi, tương đương với hơn một nghìn truy vấn mỗi giây. Điều này đang chạy trong VirtualBox trên máy tính xách tay.

Từ các truy vấn này, chúng ta có thể xem có bao nhiêu trong số chúng được đọc, bao nhiêu trong số chúng được ghi, bao nhiêu trong số chúng là khác độ trễ phân vị thứ 95 cho giao dịch (r / w / o:1038.01 / 302.00 / 148.00), như thế nào chúng ta có bao nhiêu lỗi mỗi giây (err / s:0,00) và chúng ta có bao nhiêu kết nối mỗi giây (recn / s:0,00). Bởi vì chúng tôi chỉ định thời gian bằng 0, điều này sẽ chạy cho đến khi chúng tôi nhấn ctrl + c.

Hãy kiểm tra danh sách quy trình hiển thị trên máy chủ cơ sở dữ liệu.

mysql> show processlist;
+----+-----------------+--------------------+--------+---------+-------+----------------------------+--------------------------------------+
| Id | User            | Host               | db     | Command | Time  | State                      | Info                                 |
+----+-----------------+--------------------+--------+---------+-------+----------------------------+--------------------------------------+
|  5 | event_scheduler | localhost          | NULL   | Daemon  | 23200 | Waiting on empty queue     | NULL                                 |
| 11 | root            | localhost          | NULL   | Sleep   | 18438 |                            | NULL                                 |
| 19 | root            | localhost          | sbtest | Query   |     0 | starting                   | show processlist                     |
| 23 | root            | localhost          | NULL   | Sleep   |  4098 |                            | NULL                                 |
| 30 | sbtest_user     | 192.168.66.6:37298 | sbtest | Sleep   |     0 |                            | NULL                                 |
| 31 | sbtest_user     | 192.168.66.6:37300 | sbtest | Execute |     0 | waiting for handler commit | COMMIT                               |
| 32 | sbtest_user     | 192.168.66.6:37302 | sbtest | Sleep   |     0 |                            | NULL                                 |
| 33 | sbtest_user     | 192.168.66.6:37304 | sbtest | Execute |     0 | Opening tables             | SELECT c FROM sbtest13 WHERE id=4978 |
+----+-----------------+--------------------+--------+---------+-------+----------------------------+--------------------------------------+

8 hàng trong bộ (0,00 giây)

Máy chủ cơ sở dữ liệu thực tế luôn bận rộn. Tôi thấy rằng thời gian thực thi không bao giờ thay đổi từ 0 trên thực tế và rất dễ bắt máy chủ cơ sở dữ liệu đang hoạt động như khi nó đang chạy “SELECT c FROM sbtest13 WHERE id =4978”. Và chắc chắn, chúng tôi có bốn kết nối từ máy đo điểm chuẩn

Theo mặc định, SysBench sẽ cố gắng thực thi các truy vấn nhanh nhất có thể. Để mô phỏng lưu lượng truy cập chậm hơn, tùy chọn này có thể được sử dụng. Bạn có thể xác định ở đây có bao nhiêu giao dịch sẽ được thực hiện mỗi giây.

--rate=N                        average transactions rate. 0 for unlimited rate [0]

Trên máy chủ sysbench

[[email protected] ~]# sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password=password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
--threads=4 \
--time=0 \
--events=0 \
--report-interval=1 \
--rate=40 \
/usr/share/sysbench/oltp_read_write.lua run

WARNING: Both event and time limits are disabled, running an endless test
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the test with following options:
Number of threads: 4
Target transaction rate: 40/sec
Report intermediate results every 1 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!

[ 1s ] thds: 4 tps: 42.87 qps: 858.43 (r/w/o: 600.20/171.49/86.74) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00
[ 1s ] queue length: 0, concurrency: 1
[ 2s ] thds: 4 tps: 41.01 qps: 857.25 (r/w/o: 609.17/164.05/84.02) lat (ms,95%): 101.13 err/s: 0.00 reconn/s: 0.00
[ 2s ] queue length: 0, concurrency: 3
[ 3s ] thds: 4 tps: 57.01 qps: 1119.29 (r/w/o: 778.20/228.06/113.03) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00
[ 3s ] queue length: 0, concurrency: 2
.
.
.
[ 15s ] thds: 4 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00
[ 15s ] queue length: 145, concurrency: 4
[ 16s ] thds: 4 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00
[ 16s ] queue length: 179, concurrency: 4

Vì vậy, tham số mới ở đây là –rate bằng 40 có nghĩa là chúng ta sẽ có hai dòng mỗi giây, hai dòng đầu ra chứ không phải một. Vì chúng tôi đặt tốc độ xuất hiện của các sự kiện điểm chuẩn là 40 mỗi giây, chúng tôi sẽ thấy TPS hiện tại.

Điều này không được đảm bảo là 40 / giây nhưng sự xuất hiện đảm bảo rằng trung bình chúng tôi thực hiện khoảng 40 giao dịch mỗi giây và chúng tôi có thể theo dõi độ dài hàng đợi và đồng thời trên dòng thứ hai. Nếu chúng tôi thực hiện một danh sách quy trình ngắn thì việc bắt cơ sở dữ liệu ở trạng thái mà một số kết nối đang chờ ở đây sẽ dễ dàng hơn nhiều.

Trong khi một phiên bận, bạn có thể thấy rằng giao dịch mỗi giây bằng 0 (tps:0,00).

mysql> show processlist;
+----+-----------------+--------------------+--------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+
| Id | User            | Host               | db     | Command | Time  | State                  | Info                                                                                                 |
+----+-----------------+--------------------+--------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+
|  5 | event_scheduler | localhost          | NULL   | Daemon  | 19162 | Waiting on empty queue | NULL                                                                                                 |
|  8 | root            | localhost          | NULL   | Query   |     0 | starting               | show processlist                                                                                     |                                                                                                |
| 21 | sbtest_user     | 192.168.66.6:49060 | sbtest | Execute |    33 | updating               | UPDATE sbtest8 SET k=k+1 WHERE id=5005                                                               |
| 22 | sbtest_user     | 192.168.66.6:49062 | sbtest | Execute |    22 | updating               | UPDATE sbtest14 SET c='54592761471-89397085016-24424731626-29460127219-18466786462-73074657089-48925 
| 23 | sbtest_user     | 192.168.66.6:49064 | sbtest | Execute |    21 | updating               | UPDATE sbtest10 SET c='68520795048-46094139936-88850487689-12482054639-29231339380-71050139550-93403 |
| 24 | sbtest_user     | 192.168.66.6:49066 | sbtest | Execute |    31 | updating               | DELETE FROM sbtest14 WHERE id=4994                                                                   |
+----+-----------------+--------------------+--------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)

Chúng ta có thể thấy rằng nó đang ngủ trong một vài giây, điều này là khá bất khả thi trong kịch bản trước đó để có được một cái gì đó như thế này.

Lưu lượng truy cập dày đặc với Báo cáo kết thúc:

Hãy thực hiện khối lượng công việc nhiều ghi (nhưng không chỉ ghi) và ví dụ:hiệu suất của hệ thống con I / O kiểm tra, như tôi đã đề cập time =300 sau đó điểm chuẩn sẽ chạy trong 300 giây và Nó sẽ cung cấp cho chúng tôi báo cáo kết thúc để phân tích nó.

[[email protected] ~]#   
sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password=password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
--threads=8 \
--time=300 \
--events=0 \
--report-interval=1 \
--rate=40 \
/usr/share/sysbench/oltp_read_write.lua run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 8
Target transaction rate: 40/sec
Report intermediate results every 1 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!

[ 1s ] thds: 8 tps: 39.87 qps: 810.27 (r/w/o: 570.08/159.46/80.73) lat (ms,95%): 82.96 err/s: 0.00 reconn/s: 0.00
[ 1s ] queue length: 0, concurrency: 1
[ 2s ] thds: 8 tps: 43.02 qps: 847.39 (r/w/o: 590.27/172.08/85.04) lat (ms,95%): 125.52 err/s: 0.00 reconn/s: 0.00
[ 2s ] queue length: 0, concurrency: 0
.
.
.
[ 350s ] thds: 8 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00
[ 350s ] queue length: 6545, concurrency: 1
SQL statistics:
    queries performed:
        read:                            78624
        write:                           22385
        other:                           11205
        total:                           112214
    transactions:                        5589   (15.94 per sec.)
    queries:                             112214 (320.02 per sec.)
    ignored errors:                      27     (0.08 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          350.6412s
    total number of events:              5589

Latency (ms):
         min:                                   12.45
         avg:                                74639.59
         max:                               213244.02
         95th percentile:                   100000.00
         sum:                            417160677.24

Threads fairness:
    events (avg/stddev):           698.6250/196.36
    execution time (avg/stddev):   52145.0847/15557.93

PHÂN TÍCH BÁO CÁO:

Điều này khá hữu ích để kiểm tra báo cáo cuối cùng sẽ chỉ cung cấp cho bạn mức trung bình. Kết quả trung gian sẽ giúp bạn có thể theo dõi hiệu suất trên cơ sở từng giây. Báo cáo cuối cùng có thể trông giống như trên, Bạn sẽ tìm thấy ở đây thông tin về các truy vấn đã thực hiện, các giao dịch đã được thực hiện, có bao nhiêu lỗi đã xảy ra, bất kỳ kết nối nào đã xảy ra, thông lượng và tổng thời gian đã trôi qua là bao nhiêu. Bạn cũng có thể kiểm tra số liệu độ trễ và phân phối truy vấn trên các chuỗi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nhận dữ liệu một tháng trước trong MySQL

  2. SQL SERVER - Thủ thuật - Chạy SSMS với tài khoản Windows khác nhau

  3. Tầm quan trọng của độ dài varchar trong bảng MySQL

  4. Cách kiểm tra đặc quyền của người dùng trong MySQL Workbench bằng GUI

  5. MySQL:VARCHAR lớn so với TEXT?