#!/bin/bash ############################################################################### # simple script to set some parameters to increase performance on a mdadm # raid5 or raid6. Ajust the ## parameters ##-section to your system! # # WARNING: depending on stripesize and the number of devices the array might # use QUITE a lot of memory after optimization! # # 27may2010 by Alexander Peganz # 09oct2010 by Rafael Fonseca -- added option to tune2fs different drive ############################################################################### ## parameters ## MDDEV=md0 # e.g. md51 for /dev/md51 #FSDEV=$MDDEV # same as above for filesystem on device FSDEV=lvm-raid/lvm0 # used for LVM on RAID setups - e.g. /dev/lvm-raid/lvm CHUNKSIZE=1024 # in kb BLOCKSIZE=4 # of file system in kb NCQ=enable # disable, enable. ath. else keeps current setting NCQDEPTH=31 # 31 should work for almost anyone FORCECHUNKSIZE=true # force max sectors kb to chunk size > 512 DOTUNEFS=true # run tune2fs, ONLY SET TO true IF YOU USE EXT[34] RAIDLEVEL=raid5 # raid5, raid6 ## code ## # test for priviledges if [ "$(whoami)" != 'root' ] then echo $(date): Need to be root exit 1 fi # set number of parity devices NUMPARITY=1 if [[ $RAIDLEVEL == "raid6" ]] then NUMPARITY=2 fi # get all devices DEVSTR="`grep \"^$MDDEV : \" /proc/mdstat` eol" while [ -z "`expr match \"$DEVSTR\" '\(\ /sys/block/$MDDEV/md/stripe_cache_size # set max sectors kb DEVINDEX=0 MINMAXHWSECKB=$(cat /sys/block/sd${DEVS:0:1}/queue/max_hw_sectors_kb) until [ $DEVINDEX -ge $NUMDEVS ] do DEVLETTER=${DEVS:$DEVINDEX:1} MAXHWSECKB=$(cat /sys/block/sd$DEVLETTER/queue/max_hw_sectors_kb) if [ $MAXHWSECKB -lt $MINMAXHWSECKB ] then MINMAXHWSECKB=$MAXHWSECKB fi DEVINDEX=$[$DEVINDEX+1] done if [ $CHUNKSIZE -le $MINMAXHWSECKB ] && ( [ $CHUNKSIZE -le 512 ] || [[ $FORCECHUNKSIZE == "true" ]] ) then echo setting max sectors kb to match chunk size DEVINDEX=0 until [ $DEVINDEX -ge $NUMDEVS ] do DEVLETTER=${DEVS:$DEVINDEX:1} echo $CHUNKSIZE > /sys/block/sd$DEVLETTER/queue/max_sectors_kb DEVINDEX=$[$DEVINDEX+1] done DEVINDEX=0 until [ $DEVINDEX -ge $NUMSPAREDEVS ] do DEVLETTER=${SPAREDEVS:$DEVINDEX:1} echo $CHUNKSIZE > /sys/block/sd$DEVLETTER/queue/max_sectors_kb DEVINDEX=$[$DEVINDEX+1] done fi # enable/disable NCQ DEVINDEX=0 if [[ $NCQ == "enable" ]] || [[ $NCQ == "disable" ]] then if [[ $NCQ == "disable" ]] then NCQDEPTH=1 fi echo setting NCQ queue depth to $NCQDEPTH until [ $DEVINDEX -ge $NUMDEVS ] do DEVLETTER=${DEVS:$DEVINDEX:1} echo $NCQDEPTH > /sys/block/sd$DEVLETTER/device/queue_depth DEVINDEX=$[$DEVINDEX+1] done DEVINDEX=0 until [ $DEVINDEX -ge $NUMSPAREDEVS ] do DEVLETTER=${SPAREDEVS:$DEVINDEX:1} echo $NCQDEPTH > /sys/block/sd$DEVLETTER/device/queue_depth DEVINDEX=$[$DEVINDEX+1] done fi # tune2fs if [[ $DOTUNEFS == "true" ]] then STRIDE=$[$CHUNKSIZE/$BLOCKSIZE] STRWIDTH=$[$CHUNKSIZE/$BLOCKSIZE*($NUMDEVS-$NUMPARITY)] echo setting stride to $STRIDE blocks \($CHUNKSIZEkb\) echo setting stripe-width to $STRWIDTH blocks \($[$STRWIDTH*$BLOCKSIZE]kb\) tune2fs -E stride=$STRIDE,stripe-width=$STRWIDTH /dev/$FSDEV fi # exit echo $(date): Success exit 0