blob: 2002357b39a1c04940004622c4286e56feeaf170 [file] [log] [blame]
#!/bin/bash
set -o errexit
THIS_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
TEST_DEFS_DIR=$(readlink -f "${THIS_DIR}/../../..")
GET_VLAND_IFACE=${TEST_DEFS_DIR}/automated/utils/vland/get_vland_interface.sh
GET_VLAND_PCI_DEV=${TEST_DEFS_DIR}/automated/utils/vland/get_vland_pci_dev.sh
# vlnad name to use
VLAND_NAME=${VLAND_NAME:-vlan_one}
VLAND_IFACE=$($GET_VLAND_IFACE "$VLAND_NAME")
VLAND_PCI_DEV=$($GET_VLAND_PCI_DEV "$VLAND_NAME")
# Do not run tests on more than MAX_CORES cores
# 0 means use all cores
MAX_CORES=${MAX_CORES:-0}
# IP address of the server
SERVER_IP=${SERVER_IP:-192.168.1.4}
# What kind of configuration to use:
# linux-ip: plain Linux IP stack
# odp-dpdk: NGiNX with OFP+ODP+DPDK
CONFIG_TYPE=${CONFIG_TYPE:-linux-ip}
# DEB_URL
DEB_URL=${DEB_URL:-http://people.linaro.org/~josep.puigdemont/debs}
function exit_error {
echo "-- SERVER ERROR"
journalctl -u nginx
lava-test-case server_up --status fail
}
trap exit_error ERR
# Use this function to configure Linux IP stack
function config_linux_ip {
ip address add "${SERVER_IP}/24" dev "$VLAND_IFACE"
ip link set "$VLAND_IFACE" up
lava-test-case server_ifup --result pass
sysctl -w net.ipv4.ip_local_port_range="1500 65500"
}
# Use this function to configure a device for DPDK usage
# FIXME: this should use a repository
function config_dpdk_dev {
local driver=${1:-igb_uio}
local DEBS="libofp-odp-dpdk0_1.1+git3+4ec95a1-0linaro1linarojessie1_amd64.deb"
if ! which dpdk-devbind &>/dev/null; then
echo "ERROR: dpdk not installed"
exit 1
fi
modprobe "$driver"
dpdk-devbind -u "$VLAND_PCI_DEV"
dpdk-devbind -b "${driver}" "$VLAND_PCI_DEV"
dpdk-devbind -s
apt-get install -y nginx
systemctl stop nginx
# we want our version of libofp, with CONFIG_WEBSERVER set
apt-get remove -y libofp-odp-dpdk0 nginx-common
mkdir ofp
cd ofp
for deb in $DEBS; do
wget -q "$DEB_URL/ofp-config-webserver/$deb"
dpkg -i "$deb"
done
cd ..
}
# Callback to call before starting nginx when using OFP-DPDK
# First parameter of callback is the number of cores
function odp_dpdk_pre_cb {
local cores=$1
local DEBS="nginx-common_1.9.10-1~linaro1linarojessie1_all.deb \
nginx-full_1.9.10-1~linaro1linarojessie1_amd64.deb \
nginx_1.9.10-1~linaro1linarojessie1_all.deb"
apt-get remove -y nginx-common
# clean hugepages
rm -rf /dev/hugepages/*
mkdir -p "iter_${cores}"
cd "iter_${cores}"
for deb in $DEBS; do
wget -q "$DEB_URL/nginx-ofp-odp-dpdk/${cores}_queue/$deb"
dpkg --force-confold -i "$deb"
done
cd ..
}
function odp_dpdk_post_cb {
local cores=$1
systemctl status nginx
echo "-- AFFINITY $cores"
for pid in $(pgrep nginx); do
taskset -p "$pid"
done
}
function linux_ip_pre_cb {
local cores=$1
ethtool -L "$VLAND_IFACE" combined "$cores"
}
function linux_ip_post_cb {
local cores=$1
systemctl status nginx
echo "-- AFFINITY $cores"
for pid in $(pgrep nginx); do
taskset -p "$pid"
done
echo "-- INTERRUPTS $cores"
grep "$VLAND_IFACE" /proc/interrupts
echo "--- MPSTAT $cores"
mpstat -P ALL | cat
}
function configure_ramdisk {
local ROOT=/www
mkdir "$ROOT"
mount -t tmpfs -o size=1M tmpfs "$ROOT"
echo "-- Ramdisk created: "
df -h "$ROOT"
echo "-- END"
lava-test-case server_www_ramdisk --result pass
cat > "$ROOT/index.html" <<-EOF
<html>
<head><title>NGiNX test</title></head>
<body>
IT WORKS
</body>
</html>
EOF
}
function write_config {
# Simple configuration file for NGiNX
cat > /etc/nginx/nginx.conf <<-EOF
user www-data;
worker_processes $1;
timer_resolution 1s;
worker_rlimit_nofile 4096;
error_log /dev/null crit;
pid /run/nginx.pid;
${WRITE_CONFIG_CORE}
events {
worker_connections 1024;
${WRITE_CONFIG_EVENTS}
}
http {
access_log off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 0;
open_file_cache max=10;
server {
# TODO: investigate backlog value
listen ${SERVER_IP}:80 default_server ${REUSEPORT} so_keepalive=off;
location / {
root /www;
}
}
}
EOF
echo "-- CONFIG FOR $1:"
cat /etc/nginx/nginx.conf
echo "-- END --"
}
function get_num_real_cores {
local cores_socket
local num_sockets
local num_cores
cores_socket=$(lscpu | awk -F : '/^Core\(s\) per/ {print $2;}')
num_sockets=$(lscpu | awk -F : '/^Socket\(s\)/ {print $2;}')
num_cores=$((cores_socket * num_sockets))
if [ "${MAX_CORES}" -ne 0 ] && [ "${num_cores}" -gt "${MAX_CORES}" ]; then
num_cores=$MAX_CORES
fi
echo "$num_cores"
}
configure_ramdisk
case ${CONFIG_TYPE} in
linux-ip)
echo "-- CONFIGURING Linux Kernel IP stack"
config_linux_ip
PRE_TEST_CB="linux_ip_pre_cb"
POST_TEST_CB="linux_ip_post_cb"
WRITE_CONFIG_CORE="worker_cpu_affinity auto;"
WRITE_CONFIG_EVENTS=""
REUSEPORT="reuseport"
;;
odp-dpdk)
echo "-- CONFIGURING OFP IP Stack"
config_dpdk_dev igb_uio
PRE_TEST_CB="odp_dpdk_pre_cb"
POST_TEST_CB="odp_dpdk_post_cb"
WRITE_CONFIG_CORE=""
WRITE_CONFIG_EVENTS="use select;"
REUSEPORT=""
;;
*)
echo "Invalid CONFIG_TYPE: $CONFIG_TYPE"
exit 1
;;
esac
NUM_CORES=$(get_num_real_cores)
echo ">> SEND num_cores cores=$NUM_CORES"
lava-send num_cores cores="$NUM_CORES"
echo "<< WAIT client_ready"
lava-wait client_ready
for num_cores in 1 $(seq 2 2 "$NUM_CORES"); do
echo "-- BEGIN $num_cores"
echo "-- Stopping NGiNX"
systemctl stop nginx
echo "-- Writing configuration file for $num_cores"
write_config "$num_cores"
echo "-- CALLING PRE-TEST CALLBACK $PRE_TEST_CB"
$PRE_TEST_CB "$num_cores"
echo "-- STARTING NGiNX for test $num_cores"
systemctl start nginx
echo ">> SEND server_num_cores_${num_cores}_ready"
lava-send "server_num_cores_${num_cores}_ready"
echo "<< WAIT client_num_cores_${num_cores}_done"
lava-wait "client_num_cores_${num_cores}_done"
echo "-- CALLING POST-TEST CALLBACK $POST_TEST_CB"
$POST_TEST_CB "$num_cores"
echo "-- END $num_cores"
done
echo "<< WAIT client_done"
lava-wait client_done
echo "A10"