Benchmark khi vận hành hệ thống

Benchmark khi vận hành hệ thống

dạo này disk hư miết với lý do disk lỏm 😀 sẵn làm 1 bài giới thiệu cho các bạn hiểu 1 phần quan trọng của việc 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ụ đã golive .

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 hdparm
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
yum install siege

oke , install tới đây xong rồi , tiến hành test thôi .

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à totaltime. Đó 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     cachedMem:         15950      15771        179          0        190      14535-/+ buffers/cache:       1046      14904Swap:         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 bufferTố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 iozoneiozone -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/Sysbenchhttp://www.iozone.org/http://www.iozone.org/docs/IOzone_msword_98.pdfhttp://imysql.com/wp-content/uploads/2014/10/sysbench-manual.pdfhttp://www.jamescoyle.net/how-to/913-simple-bonnie-examplehttp://www.jamescoyle.net/how-to/599-benchmark-disk-io-with-dd-and-bonnie

Trả lời

Email của bạn sẽ không được hiển thị công khai.