目录
一、队列深度
二、调度算法
三、预读量
四、I/O对齐
一、队列深度
队列深度决定了给块设备写I/O的最大并发数,对于Linux系统,默认值为128,一般情况下不建议用户修改此参数。用户可以使用cat命令查询当前块设备队列深度。
linux-ob3a:~ # cat /sys/block/sdc/queue/nr_requests
128
当对系统进行极限性能测试时,为了增大主机写I/O的压力及I/O在队列中被合并的概率,可以适当的增大此参数。可以通过如下方法临时修改块设备的队列深度。
echo 256 > /sys/block/sdc/queue/nr_requests
临时修改块设备队列深度可以用于性能调优,当应用服务器重启后,块设备队列深度将恢复为默认值。
二、调度算法
Linux操作系统2.6内核支持四种块设备调度算法:noop,anticipatory,deadline和cfq。默认的调度算法为cfq。用户可以使用cat命令查询当前块设备调度算法。
linux-ob3a:~ # cat /sys/block/sdc/queue/scheduler
noop deadline [cfq]
调度算法配置不当会对系统性能产生影响,如I/O并发等。可以通过如下方法临时修改块设备的调度算法。
echo noop > /sys/block/sdc/queue/scheduler
临时修改调度算法可以用于性能调优,当应用服务器重启后,调度算法将恢复为默认值。
三、预读量
Linux的预读功能类似于阵列的预读算法,仅对顺序读有效且会对顺序流进行识别,并提前读取“read_ahead_kb”(单位为扇区)长度的数据。例如,SUSE 11操作系统预读量的默认值为512扇区,即256KB。用户可以使用cat命令查询当前块设备预读量。
linux-ob3a:~ # cat /sys/block/sdc/queue/read_ahead_kb
512
当业务需要对大量的大文件进行读取时,可以通过适当调大此参数提升性能。可以通过如下方法修改块设备的预读量。
echo 1024 > /sys/block/sdc/queue/read_ahead_kb
四、I/O对齐
在Linux或Windows Server 2003之前版本的操作系统中使用MBR格式创建分区时,会将磁盘的最开始63个扇区预留给主引导记录和分区表,第一个分区默认从第64扇区开始。这造成了主机的数据块(数据库或文件系统)与存储数据块不对齐,导致I/O处理效率降低。
Linux操作系统解决I/O不对齐的方法有两种:
- 方法一:更改分区开始位置。
在Linux系统中使用MBR格式创建分区时,建议进入fdisk命令的专家模式,设置首分区的开始位置为LUN的第二个Extent的开始位置(Extent大小默认是4MB)。下面的快速命令用在/dev/sdb上使用MBR格式创建1个分区,使用/dev/sdb的全部空间,开始扇区设置为8192,即4MB。
printf "n\np\n1\n\n\nx\nb\n1\n 8192\nw\n" | fdisk /dev/sdb
- 方法二:直接采用GPT格式分区。
下面的快速命令用于在/dev/sdb上使用GPT格式创建1个分区,使用/dev/sdb的全部空间,开始扇区设置为8192,即4MB。
parted -s -- /dev/sdb "mklabel gpt" "unit s" "mkpart primary 8192 -1" "print"
对于Windows Server 2003之前版本的系统中创建MBR分区时,建议使用diskpart命令,设置分区对齐。
diskpart> select disk 1
diskpart> create partition primary align=4096