Áp lực từ những con số: Tại sao không nên đoán mò hiệu năng?
App đang chạy ngon lành với 1.000 user, liệu có “sập” khi con số này vọt lên 10.000? Đừng ngồi đoán. Khi sếp duyệt chi nâng cấp server từ 4 Core 8GB RAM lên cấu hình mạnh hơn, bạn cần số liệu để chứng minh hiệu năng tăng trưởng thực sự.
Mình từng xử lý một ca khá căng: Migrate 100GB dữ liệu từ MySQL sang PostgreSQL. Mất 3 ngày lập kế hoạch và 1 ngày thực thi. Câu hỏi lớn nhất lúc đó không phải là cách chuyển data, mà là hệ thống mới có chịu nhiệt tốt như cũ không? Để trả lời, mình dùng số liệu từ sysbench thay vì dựa vào cảm giác.
Sysbench là công cụ mã nguồn mở cực mạnh để benchmark database kiểu OLTP. Nó giả lập hàng nghìn giao dịch đồng thời, ép database vào trạng thái giới hạn. Từ đó, các điểm nghẽn về CPU, RAM hay I/O ổ cứng sẽ lộ diện rõ ràng.
Cài đặt sysbench trên Linux
Hầu hết các bản phân phối Linux đều có sẵn sysbench trong repo chính thức. Việc cài đặt chỉ mất vài giây.
Trên Ubuntu/Debian:
sudo apt update
sudo apt install sysbench -y
Trên CentOS/RHEL:
sudo yum install epel-release -y
sudo yum install sysbench -y
Cài xong, hãy check bằng lệnh sysbench --version. Bản 1.0.x hiện là lựa chọn ổn định nhất cho anh em.
Quy trình 3 bước chuẩn chỉ
Dù test MySQL hay PostgreSQL, sysbench luôn chạy theo 3 giai đoạn: Prepare -> Run -> Cleanup.
- Prepare: Tạo bảng giả (như
sbtest1,sbtest2…) và bơm hàng triệu record. Nếu tập dữ liệu quá nhỏ (vừa khít trong RAM), kết quả sẽ ảo vì chưa ép được ổ cứng làm việc. - Run: Thực hiện các bài test đọc/ghi. Bạn có thể tùy chỉnh số luồng (threads), thời gian chạy và kiểu giao dịch.
- Cleanup: Xóa sạch các bảng tạm để trả lại dung lượng cho disk.
Benchmark thực tế cho MySQL
Đầu tiên, hãy tạo một database trống tên là test_db để làm bãi thử.
mysql -u root -p -e "CREATE DATABASE test_db;"
Bước 1: Chuẩn bị dữ liệu
Lệnh này tạo 10 bảng, mỗi bảng có 1 triệu bản ghi (tổng khoảng 10 triệu dòng).
sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-db=test_db \
--mysql-user=root \
--mysql-password='your_password' \
--db-driver=mysql \
--tables=10 \
--table-size=1000000 \
prepare
Bước 2: Chạy Load Test
Thử nghiệm với 16 luồng đồng thời trong 60 giây. Hãy quan sát CPU server lúc này.
sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-db=test_db \
--mysql-user=root \
--mysql-password='your_password' \
--db-driver=mysql \
--tables=10 \
--table-size=1000000 \
--threads=16 \
--time=60 \
--report-interval=10 \
run
Thông số cần nhớ:
--threads=16: Giả lập 16 kết nối cùng lúc.--time=60: Chạy trong 1 phút.--report-interval=10: Cứ mỗi 10 giây in kết quả một lần.
Benchmark cho PostgreSQL có gì khác?
Cú pháp gần như tương đương nhưng cần đổi driver. Bạn hãy đảm bảo máy đã cài sẵn thư viện libpq.
Khởi tạo Database:
sudo -u postgres psql -c "CREATE USER benchmark_user WITH PASSWORD 'password';"
sudo -u postgres psql -c "CREATE DATABASE benchmark_db OWNER benchmark_user;"
Thực thi Prepare:
sysbench /usr/share/sysbench/oltp_read_write.lua \
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-port=5432 \
--pgsql-user=benchmark_user \
--pgsql-password=password \
--pgsql-db=benchmark_db \
--tables=10 \
--table-size=1000000 \
prepare
Dùng lệnh run tương tự MySQL nhưng đổi các tham số sang --pgsql-*. Postgres quản lý transaction rất chặt, hiệu quả thấy rõ khi số lượng bảng tăng lên.
Đọc hiểu các chỉ số “sống còn”
Đừng hoảng trước đống chữ số trả về. Hãy tập trung vào 3 dòng then chốt này:
- transactions (TPS): Số giao dịch mỗi giây. TPS càng cao, database càng khỏe. Ví dụ, một VPS 2 Core thường đạt tầm 500-800 TPS cho bài test read-write.
- queries (QPS): Tổng số truy vấn (Select, Insert…) mỗi giây.
- latency (ms):
- 95th percentile: Đây là con số thực tế nhất. Nó nghĩa là 95% truy vấn hoàn thành nhanh hơn mức này. Nếu 95th > 100ms, user bắt đầu thấy app lag rõ rệt.
Theo dõi hệ thống khi test
Khi sysbench chạy, hãy mở thêm cửa sổ terminal khác để “soi” server:
htop: Check CPU. Nếu CPU 100% mà TPS vẫn thấp, có thể query đang thiếu Index.iostat -xz 1: Xem%utilcủa ổ cứng. Nếu chạm 100%, ổ cứng chính là nút thắt cổ chai.
Thực tế cho thấy nâng RAM từ 8GB lên 16GB đôi khi chẳng giúp TPS tăng mấy. Nhưng nếu đổi từ SSD thường sang NVMe, hiệu năng sẽ khác hẳn, nhất là khi test ghi dữ liệu.
Lời khuyên từ thực tế
Tuyệt đối đừng benchmark trực tiếp trên Production vào giờ cao điểm. Bạn chắc chắn không muốn nhận cuộc gọi từ sếp lúc nửa đêm vì sập hệ thống. Hãy dựng môi trường Staging giống hệt cấu hình thật để test.
Nên test nhiều lần với số thread tăng dần (1, 4, 8, 16, 32…). Việc này giúp bạn tìm ra “điểm bão hòa” của hệ thống. Đôi khi tăng thêm thread chỉ làm latency vọt lên do tranh chấp tài nguyên (locking).
Cuối cùng, đừng quên dọn dẹp bãi chiến trường:
sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql ... cleanup
Hy vọng công cụ này giúp bạn tự tin trả lời: “Database chịu tải được bao nhiêu?”. Chúc anh em tối ưu hệ thống thành công!

