Bài đăng nổi bật

Redo log, undo log và binary log

Đây là ba loại log mà bạn đã từng nghe khi tiếp cận mysql. Trong các cơ sở dữ liệu quan hệ (RDBMS) khác, cũng sẽ có các thành phần có vai tr...

Thứ Năm, 25 tháng 2, 2016

Kỹ thuật benchmark

Bạn khó có thể biết chính xác khả năng hoạt động server cho đến khi benchmark. Kết quả benchmark không chỉ tiết lộ ngưỡng hoạt động ở mức trần của server, của dịch vụ trên server mà còn giúp bạn loại trừ những sự cố tiềm ẩn. Ví dụ: Bạn có thể biết được disk có vấn đề khi kết quả benchmark cho tốc độ đo có chừng 53MB/s. Sẽ thật tai hại nếu sử dụng ổ cứng đó cho dịch vụ. Phát hiện và thay thế sớm sẽ bớt đau đớn hơn rất nhiều khi dịch vụ đã online.

Bài viết này sẽ lượt qua các kỹ thuật benchmark CPU, disk, memory và một số dịch vụ phổ thông như mysql service, web service. Dưới đây là danh sách các công cụ tôi sử dụng:
- sysbench
- dd
- hdparm
- bonnie++
- iozone
- siege

Cài đặt công cụ


Cài đặt sysbench

Với sysbench, tôi tải bản mới nhất từ repo của percona.
wget http://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-3.noarch.rpm

rpm -ivh percona-release-0.1-3.noarch.rpm

yum clean all

yum install sysbench

Cài đặt dd

dd đã có sẵn, bạn không cần cài đặt

Cài đặt hdparm

Tôi cài từ base repo
yum install hdparm

Cài đặt bonnie++

Tôi cài từ epel repo
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

rpm -ivh epel-release-latest-6.noarch.rpm

yum clean all

yum install hdparm

Cài đặt iozone

Tôi cài iozone từ source code
wget http://www.iozone.org/src/current/iozone3_434.tar

tar xvf iozone3_434.tar

cd iozone3_434/src/current

make linux-AMD64 ### chọn đúng platform của bạn, gõ make, bạn sẽ thấy các platform mà iozone hỗ trợ

Một file iozone sẽ được tạo ra, bạn chỉ cần copy file đó vào /usr/bin để sử dụng
cp iozone /usr/bin

iozone -version
       'Iozone' Filesystem Benchmark Program

        Version $Revision: 3.434 $
Compiled for 64 bit mode.
....

Cài đặt siege

Tôi sử dụng bản siege trên repo epel
yum install siege

Test CPU


Trong các công cụ kể trên có sysbench hỗ trợ test CPU. Bài test này sẽ kiểm tra năng lực tính toán số nguyên tố của CPU.

Với CPU  Version: Intel(R) Xeon(R) CPU           X5690  @ 3.47GHz   có 8 cores

Chạy test với 1 thread - Mặc định các bài test luôn chạy với 1 thread nếu bạn không chỉ định
sysbench --test=cpu --cpu-max-prime=20000 --num-threads=1 run



Bạn sẽ thấy khá nhiều chỉ số trong kết quả nhưng đáng quan tâm nhất là total time. Đó là thời gian để CPU hoàn tất bài test với số thread quy định. Với một thread, thì total time là 23.9351s

Nếu sử dụng hết số thread
sysbench --test=cpu --cpu-max-prime=20000 --num-threads=8 run



Tổng thời gian cần để hoàn thành bài test là 3.1134s

Nếu bạn cố sử dụng nhiều hơn số thread mà hệ thống thực tế có, ở đây giới hạn là 8 thì kết quả cũng không có gì khác biệt. Vậy tóm lại, với CPU nói trên, huy động hết năng lực thì bài test sẽ hoàn thành trong 3.1134s

