ACC SHELL
#!/usr/bin/perl
# For now, this just tests the addition and removal of 1000 VLAN interfaces on eth0
# Arguments:
# graph Generate a graph.
# clean Remove interfaces.
use strict;
$| = 1;
if ($ARGV[0] eq "graph") {
my $dev_cnt = 0;
my $user = 0;
my $system = 0;
my $real = 0;
my $prog = "";
open(IPNH, ">/tmp/ip_rpt_no_hash.txt") || die("Can't open /tmp/ip_rpt_no_hash.txt\n");
open(IFCFGNH, ">/tmp/ifconfig_rpt_no_hash.txt") || die("Can't open /tmp/ifconfig_rpt_no_hash.txt\n");
open(IP, ">/tmp/ip_rpt.txt") || die("Can't open /tmp/ip_rpt.txt\n");
open(IFCFG, ">/tmp/ifconfig_rpt.txt") || die("Can't open /tmp/ifconfig_rpt.txt\n");
my $hash = $ARGV[1];
my $no_hash = $ARGV[2];
open(IF, "$no_hash");
while (<IF>) {
my $ln = $_;
chomp($ln);
#print "LINE: -:$ln:-\n";
if ($ln =~ /Doing ip addr show for (\S+)/) {
$dev_cnt = $1;
$prog = "ip";
}
elsif ($ln =~ /Doing ifconfig -a for (\S+)/) {
$dev_cnt = $1;
$prog = "ifconfig";
}
elsif ($ln =~ /^real (\S+)/) {
$real = $1;
}
elsif ($ln =~ /^user (\S+)/) {
$user = $1;
}
elsif ($ln =~ /^sys (\S+)/) {
$system = $1;
#print "prog: $prog $dev_cnt\t$user\t$system\t$real\n";
if ($prog eq "ip") {
print IPNH "$dev_cnt\t$user\t$system\t$real\n";
}
else {
print IFCFGNH "$dev_cnt\t$user\t$system\t$real\n";
}
}
else {
#print "INFO: Didn't match anything -:$ln:-\n";
}
}
close(IPNH);
close(IFCFGNH);
close(IF);
open(IF, "$hash");
while (<IF>) {
my $ln = $_;
chomp($ln);
#print "LINE: -:$ln:-\n";
if ($ln =~ /Doing ip addr show for (\S+)/) {
$dev_cnt = $1;
$prog = "ip";
}
elsif ($ln =~ /Doing ifconfig -a for (\S+)/) {
$dev_cnt = $1;
$prog = "ifconfig";
}
elsif ($ln =~ /^real (\S+)/) {
$real = $1;
}
elsif ($ln =~ /^user (\S+)/) {
$user = $1;
}
elsif ($ln =~ /^sys (\S+)/) {
$system = $1;
#print "prog: $prog $dev_cnt\t$user\t$system\t$real\n";
if ($prog eq "ip") {
print IP "$dev_cnt\t$user\t$system\t$real\n";
}
else {
print IFCFG "$dev_cnt\t$user\t$system\t$real\n";
}
}
else {
#print "INFO: Didn't match anything -:$ln:-\n";
}
}
close(IP);
close(IFCFG);
my $plot_cmd = "set title \"ip addr show V/S ifconfig -a\"
set terminal png color
set output \"ip_addr_show.png\"
set size 1,2
set xlabel \"Interface Count\"
set ylabel \"Seconds\"
set grid
plot \'/tmp/ip_rpt.txt\' using 1:3 title \"ip_system\" with lines, \\
\'/tmp/ip_rpt.txt\' using 1:2 title \"ip_user\" with lines, \\
\'/tmp/ifconfig_rpt.txt\' using 1:3 title \"ifconfig_system\" with lines, \\
\'/tmp/ifconfig_rpt.txt\' using 1:2 title \"ifconfig_user\" with lines, \\
\'/tmp/ip_rpt_no_hash.txt\' using 1:3 title \"ip_system_no_hash\" with lines, \\
\'/tmp/ip_rpt_no_hash.txt\' using 1:2 title \"ip_user_no_hash\" with lines, \\
\'/tmp/ifconfig_rpt_no_hash.txt\' using 1:3 title \"ifconfig_system_no_hash\" with lines, \\
\'/tmp/ifconfig_rpt_no_hash.txt\' using 1:2 title \"ifconfig_user_no_hash\" with lines";
print "Plotting with cmd -:$plot_cmd:-\n";
open(GP, "| gnuplot") or die ("Can't open gnuplot pipe(2).\n");
print GP "$plot_cmd";
close(GP);
exit(0);
}
my $num_if = 4000;
`/usr/local/bin/vconfig set_name_type VLAN_PLUS_VID_NO_PAD`;
my $d = 5;
my $c = 5;
if ($ARGV[0] ne "clean") {
my $i;
print "Adding VLAN interfaces 1 through $num_if\n";
print "Turnning off /sbin/hotplug";
`echo > /proc/sys/kernel/hotplug`;
my $p = time();
for ($i = 1; $i<=$num_if; $i++) {
`/usr/local/bin/vconfig add eth0 $i`;
#`ip address flush dev vlan$i`;
`ip address add 192.168.$c.$c/24 dev vlan$i`;
`ip link set dev vlan$i up`;
if (($i <= 4000) && (($i % 250) == 0)) {
print "Doing ifconfig -a for $i devices.\n";
`time -p ifconfig -a > /tmp/vlan_test_ifconfig_a_$i.txt`;
print "Doing ip addr show for $i devices.\n";
`time -p ip addr show > /tmp/vlan_test_ip_addr_$i.txt`;
}
$d++;
if ($d > 250) {
$d = 5;
$c++;
}
}
my $n = time();
my $diff = $n - $p;
print "Done adding $num_if VLAN interfaces in $diff seconds.\n";
sleep 2;
}
print "Removing VLAN interfaces 1 through $num_if\n";
$d = 5;
$c = 5;
my $p = time();
my $i;
for ($i = 1; $i<=$num_if; $i++) {
`/usr/local/bin/vconfig rem vlan$i`;
$d++;
if ($d > 250) {
$d = 5;
$c++;
}
}
my $n = time();
my $diff = $n - $p;
print "Done deleting $num_if VLAN interfaces in $diff seconds.\n";
sleep 2;
if ($ARGV[0] ne "clean") {
my $tmp = $num_if / 4;
print "\nGoing to add and remove 2 interfaces $tmp times.\n";
$p = time();
for ($i = 1; $i<=$tmp; $i++) {
`/usr/local/bin/vconfig add eth0 1`;
`ifconfig vlan1 192.168.200.200`;
`ifconfig vlan1 up`;
`ifconfig vlan1 down`;
`/usr/local/bin/vconfig add eth0 2`;
`ifconfig vlan2 192.168.202.202`;
`ifconfig vlan2 up`;
`ifconfig vlan2 down`;
`/usr/local/bin/vconfig rem vlan2`;
`/usr/local/bin/vconfig rem vlan1`;
}
$n = time();
$diff = $n - $p;
print "Done adding/removing 2 VLAN interfaces $tmp times in $diff seconds.\n";
}
print "Re-installing /sbin/hotplug";
`echo /sbin/hotplug > /proc/sys/kernel/hotplug`;
ACC SHELL 2018