最近需要测试NFV某个node的性能,所以需要Node ei-0单独在一个computer上,所以写了一个脚本:
function echo__blue() { echo -e "\e[0;34;1m$1\e[0m";}
function echo__red() { echo -e "\e[0;31;1m$1\e[0m";}
function echo__green() { echo -e "\e[0;32;1m$1\e[0m";}
function echo__yellow() { echo -e "\e[0;33;1m$1\e[0m";}
COMPUTER_LIST=`nova hypervisor-list | awk '{print $4}' | awk 'NR>2'`
UE_NODE_NAME=`nova list | grep ei-0 | awk '{print $4}'`
OPTIMAL_COMPUTER=''
INIT_USED=8.0
for COMPUTER in $COMPUTER_LIST
do
CPUS_USED=`nova hypervisor-show $COMPUTER | grep -i "vcpus_used" | awk '{print $4}' | head -1`
echo__blue "$COMPUTER node's vcpus_used is : $CPUS_USED"
if [[ $(echo "$CPUS_USED == 0.0"|bc) = 1 ]];then
echo__blue "Greate! $COMPUTER is a optimal computer."
OPTIMAL_COMPUTER=$COMPUTER
break
elif [[ $(echo "$CPUS_USED > 0.0"|bc) = 1 ]] && [[ $(echo "$CPUS_USED < 8.0 "|bc) = 1 ]];then
echo__green "Maybe $COMPUTER is a selectable computer."
if [[ $(echo "$CPUS_USED < $INIT_USED"|bc) = 1 ]];then
INIT_USED=$CPUS_USED
OPTIMAL_COMPUTER=$COMPUTER
echo__blue "Now OPTIMAL_COMPUTER is: $COMPUTER."
fi
elif [[ $(echo "$CPUS_USED >= 8.0"|bc) = 1 ]] && [[ $(echo "$CPUS_USED <= 13.0 "|bc) = 1 ]];then
echo__red "Maybe $COMPUTER is not a good choice."
INSTANCE_NUMBER=`nova hypervisor-servers compute-159 | awk '{print $4}' | awk 'NR>2' | awk '{if(length!=0) print $0}' | wc -l`
USED_RATE=$(echo "$CPUS_USED / $INSTANCE_NUMBER" | bc)
echo "===========USED_RATE: $USED_RATE============="
if [[ $(echo "$USED_RATE < $INIT_USED"|bc) = 1 ]];then
INIT_USED=$USED_RATE
echo "===========INIT_USED: $INIT_USED============="
OPTIMAL_COMPUTER=$COMPUTER
echo__blue "Now OPTIMAL_COMPUTER is: $COMPUTER."
else
continue
fi
else
echo__red "This computer node is full."
fi
done
echo "===========Finally the chosen computer is $OPTIMAL_COMPUTER.=============="
echo__green "==============Begin to migrate UE node to $OPTIMAL_COMPUTER.====================="
nova live-migration $UE_NODE_NAME $OPTIMAL_COMPUTER
UE_NODE_STATE=`nova list | grep ei-0 | awk '{print $10}'`
if [ "Running" != "$UE_NODE_STATE" ];then
echo "Still migrating, please wait..."
sleep 5
fi
echo__green "Live migration is successfully."
shell不是经常使用,所以编写过程中才发现浮点数不能判断以及计算的问题,因此记录下,遇到问题可以这么写:
通过bc
bc是一种任意精度的计算语言,注意是一种语言,它提供了一些语法结构,比如条件判断、循环等,可以说是很强大的,其中一个用途就是用来进行运算以及进制转换。我们经常使用的expr只支持整数运算,对于浮点运算就无能为力了,而且expr不能进行指数运算,而都有bc这些都不再话下。
$(echo "$CPUS_USED > 0.0"|bc) = 1
通过dc
可能你曾经知道有此命令,也可能你还不知道。dc相比与bc要复杂,但是简单操作还是比较简单。简单的说dc是一直压栈操作,和bc一样,它也可以交互使用,或者与echo一起配合使用,它也支持浮点运算。dc后续再作研究。expr
expr竟然也可以?先保存下来,下次再试试:if [ `expr $a \> $b` -eq 0 ];then echo $b is bigger else echo $a is bigger fi