Để biết con số này là tốt hay không, bạn cần lập lại cùng bài test trên các server khác có CPU khác, với số thread tương ứng. Với hệ thống có CPU 32 core thì tôi thường làm các bài test với 1-8-16-32 threads để thấy rõ hiệu quả của thread. Theo kinh nghiệm thì với cùng bài test trên, con số total time thường dao động từ trên 20s đến dưới 30s khi CPU chạy với 1 thread.

Test memory


Test read

sysbench --test=memory --memory-block-size=1K --memory-scope=global --memory-total-size=100G --memory-oper=read run


Với 1 thread, tôi có total time 19.4719s

Test write

sysbench --test=memory --memory-block-size=1K --memory-scope=global --memory-total-size=100G --memory-oper=write run


Với 1 thread, tôi có total time là 27.0627s

Test Disk


Sử dụng dd để đo tốc độ đọc/ghi tuần tự

Chúng ta có khá nhiều công cụ để test disk, đơn giản nhất có thể dùng dd, nhưng công cụ này chỉ giúp tìm ra tốc độ đọc/ghi tuần tự trên disk. Kết quả này ít có ý nghĩa thực tế ngay trên rotation disk (một số dịch vụ như mysql ghi đoc redo log theo kiểu tuần tự thì chỉ số này cũng đáng tham khảo) và hoàn toàn vô nghĩa trên ổ SSD. 

Sử dụng dd để đo sequence read/write cần đặc biệt cẩn thận vì bản chất lệnh dd.

time sh -c "dd if=/dev/zero of=/root/test_write_disk_with_dd bs=4K count=2000000 && sync"

20000000 lần, mỗi lần 4K cho kết quả file khoảng 8.2G

Kết quả:
8192000000 bytes (8,2 GB) copied, 10,3918 s, 788 MB/s

real 0m10.913s
user 0m0.240s
sys 0m9.639s

Tốc độ khoảng 788MB/s, thời gian hoàn thành bài test là 10.913s
Thường thì data được ghi xuống theo từng block cỡ 4-16KB nên tôi không test với bs lớn.

Quan sát free -m trước khi làm ghi file:
             total       used       free     shared    buffers     cached
Mem:         15950       1475      14475          0        190        638
-/+ buffers/cache:        646      15304
Swap:         2047          0       2047

và sau khi ghi file:
             total       used       free     shared    buffers     cached
Mem:         15950      15771        179          0        190      14535
-/+ buffers/cache:       1046      14904
Swap:         2047          0       2047

File tôi ghi xuống bằng dd đã được cache lại trong memory để phục vụ yêu cầu đọc sau này.

Để test tốc độ đọc disk bằng dd, trước hết cần làm đẩy hết data của file test_write_disk_with_dd đang nằm trong cache bằng cách tạo ra một file có dung lượng vượt quá lượng memory bạn đang có, tốt nhất là gấp 2 lần. Nội dung file mới này sẽ thay thế test_write_disk_with_dd nằm trong cache.

dd if=/dev/zero of=/root/full_cache_tmp bs=4K count=6000000

Sau đó, đọc lại chính file bạn vừa tạo ra khi test tốc độ ghi với dd ở trên

time sh -c "dd if=/root/test_write_disk_with_dd of=/dev/null bs=4K count=2000000"

Sử dụng hdparm để đo tốc độ đọc với cache và với buffer

Tốc độ đọc từ cache và buffer
hdparm -tT /dev/sda



Sử dụng bonnie++

bonnie++ -d /root/bonnie -u root -g root -r 15950 -b -m "BENCHMARK WITH BONNIE" -x 3 -s 32768

-d là director sử dụng cho bonnie để benchmark, đó nên là một empty directory
-r là tổng lượng memory mà server có, lấy từ output của free -m
-b sẽ loại bỏ buffer khi test, sync trực tiếp xuống disk
-m chỉ là nhãn cho kết quả
-x là số lần test
-s là độ lớn file, yêu cầu cần gấp đôi lượng memory mà server có.

