===== Change devices parameters for tuning =====
This script can be executed on LPAR, and also on root, without argument, it's just a preview. With '-f' it will FIX all changes, it possible it's directly applied, else at the end it report all parameters currently set that will be changed after the reboot.
==== Environment variables ====
Centralize variables for all scripts: .env file
# global variables for all scripts
export binpath=/root/script/bin
export sn=`basename $0 | cut -d. -f1`
export HOSTNAME=`hostname`
export logpath=/root/script/log
export logname=$logpath/$sn.log
export configfile=$binpath/$sn.cfg
export destination="test@test.com"
==== File_name ====
**change_devices_param.sh**
Change disks and adapter settings:
#!/bin/ksh93
#set -x
#############################################
#@(#) Change disk and adapter attribute on a host
#############################################
# check if a disk on LPAR has the same path
# version 1.0 08-04-2010 Manu
# version 1.1 21-09-2015
#############################################
dir=`dirname $0`
. $dir/.env
#------------------------------------------------
# usage ()
#------------------------------------------------
usage()
{
echo "Usage: (" "|-v|-f)"
echo "\tChange disks and adapter parameters on LPAR or VIOS if needed"
echo "\tFirst try to change, if not succeed, change to ODM only"
echo "\t-v: verbose (default yes)"
echo "\t-f: fix correct parameter (default no)"
}
#------------------------------------------------
# chhostval ()
# try to change a value on a device, if it
# doesn't succeed, then change in ODM only
#------------------------------------------------
chhostval()
{
dev=$1
attr=$2
val=$3
difference=$4
if [ ${#} -ne 4 ]
then
difference="equal"
fi
val1=$(echo $val | sed 's/^0x//')
value=$(lsattr -El $dev | grep "^$attr " | awk '{print $2}')
value1=$(echo $value | sed 's/^0x//')
if [ $difference == "higher" ]
then
if [ $(expr ${value1} \< ${val1}) -eq 1 ]
then
if [ $fix != "yes" ]
then
printf "\E[31;1m""!!! FIX. $attr need to be changed from $value to $val !!!"" $1\E[0m\n"
else
printf "\E[31;1m""FIX. $attr will be changed from $value to $val"" $1\E[0m\n"
chdev -l $dev -a $attr=$val > /dev/null 2>&1
if [ "$?" -ne 0 ]
then
chdev -l $dev -a $attr=$val -P
echo "must be rebooted before changes applies"
else
printf "\E[32;1m""OK. $attr for $dev changed to $val"" $1\E[0m\n"
fi
sleep 1
fi
else
printf "\E[32;1m""OK. $attr for $dev is already $value"" $1\E[0m\n"
fi
else
if [ $difference == "lower" ]
then
if [ $(expr ${value1} \> ${val1}) -eq 1 ]
then
if [ $fix != "yes" ]
then
printf "\E[31;1m""!!! FIX. $attr need to be changed from $value to $val !!!"" $1\E[0m\n"
else
printf "\E[31;1m""FIX. $attr will be changed from $value to $val"" $1\E[0m\n"
chdev -l $dev -a $attr=$val > /dev/null 2>&1
if [ "$?" -ne 0 ]
then
chdev -l $dev -a $attr=$val -P
echo "must be rebooted before changes applies"
else
printf "\E[32;1m""OK. $attr for $dev changed to $val"" $1\E[0m\n"
fi
sleep 1
fi
else
printf "\E[32;1m""OK. $attr for $dev is already $value"" $1\E[0m\n"
fi
else
if [ $difference == "equal" ]
then
if [[ ${value1} != ${val1} ]]
then
if [ $fix != "yes" ]
then
printf "\E[31;1m""!!! FIX. $attr need to be changed from $value to $val !!!"" $1\E[0m\n"
else
printf "\E[31;1m""FIX. $attr will be changed from $value to $val"" $1\E[0m\n"
chdev -l $dev -a $attr=$val > /dev/null 2>&1
if [ "$?" -ne 0 ]
then
chdev -l $dev -a $attr=$val -P
echo "must be rebooted before changes applies"
else
printf "\E[32;1m""OK. $attr for $dev changed to $val"" $1\E[0m\n"
fi
sleep 1
fi
else
printf "\E[32;1m""OK. $attr for $dev is already $value"" $1\E[0m\n"
fi
fi
fi
fi
}
#------------------------------------------------
# change_path ()
#------------------------------------------------
change_path()
{
dev=$1
parent=$2
prio=$3
if [ `lspath -AEH -l $dev -p $parent | grep priority | awk '{print $2}'` != "$prio" ]
then
connect=`odmget -q "name=$dev and parent=$parent and path_status=1" CuPath | grep connection | awk '{print $3}'`
if [ $fix != "yes" ]
then
printf "\E[31;1m""!!! FIX. path priority need to be changed on $dev $parent to $prio !!!"" $1\E[0m\n"
else
chpath -l $dev -p $parent -w $connect -a priority=$prio > /dev/null 2>&1
if [ "$?" -ne 0 ]
then
printf "\E[31;1m""!!!ERROR cannot change path priority on $dev $parent to $prio"" $1\E[0m\n"
else
printf "\E[31;1m""FIX. changed priority on $dev $parent Priority `lspath -AEH -l $dev -p $parent | grep priority | awk '{print $2}'`"" $1\E[0m\n"
fi
fi
else
printf "\E[32;1m""OK. No change to priority required on $dev $parent Priority `lspath -AEH -l $dev -p $parent | grep priority | awk '{print $2}'`"" $1\E[0m\n"
fi
}
#------------------------------------------------
# dmsg ()
#------------------------------------------------
dmsg()
{
if [ $debug == "yes" ]
then
echo "$1"
fi
}
#------------------------------------------------
# check_lpar_param ()
#------------------------------------------------
check_lpar_param ()
{
#********************************
# Check on LPAR or pSeries
#--------------------------------
# Check ent Virtual adapter attributes
list=""
lsdev -C | grep '^ent' | grep -i 'virtual' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check ENT $device on $HOSTNAME -----"
echo ""
attribut="max_buf_huge"
goodval="128"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_huge"
goodval="64"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_large"
goodval="128"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_large"
goodval="64"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_medium"
goodval="512"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_medium"
goodval="256"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_small"
goodval="4096"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_small"
goodval="2048"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_tiny"
goodval="4096"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_tiny"
goodval="2048"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="poll_uplink"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check en Virtual adapter attributes
list=""
lsdev -C | grep '^ent' | grep -i virtual | sed 's/^ent/en/' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check EN $device on $HOSTNAME -----"
echo ""
attribut="mtu_bypass"
goodval="on"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check fcs attributes
list=""
lsdev -C | grep '^fcs' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check FCS $device on $HOSTNAME -----"
echo ""
attribut="max_xfer_size"
goodval="0x200000"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="num_cmd_elems"
goodval="256"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check fscsi attributes
list=""
lsdev -C | grep fscsi | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check FSCSI $device on $HOSTNAME -----"
echo ""
lsdev -p $device | grep rmt
if [ $? != 0 ]
then
attribut="fc_err_recov"
goodval="fast_fail"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="dyntrk"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
else
echo "FSCSI $device on $HOSTNAME has tapes as child devices"
fi
done
#--------------------------------
# Check Virtual SCSI Client Adapter
list=""
lsdev -Cc adapter |grep 'Virtual SCSI Client Adapter' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check Virtual SCSI Client Adapter $device on $HOSTNAME -----"
echo ""
attribut="vscsi_path_to"
goodval="30"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="vscsi_err_recov"
goodval="fast_fail"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check 2107 disk attributes
list=""
lsdev -Cc disk |grep 'IBM MPIO FC 2107' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check IBM MPIO FC 2107 $device on $HOSTNAME -----"
echo ""
attribut="algorithm"
goodval="load_balance"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="hcheck_interval"
goodval="60"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="hcheck_mode"
goodval="nonactive"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check Virtual SCSI Disk Drive attributes
list=""
lsdev -Cc disk |grep 'Virtual SCSI Disk Drive' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check Virtual SCSI Disk Drive $device on $HOSTNAME -----"
echo ""
attribut="algorithm"
goodval="fail_over"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="hcheck_interval"
goodval="60" # IBM support recommendation
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="hcheck_mode"
goodval="nonactive"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="reserve_policy"
goodval="no_reserve"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="queue_depth"
goodval="20"
diffval="higher"
chhostval $device $attribut $goodval $diffval
# Alternate path on the 2 VIOS
# Calcul disk pair ou impair
nbscsi=0
if [ $(lspath -l $device | grep vscsi | wc -l | awk '{print $1}') -eq "2" ]
then
for line in $(lspath -l $device | sort | awk '{print $3}')
do
vscsi[$nbscsi]=$line
let nbscsi="($nbscsi +1)"
done
num=`echo $device | sed "s/hdisk//"`
let "num1=num/2"
# Priorite 1 pour chiffre pair sur VSCSI1 et 2 sur VSCSI2 (inversement sur chiffre impair)
let "priority=num-num1*2+1"
case $priority in
"1") change_path $device ${vscsi[0]} 1
change_path $device ${vscsi[1]} 2
;;
"2") change_path $device ${vscsi[0]} 2
change_path $device ${vscsi[1]} 1
;;
"*") echo "**** ERROR ****"
;;
esac
fi
done
}
#------------------------------------------------
# check_vios_param ()
#------------------------------------------------
check_vios_param ()
{
#********************************
# Check on VIO Servers
#--------------------------------
# Check ent Virtual adapter attributes
list=""
lsdev -C | grep '^ent' | grep -i 'virtual' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check ENT $device on $HOSTNAME -----"
echo ""
attribut="max_buf_huge"
goodval="128"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_huge"
goodval="64"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_large"
goodval="128"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_large"
goodval="64"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_medium"
goodval="512"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_medium"
goodval="256"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_small"
goodval="4096"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_small"
goodval="2048"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="max_buf_tiny"
goodval="4096"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="min_buf_tiny"
goodval="2048"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="poll_uplink"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check en Virtual adapter attributes
list=""
lsdev -C | grep '^ent' | grep -i virtual | sed 's/^ent/en/' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check EN $device on $HOSTNAME -----"
echo ""
attribut="mtu_bypass"
goodval="on"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check ent SEA attributes
list=""
lsdev -C | grep '^ent' | grep -i 'shared ethernet adapter' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check ENT SEA $device on $HOSTNAME -----"
echo ""
attribut="adapter_reset"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="jumbo_frames"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="large_receive"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="largesend"
goodval="1"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check ent 10GbE adapter attributes
list=""
lsdev -C | grep '^ent' | grep '10GbE' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check ENT $device on $HOSTNAME -----"
echo ""
attribut="flow_ctrl"
goodval="no"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="jumbo_frames"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="large_receive"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="large_send"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check ent Etherchannel adapter attributes
list=""
lsdev -C | grep '^ent' | grep 'Etherchannel' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check ENT $device on $HOSTNAME -----"
echo ""
attribut="use_jumbo_frame"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check fcs attributes
list=""
lsdev -C | grep '^fcs' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check FCS $device on $HOSTNAME -----"
echo ""
attribut="max_xfer_size"
goodval="0x200000"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="num_cmd_elems"
goodval="1600"
diffval="higher"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check fscsi attributes
list=""
lsdev -C |grep fscsi | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check FSCSI $device on $HOSTNAME -----"
echo ""
attribut="fc_err_recov"
goodval="fast_fail"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="dyntrk"
goodval="yes"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check 2107 disk attributes
list=""
lsdev -Cc disk |grep 'IBM MPIO FC 2107' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check IBM MPIO FC 2107 $device on $HOSTNAME -----"
echo ""
attribut="algorithm"
goodval="load_balance"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="hcheck_interval"
goodval="60"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="hcheck_mode"
goodval="nonactive"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="reserve_policy"
goodval="no_reserve"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check DS3xxx disk attributes
list=""
lsdev -Cc disk |grep 'MPIO DS3' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check IBM MPIO DS3xxx $device on $HOSTNAME -----"
echo ""
attribut="reserve_policy"
goodval="no_reserve"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
#--------------------------------
# Check Hitachi disk attributes
list=""
lsdev -Cc disk |grep 'Hitachi Disk Array' | while read line
do
echo $line | read dev dummy
list="$list $dev"
done
for device in $list
do
echo ""
echo "----- Check HITACHI DISK ARRAY $device on $HOSTNAME -----"
echo ""
attribut="queue_depth"
goodval="20"
diffval="higher"
chhostval $device $attribut $goodval $diffval
attribut="algorithm"
goodval="round_robin"
diffval="equal"
chhostval $device $attribut $goodval $diffval
attribut="reserve_policy"
goodval="no_reserve"
diffval="equal"
chhostval $device $attribut $goodval $diffval
done
}
###########################################################################
#
# main ()
#
###########################################################################
main () {
cd $path_script
# Read and check scripts arguments
debug=yes
fix=no
while [ $# -gt 0 ]
do
case "$1" in
-f) fix=yes ;;
-v) debug=yes ;;
-h|help) usage
exit 1;;
esac
shift
done
echo `date`" : Begin of "$sn" "$HOSTNAME
echo "**********************\n"
# Check if LPAR is a VIOS
ls /usr/ios/cli/ioscli > /dev/null 2>&1
if [ $? -eq 0 ]
then
check_vios_param
else
check_lpar_param
fi
echo "\n**********************"
nb=$(odmget CuAtSav | grep name | wc -l | awk '{print $1}')
if [ "$nb" -ne "0" ]
then
printf "\E[31;1m""!!! FIX. A reboot is required to apply $nb device(s) parameter(s) !!!"" $1\E[0m\n"
odmget CuAtSav | egrep "name|attribute|value" | paste - - -
echo "\n**********************"
fi
echo `date`" : End of "$sn" "$HOSTNAME
}
main $* 2>&1 | tee $logname