测试背景及环境说明
阿里云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#
--此致--