測試背景及環境說明
阿里雲ECS
主機配置:
4C8G
root@zabbix-master:~# grep -i "model name" /proc/cpuinfo model name : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz model name : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz model name : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz model name : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz root@zabbix-master:~# root@zabbix-master:~# free -m total used free shared buffers cached Mem: 8008 7863 144 0 209 6666 -/+ buffers/cache: 987 7020 Swap: 0 0 0 root@zabbix-master:~#
系統盤: SSD優化實例 20GB
數據盤: SSD 300GB
root@zabbix-master:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 254:0 0 20G 0 disk ├─vda1 254:1 0 20G 0 part / └─vda2 254:2 0 1M 0 part vdb 254:16 0 300G 0 disk /data sr0 11:0 1 1024M 0 rom root@zabbix-master:~#
操作系統:Debian 8.2
root@zabbix-master:~# cat /etc/debian_version 8.2 root@zabbix-master:~#
測試目的
測試阿里雲SSD的IO性能(主要是寫入),並選取合適的IO調度算法
測試步驟
查看系統支持的IO調度算法
root@zabbix-master:~# dmesg |grep -i scheduler [ 0.489195] io scheduler noop registered [ 0.489196] io scheduler deadline registered [ 0.489447] io scheduler cfq registered (default) root@zabbix-master:~#
測試系統盤vda
查看vda使用IO調度算法,是cfq
root@zabbix-master:/tmp# cat /sys/block/vda/queue/scheduler noop deadline [cfq] root@zabbix-master:/tmp#
測試cfq下vda的寫入
root@zabbix-master:/tmp# dd bs=1M count=1024 if=/dev/zero of=/tmp/test.w conv=fdatasync 記錄了1024+0 的讀入 記錄了1024+0 的寫出 1073741824字節(1.1 GB)已復制,17.1651 秒,62.6 MB/秒 root@zabbix-master:/tmp# root@zabbix-master:/tmp# du -sh test.w 1.1G test.w root@zabbix-master:/tmp#
將調整為noop進行測試
root@zabbix-master:/tmp# echo noop > /sys/block/vda/queue/scheduler root@zabbix-master:/tmp# cat /sys/block/vda/queue/scheduler [noop] deadline cfq root@zabbix-master:/tmp# root@zabbix-master:/tmp# rm -f test.w root@zabbix-master:/tmp# root@zabbix-master:/tmp# dd bs=1M count=1024 if=/dev/zero of=/tmp/test.w conv=fdatasync 記錄了1024+0 的讀入 記錄了1024+0 的寫出 1073741824字節(1.1 GB)已復制,17.5197 秒,61.3 MB/秒 root@zabbix-master:/tmp#
測試數據盤vdb
查看vdb使用IO調度算法,是cfq
root@zabbix-master:/data/dd_test# cat /sys/block/vdb/queue/scheduler noop deadline [cfq] root@zabbix-master:/data/dd_test#
測試cfq下vdb的寫入
root@zabbix-master:/data/dd_test# dd bs=1M count=1024 if=/dev/zero of=/data/dd_test/test.w conv=fdatasync 記錄了1024+0 的讀入 記錄了1024+0 的寫出 1073741824字節(1.1 GB)已復制,5.5823 秒,192 MB/秒 root@zabbix-master:/data/dd_test# root@zabbix-master:/data/dd_test# du -sh test.w 1.1G test.w root@zabbix-master:/data/dd_test#
調整為noop進行測試
root@zabbix-master:/data/dd_test# echo noop > /sys/block/vdb/queue/scheduler root@zabbix-master:/data/dd_test# cat /sys/block/vdb/queue/scheduler [noop] deadline cfq root@zabbix-master:/data/dd_test# root@zabbix-master:/data/dd_test# rm -f test.w root@zabbix-master:/data/dd_test# root@zabbix-master:/data/dd_test# dd bs=1M count=1024 if=/dev/zero of=/data/dd_test/test.w conv=fdatasync 記錄了1024+0 的讀入 記錄了1024+0 的寫出 1073741824字節(1.1 GB)已復制,5.73825 秒,187 MB/秒 root@zabbix-master:/data/dd_test#
調整為deadline進行測試
root@zabbix-master:/data/dd_test# echo deadline > /sys/block/vdb/queue/scheduler root@zabbix-master:/data/dd_test# cat /sys/block/vdb/queue/scheduler noop [deadline] cfq root@zabbix-master:/tmp# root@zabbix-master:/data/dd_test# du -sh test.w 1.1G test.w root@zabbix-master:/data/dd_test# root@zabbix-master:/data/dd_test# rm -f test.w root@zabbix-master:/data/dd_test# root@zabbix-master:/data/dd_test# dd bs=1M count=1024 if=/dev/zero of=/data/dd_test/test.w conv=fdatasync 記錄了1024+0 的讀入 記錄了1024+0 的寫出 1073741824字節(1.1 GB)已復制,5.63042 秒,191 MB/秒 root@zabbix-master:/data/dd_test#
順便測試跨盤(vda-->vdb)讀寫
root@zabbix-master:/data/dd_test# dd if=/dev/vda1 of=/data/dd_test/test.w bs=1M count=1024 conv=fdatasync 記錄了1024+0 的讀入 記錄了1024+0 的寫出 1073741824字節(1.1 GB)已復制,18.1907 秒,59.0 MB/秒 root@zabbix-master:/data/dd_test#
測試結果
①:雖然阿里雲的系統盤聲稱也是SSD,但是系統盤的讀寫速度明顯不及數據盤.
②:系統盤和數據盤的寫入速度(1M)在noop下和cfq還有deadline下沒有明顯的差異
疑問
跨盤讀寫測試中的瓶頸的出現在哪里?
vda讀?
vdb寫?
網絡?
PS:或許這個疑問的解答需要詳細的准備測試計划進行測試,同時測試1K,4K,8K,1M等數據大小;並分別測試讀,寫,雙向跨盤讀寫.
最終IO調度算法的選擇
系統盤: 仍然是cfq
數據盤: 選用deadline
參考調優准則:
Deadline對數據庫環境(ORACLE RAC,MYSQL等)是最好的選擇,由於數據盤主要是作為MySQL數據庫的數據目錄來使用,遵從此准則進行調整.
原因:
Deadline確保了在一個截止時間內服務請求,這個截止時間是可調整的,而默認讀期限短於寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象.
將IO調度算法的配置持久化寫入
我沒有使用修改grub的方式,而是將調整調度算法的操作寫到rc.local中
root@zabbix-master:/data/dd_test# grep scheduler /etc/rc.local echo deadline > /sys/block/vdb/queue/scheduler root@zabbix-master:/data/dd_test#
--此致--