Kiểm tra khả năng đọc ghi database của VPS bằng sysbench

Sysbench có tính năng kiểm tra đọc ghi cơ sở dữ liệu (csdl/database) rất hay, và hôm nay chúng ta sẽ đi vào thực hành kiểm tra nó trên một VPS phổ thông của Vultr.

Môi trường demo: Vultr HP, 1GB RAM, AMD64, OS: Ubuntu LTS 24.04.

Lưu ý: Chỉ test trên môi trường demo, không test trên VPS đã có website chính thức của bạn.

Tại sao kiểm tra này quan trọng cho web host trên VPS: chúng ta có chỉ số geekbench6 qua YABS rất tiện lợi, một chuẩn chung tốt, tuy nhiên nó nghiêng về đánh giá sức mạnh tổng thể với các nhiệm vụ đa dạng hướng tới tiêu chí của người dùng máy tính cá nhân. Bài test database của sysbench thì tập trung hơn, nó nhắm thẳng vào nhiệm vụ mà VPS cho website rất thường phải làm, đó là thao tác với csdl. Dĩ nhiên phép đo geekbench6 vẫn rất có ích nhưng rõ ràng bài test của sysbench cho thấy một chỉ số sức mạnh cực kỳ gần gũi với nhu cầu của website.


Bước 1: Tạo csdl trên VPS

a. Nạp danh sách các gói mới nhất cho Ubuntu:

sudo apt update

b. Tạo csdl MariaDB

sudo apt install mariadb-server -y

Với MySQL thì sử dụng lệnh sau:

sudo apt install mysql-server -y

c. Khởi động & kiểm tra trạng thái

sudo systemctl status mariadb

Cần thấy dòng thông báo: Active: active (running)

Với MySQL:

sudo systemctl status mysql

d. Cấu hình bảo mật cho database

sudo mysql_secure_installation

Làm theo hướng dẫn, thường nó sẽ hỏi nhập mật khẩu root để có quyền thao tác với database, sau đó người dùng root sẽ sử dụng database mà không cần thiết lập thêm mật khẩu nữa.

Trong quá trình cài đặt database
  • Remove anonymous users? (xóa người dùng ẩn danh): chọn Y
  • Disallow root login remotely? (ngăn root đăng nhập từ xa, ngoài localhost): chọn Y
  • Remove test database and access to it? (xóa database demo): chọn Y
  • Reload privilege tables now? (tải lại bảng đặc quyền ngay bây giờ): chọn Y

Bước 2: Chuẩn bị môi trường kiểm tra chính thức

a. Cài đặt sysbench

sudo apt install sysbench

b. Truy cập vào MariaDB/MySQL

sudo mysql -u root -p

Bước này sẽ yêu cầu nhập mật khẩu cho root.

c. Tạo database và người dùng cho sysbench

CREATE DATABASE sbtest;
CREATE USER 'sbuser'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON sbtest.* TO 'sbuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Ý nghĩa của đoạn trên:

  • Tạo bảng csdl tên sbtest;
  • Tạo người dùng sbuser cho database;
  • Chỉ cho phép truy cập qua localhost;
  • Phải có mật khẩu;
  • Người dùng sbuser có tất cả các quyền thao tác trên csdl sbtest;
  • Áp dụng các quyền đó ngay lập tức;
  • Thoát khỏi csdl;

Thay thế your_secure_password bằng mật khẩu mạnh mà bạn muốn. Nếu đổi thì các mã bên dưới có đoạn nào là your_secure_password thì bạn cũng phải đổi tương ứng. (PS: cứ giữ nguyên cũng không ảnh hưởng gì! test xong chúng ta cũng cài lại VPS thôi).

d. Tạo bảng cơ sơ dữ liệu 1 triệu dòng

Lệnh dưới đây hợp với VPS một lõi:

sysbench oltp_read_write \
    --threads=1 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --table-size=1000000 \
    --tables=4 \
    prepare

Trường hợp có nhiều lõi, số trong threads nên để tương ứng với số lõi của CPU.


Bước 3: Lệnh kiểm tra hiệu năng của database

