CLOUDSTACK-2433 Enable rps and rfs in virtual router

This commit is contained in:
Jayapal 2013-07-17 16:59:32 +05:30
parent f76bf5b053
commit 2d6644d961
6 changed files with 102 additions and 6 deletions

View File

@ -531,7 +531,7 @@ public class VirtualRoutingResource implements Manager {
for (IpAddressTO ip : ips) {
result = assignPublicIpAddress(routerName, routerIp, ip.getPublicIp(), ip.isAdd(),
ip.isFirstIP(), ip.isSourceNat(), ip.getVlanId(), ip.getVlanGateway(), ip.getVlanNetmask(),
ip.getVifMacAddress(), 2);
ip.getVifMacAddress(), 2, false);
if (result != null) {
results[i++] = IpAssocAnswer.errorResult;
} else {
@ -1019,7 +1019,7 @@ public class VirtualRoutingResource implements Manager {
final String privateIpAddress, final String publicIpAddress,
final boolean add, final boolean firstIP, final boolean sourceNat,
final String vlanId, final String vlanGateway,
final String vlanNetmask, final String vifMacAddress, int nicNum){
final String vlanNetmask, final String vifMacAddress, int nicNum, boolean newNic){
String args = "";
if (add) {
@ -1043,6 +1043,11 @@ public class VirtualRoutingResource implements Manager {
args +=" -g ";
args += vlanGateway;
if (newNic) {
args += " -n";
}
return routerProxy("ipassoc.sh", privateIpAddress, args);
}

View File

@ -366,6 +366,46 @@ disable_hvc() {
[ -d /proc/xen ] && sed -i 's/^#vc/vc/' /etc/inittab && telinit q
}
enable_rpsrfs() {
local enable=$1
if [ $eanble -eq 0]
then
echo 0 > /etc/rpsrfsenable
return 0
fi
if [ ! -f /sys/class/net/eth0/queues/rx-0/rps_cpus ]
then
echo "rps is not enabled in the kernel"
echo 0 > /etc/rpsrfsenable
return 0
fi
proc=$(cat /proc/cpuinfo | grep "processor" | wc -l)
if [ $proc -le 1 ]
then
echo 0 > /etc/rpsrfsenable
return 0;
fi
echo 1 > /etc/rpsrfsenable
num=1
num=$(($num<<$proc))
num=$(($num-1));
echo $num;
hex=$(printf "%x\n" $num)
echo $hex;
#enable rps
echo $hex > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo $hex > /sys/class/net/eth2/queues/rx-0/rps_cpus
#enble rps
echo 256 > /proc/sys/net/core/rps_sock_flow_entries
echo 256 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
echo 256 > /sys/class/net/eth2/queues/rx-0/rps_flow_cnt
}
setup_common() {
init_interfaces $1 $2 $3
if [ -n "$ETH0_IP" ]
@ -731,6 +771,7 @@ setup_router() {
enable_svc cloud 0
disable_rpfilter_domR
enable_fwding 1
enable_rpsrfs 1
chkconfig nfs-common off
cp /etc/iptables/iptables-router /etc/iptables/rules.v4
#for old templates

View File

@ -303,11 +303,41 @@ remove_an_ip () {
return 0
}
enable_rpsrfs() {
#enable rps and rfs for this new interface
if [ -f /etc/rpsrfsenable ]
then
enable=$(cat /etc/rpsrfsenable)
if [ $enable -eq 1 ]
then
proc=$(cat /proc/cpuinfo | grep "processor" | wc -l)
if [ $proc -le 1 ]
then
return $status;
fi
num=1
num=$(($num<<$proc))
num=$(($num-1));
echo $num;
hex=$(printf "%x\n" $num)
echo $hex;
#enable rps
echo $hex > /sys/class/net/$ethDev/queues/rx-0/rps_cpus
#enable rfs
echo 256 > /sys/class/net/$ethDev/queues/rx-0/rps_flow_cnt
fi
fi
}
#set -x
sflag=0
lflag=
fflag=
cflag=
nflag=
op=""
is_master=0
@ -328,7 +358,7 @@ then
if_keep_state=1
fi
while getopts 'sfADa:l:c:g:' OPTION
while getopts 'sfADna:l:c:g:' OPTION
do
case $OPTION in
A) Aflag=1
@ -350,6 +380,8 @@ do
g) gflag=1
defaultGwIP="$OPTARG"
;;
n) nflag=1
;;
?) usage
unlock_exit 2 $lock $locked
;;
@ -370,6 +402,13 @@ then
fi
if [ "$Aflag" == "1" ] && [ "$nflag" == "1" ]
then
#enable rps, rfs for the new interface
enable_rpsrfs
fi
if [ "$fflag" == "1" ] && [ "$Aflag" == "1" ]
then
add_first_ip $publicIp &&

View File

@ -1922,19 +1922,21 @@ ServerResource {
int i = 0;
String result = null;
int nicNum = 0;
boolean newNic = false;
for (IpAddressTO ip : ips) {
if (!vlanAllocatedToVM.containsKey(ip.getVlanId())) {
/* plug a vif into router */
VifHotPlug(conn, routerName, ip.getVlanId(),
ip.getVifMacAddress());
vlanAllocatedToVM.put(ip.getVlanId(), nicPos++);
newNic = true;
}
nicNum = vlanAllocatedToVM.get(ip.getVlanId());
networkUsage(routerIp, "addVif", "eth" + nicNum);
result = _virtRouterResource.assignPublicIpAddress(routerName,
routerIp, ip.getPublicIp(), ip.isAdd(), ip.isFirstIP(),
ip.isSourceNat(), ip.getVlanId(), ip.getVlanGateway(),
ip.getVlanNetmask(), ip.getVifMacAddress(), nicNum);
ip.getVlanNetmask(), ip.getVifMacAddress(), nicNum, newNic);
if (result != null) {
results[i++] = IpAssocAnswer.errorResult;

View File

@ -1769,6 +1769,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
args += " -g ";
args += vlanGateway;
if (addVif) {
args += " -n ";
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("Run command on domain router " + privateIpAddress + ", /opt/cloud/bin/ipassoc.sh " + args);
}

View File

@ -2366,6 +2366,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
args += " -g ";
args += vlanGateway;
if (addVif) {
//To indicate this is new interface created
args += " -n";
}
String result = callHostPlugin(conn, "vmops", "routerProxy", "args", args);
if (result == null || result.isEmpty()) {