Sử dụng bon_csv2html, một công cụ đi kèm bonnie++ để convert kết quả ra human readable html file. Sử dụng trình duyệt để xem kết quả đó.

Sử dụng iozone

iozone -a -g 32G -R -b output.xls

-g cần xác định giá trị gấp đôi dung lượng memory hiện có
-R và -b để kết xuất kết quả ra file xls
-a full automatic mode, bạn có thể chỉ định từng mode test cụ thể qua tham số -i thay vì dùng -a
-i 0: cho write/rewrite
-i 1: cho read/reread
-i 2: random read/write
-i 8: random mix

Sử dụng sysbench

Chuẩn bị data
sysbench --test=fileio --file-total-size=32G prepare

Cũng theo nguyên tắc trước đó, --file-total-size luôn lớn hơn lượng memory hiện có ít nhất 2 lần

Test random write:

for each in 1 8 16 32; do sysbench --test=fileio --file-total-size=32G --file-test-mode=rndwr --max-time=240 --max-requests=0 --file-block-size=4K --num-threads=$each run; sleep 10; done; 

Test random read:

for each in 1 8 16 32; do sysbench --test=fileio --file-total-size=32G --file-test-mode=rndrd --max-time=240 --max-requests=0 --file-block-size=4K --num-threads=$each run; sleep 10; done; 

--max-time sẽ giới hạn bài test kéo dài khoảng 240s, tương ứng 4 phút
--max-requests=0 sẽ không giới hạn số lượng request trong khoảng thời gian test

Test Mysql


Chuẩn bị data:
sysbench --test="/usr/share/doc/sysbench/tests/db/oltp.lua" --oltp-table-size=30000000 --mysql-table-engine=innodb --mysql-db=sysbench --mysql-user=sysbench --mysql-password=sysbench --num-threads=32 prepare

30000000 tương ứng với 7.9G data mẫu

Test với read-only request:

for each in 1 8 16 32; do sysbench --test="/usr/share/doc/sysbench/tests/db/oltp.lua" --oltp-table-size=30000000 --mysql-table-engine=innodb --mysql-db=sysbench --mysql-user=sysbench --mysql-password=sysbench --max-time=240 --max-requests=0 --oltp-read-only  --num-threads=$each run; sleep 10; done;

Test với mix request (70% read + 30% write), random reconnect:

for each in 1 8 16 32; do sysbench --test="/usr/share/doc/sysbench/tests/db/oltp.lua" --oltp-table-size=30000000 --mysql-table-engine=innodb --mysql-db=sysbench --mysql-user=sysbench --mysql-password=password --max-time=240 --max-requests=0 --oltp-reconnect-mode=random --num-threads=$each run; sleep 10; done;

--max-time sẽ giới hạn bài test kéo dài khoảng 240s, tương ứng 4 phút
--max-requests=0 sẽ không giới hạn số lượng request trong khoảng thời gian test
--oltp-read-only sẽ chỉ cho phép các read request đến db
--oltp-reconnect-mode sẽ điều chỉnh chế độ reconnect lại db

Test Web


siege -c3000 -t5m -d5 -i  -f urls.txt
-c chỉ định số CCU - Concurrent user
-t chỉ định thời gian tiến hành bài test
-i internet mode, tham số này chỉ có giá trị nếu đi kèm với urls.txt
-d mỗi user mô phỏng bởi siege sẽ sleep trong khoảng thời gian giữa 0 và giá trị khai báo bởi -d trước khi hit tiếp vào URL
-f urls.txt sẽ chứa các url muốn test

Tham khảo:

https://wiki.mikejung.biz/Sysbench
http://www.iozone.org/
http://www.iozone.org/docs/IOzone_msword_98.pdf
http://imysql.com/wp-content/uploads/2014/10/sysbench-manual.pdf
http://www.jamescoyle.net/how-to/913-simple-bonnie-example
http://www.jamescoyle.net/how-to/599-benchmark-disk-io-with-dd-and-bonnie

Không có nhận xét nào:

Đăng nhận xét