a. Đơn luồng (--threads=1)

sysbench oltp_read_write \
    --threads=1 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --time=60 \
    --percentile=95 \
    run

--time=60 : nghĩa là kiểm tra đọc ghi database trong vòng 60 giây.

--percentile=95 : nghĩa là báo cáo độ trễ mà 95% giao dịch (các lệnh sql phối hợp để làm một nhiệm vụ) hoàn thành trong khoảng thời gian này. Có thể thay đổi con số này thành 97, 99 nếu muốn. Thông số phản ánh cảm nhận của đa số người dùng (95, 97, 99,…phần trăm người dùng)

b. Đa luồng (--threads=2)

Lưu ý: trước khi thực hiện bài kiểm tra mới cần phải dọn dẹp dữ liệu bảng (bước 5) rồi quay lại mục d, phần 2 để chuẩn bị bảng mới.

Ngay cả khi CPU của bạn chỉ có 1 lõi, bạn cũng nên thử đa luồng (số luồng là 2). Nếu có nhiều lõi hãy thử với luồng gấp đôi số lõi (ví dụ 2 lõi hãy thử --threads=4).

sysbench oltp_read_write \
    --threads=2 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --time=60 \
    --percentile=95 \
    run

c. Điều chỉnh thời gian hoặc/và percentile

Ví dụ bên dưới tăng thời gian kiểm tra database từ 60 lên 90 giây, ngoài ra nó đánh giá thời gian thực thi sự kiện ở phân vị 97 (thay vì 95 như trước).

sysbench oltp_read_write \
    --threads=1 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --time=90 \
    --percentile=97 \
    run

Một điểm cần lưu ý là khi chúng ta so sánh giữa 2 VPS chẳng hạn, các thông số đo như --time, --percentile cần phải thống nhất.


Bước 4: Phân tích kết quả

Kết quả trả về:

Kết quả kiểm tra thao tác với database bằng sysbench

Hãy tập trung vào các thông số sau:

SQL statistics (các thống kê liên quan đến SQL)

1. queries performed (hiệu suất truy vấn):

  • read (đọc) | Càng cao càng tốt: 472808
  • write (ghi) | Càng cao càng tốt: 135088
  • other (các hoạt động khác): 67544
  • total (tổng số) | Càng cao càng tốt: 657440

2. transactions (số lượng giao dịch/một tập hợp các lệnh đọc, ghi, và thao tác khác với csdl): 33772 (TPS: 562,85 giao dịch/giây). TPS càng cao càng tốt.

3. queries (số lượng truy vấn) | Càng cao càng tốt: 675440 (QPS: 11257,03 truy vấn/giây). QPS càng cao càng tốt.

4. ignored errors (các lỗi bị bỏ qua) | Càng thấp càng tốt: không có.

5. reconnects (kết nối lại) | Càng thấp càng tốt: trường hợp cụ thể này không có vấn đề kết nối lại với database.

General statistics (thống kê chung)

  • total time: tổng thời gian (bài test được thực hiện trong 60s).
  • total number of events (tổng số lượng các sự kiện, chính là giao dịch / transactions) | Càng cao càng tốt: 33772.

Latency (ms) / Độ trễ tính theo ms

Tính theo mỗi sự kiện (giao dịch).

  • min (thấp nhất) | Càng thấp càng tốt: 1,52ms
  • avg (trung bình) | Càng thấp càng tốt: 1,78ms
  • max (cao nhất) | Càng thấp càng tốt: 108,59ms
  • 95th percentile (95% sự kiện được hoàn thành trong) | Càng thấp càng tốt: 2,03ms
  • sum (tổng thời gian của tất cả sự kiện): 59951,24ms (=60s)

Threads fairness (sự cân bằng trong phân luồng)

  • events/sự kiện (avg/stddev) / (trung bình/độ lệch chuẩn): 33772/0
  • excution time (avg/stddev) / (trung bình/độ lệch chuẩn): 59,9512/0

Vì chỉ có 1 luồng nên không có chia luồng, do vậy không thấy lệch gì cả! Bạn có thể sẽ thấy nếu nó có từ 2 luồng trở lên.

