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
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
Sử dụng hdparm để đo tốc độ đọc với cache và với buffer
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
-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;
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;
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