Độ lệch chuẩn khi chạy đa luồng càng thấp càng tốt, vì nó thể hiện phân chia nhiệm vụ đều nhau giữa các luồng, bao gồm số lượng sự kiện & thời gian thực thi.

Kết quả trả về với 2 luồng:

Kết quả kiểm tra database với 2 luồng

Bước 5: Dọn dẹp dữ liệu cũ để test lại nếu muốn

Truy cập vào csdl với user sbuser:

sudo mysql -u sbuser -p

Nhập pass:

your_secure_password

Chọn database:

USE sbtest;

Hiển thị bảng:

SHOW TABLES;

Xóa các bảng:

DROP TABLE sbtest1, sbtest2, sbtest3, sbtest4;

Thoát csdl:

EXIT;

Rồi bạn quay lại bước 2.d để tạo các bảng mới chuẩn bị cho việc test lại.


Các lệnh kiểm tra hiệu năng khác nên thử

1. Chỉ đọc (read only)

a. Chuẩn bị

sysbench oltp_read_only \
    --threads=1 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --table-size=1000000 \
    prepare

b. Câu lệnh

2 luồng:

sysbench oltp_read_only \
    --threads=2 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --time=120 \
    --percentile=95 \
    run

Kết quả 2 luồng:

Kết quả trả về, chỉ đọc SQL, 2 luồng
Kết quả trả về, chỉ đọc SQL, 2 luồng

4 luồng:

sysbench oltp_read_only \
    --threads=4 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --time=120 \
    --percentile=95 \
    run

Kết quả 4 luồng:

Kết quả trả về, chỉ đọc SQL, 4 luồng
Kết quả trả về, chỉ đọc SQL, 4 luồng

8 luồng:

sysbench oltp_read_only \
    --threads=8 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --time=120 \
    --percentile=95 \
    run

Kết quả 8 luồng:

Kết quả trả về, chỉ đọc SQL, 8 luồng
Kết quả trả về, chỉ đọc SQL, 8 luồng

c. Xóa bảng (dọn dẹp) để chạy lệnh mới

sysbench oltp_read_only \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    cleanup

_*_

2. Chỉ ghi (write only)

a. Chuẩn bị

sysbench oltp_write_only \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    --table-size=1000000 \
    prepare

b. Câu lệnh

2 luồng:

sysbench oltp_write_only \
    --threads=2 \
    --time=120 \
    --percentile=95 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    run

Kết quả 2 luồng:

Kết quả trả về, chỉ ghi SQL, 2 luồng
Kết quả trả về, chỉ ghi SQL, 2 luồng

4 luồng:

sysbench oltp_write_only \
    --threads=4 \
    --time=120 \
    --percentile=95 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    run

Kết quả 4 luồng:

Kết quả trả về, chỉ ghi SQL, 4 luồng
Kết quả trả về, chỉ ghi SQL, 4 luồng

8 luồng:

sysbench oltp_write_only \
    --threads=8 \
    --time=120 \
    --percentile=95 \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    run

Kết quả 8 luồng:

Kết quả trả về, chỉ ghi SQL, 8 luồng
Kết quả trả về, chỉ ghi SQL, 8 luồng

c. Xóa bảng (dọn dẹp) để chạy lệnh mới

sysbench oltp_write_only \
    --mysql-host=localhost \
    --mysql-user=sbuser \
    --mysql-password=your_secure_password \
    --mysql-db=sbtest \
    cleanup

Lưu ý nhỏ với lệnh dọn dẹp:

  • Nếu tạo chỉ 1 bảng, câu lệnh dọn dẹp ngắn gọn (như với phần chỉ đọc & chỉ ghi).
  • Nếu tạo nhiều bảng, câu lệnh dọn dẹp sẽ phức tạp hơn (như với phần kiểm tra đọc ghi đồng thời), nhiều bảng thêm tham số --tables=<số bảng> trong phần chuẩn bị.
  • Nhiều bảng phản ảnh đúng thực tế hơn, vì csdl cho web thường có khá nhiều bảng.

Viết một bình luận