#!/bin/bash
systemctl stop irqbalance.service
systemctl disable irqbalance.service
systemctl stop iptables
systemctl stop firewalld
echo "测试场景(-a [action]) : "
echo "install(只安装)"
echo "all (即steal+hugepage+gazelle)"
echo "base (无优化,默认mysql+patch)"
echo "如跑all场景命令如下: sh -x run_mysql.sh -a all -b 5 -f mysql-8.0.20-all -t 192.168.1.10 -n enp4s0"
echo "无优化场景:sh -x run_mysql.sh -a base -b 5 -f mysql-8.0.20-No -t 192.168.1.10 -n enp4s0"
echo "二次跑全优化场景: sh -x run_mysql.sh -a rerun_all -b 5 -f mysql-8.0.20-all -t 192.168.1.10 -n enp4s0"
echo "二次跑无优化场景: sh -x run_mysql.sh -a rerun_base -b 5 -f mysql-8.0.20-No -t 192.168.1.10 -n enp4s0"
echo "仅完成环境部署场景:sh -x run_mysql.sh -a install -b 5 -f mysql-8.0.20-No -t 192.168.1.10 -n enp4s0"
arch=$(uname -m)
Publicip=10.174.216.100
get_ip=$(ifconfig|grep 192.168.1| awk '{print $2}')
filename=mysql-8.0.20-613
datapath=/home/tpccdata
testip=192.168.1.10
mac()
{
if [ $arch = "aarch64" ];then echo "44:a1:91:70:4a:44"; else echo "ac:b3:b5:2c:ed:7a"; fi
}
mac
mac=$(mac)
bindCore()
{
if [ $arch = "aarch64" ];then echo "0-90"; else echo "0-75"; fi
}
bindCore
bindCore=$(bindCore)
interruptbind()
{
if [ $arch = "aarch64" ];then echo "91 92 93 94 95"; else echo "76 77 78 79"; fi
}
interruptbind=$(interruptbind)
num=$(interruptbind|wc -w)
echo $num
cores=`lscpu | grep "CPU(s)" | head -n 1 | awk -F ' ' '{print $2}'`
networkname()
{
if [ $arch = "aarch64" ];then echo "enp4s0"; else echo "enp4s0"; fi
}
networkname=$(networkname)
networkname
clientip()
{
if [ $arch = "aarch64" ];then echo "10.174.217.39"; else echo "10.174.217.43"; fi
}
clientip=$(clientip)
clientip
affinity()
{
eth1=$1
cnt=$2
bus=$3
ethtool -L $eth1 combined $cnt
irq1=`cat /proc/interrupts| grep -E ${bus} | head -n$cnt | awk -F ':' '{print $1}'`
irq1=`echo $irq1`
cpulist=(91 92 93 94 95)
c=0
for irq in $irq1
do
echo ${cpulist[c]} "->" $irq
echo ${cpulist[c]} > /proc/irq/$irq/smp_affinity_list
let "c++"
done
}
help(){
echo "Usage:"
echo "run_mysql.sh [-a action] [-b bindnum] [-t testip] [-f filename] [-i interruptbind] [-m mac] [-n networkname] [-c clientip] [-d datapath]"
echo "Description :"
echo "action: "
echo "bindnum:"
echo "testip: default 192.168.1.10"
echo "filename: default mysql-8.0.20"
echo "interruptbind:"
echo "mac:test mac address"
echo "networkname,the name of server test networkname"
echo "clientip,the client of ip"
echo "path,the path of mysql testdata"
exit 1
}
while getopts 'a:t:f:i:n:p:h:b:c' OPT;do
case $OPT in
a) action="$OPTARG";;
b) bindnum="$OPTARG";;
t) testip="$OPTARG";;
f) filename="$OPTARG";;
i) interruptbind="$OPTARG";;
m) mac="$OPTARG";;
n) networkname="$OPTARG";;
c) clientip="$OPTARG";;
p) datapath="$OPTARG";;
h) help;;
?) help;;
esac
done
echo $filename
echo $interruptbind
echo $bindnum
echo $mac
echo $testip
echo $networkname
echo $clientip
echo $datapath
affinity_nic()
{
NIC=$1
CPU=$2
NUM=$3
ethtool -l $NIC
ethtool -L $NIC combined $NUM
for irq in $(grep $NIC /proc/interrupts | head -n$NUM | awk '{print $1}' | sed -e 's/://g')
do
echo $CPU > /proc/irq/$irq/smp_affinity_list
echo "echo $CPU > /proc/irq/$irq/smp_affinity_list"
((CPU += 1))
done
}
echo $bindnum
cores=`lscpu | grep "CPU(s)" | head -n 1 | awk -F ' ' '{print $2}'`
echo $cores
cores=$(($cores-1-$bindnum))
echo $cores
num=$(interruptbind|wc -w)
num=$(interruptbind |wc -w)
interruptbind=$( interruptbind | awk '{print $1}' )
echo interruptbind
Nopasswd(){
/usr/bin/expect <<EOF
set timeout 30
spawn ssh-copy-id root@${Publicip}
expect {
"*yes/no" { send "yes\r";exp_continue }
"*password:" { send "Huawei12#$\r" }
}
expect eof
set timeout 30
spawn ssh-copy-id root@${clientip}
expect {
"*yes/no" { send "yes\r";exp_continue }
"*password:" { send "Huawei12#$\r" }
}
expect eof
EOF
}
res1=$(ssh root@${clientip} -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no "date" | wc -l)
res2=$(ssh root@${Publicip} -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no "date" | wc -l)
if [ $res1 -eq 1 || $res2 -eq 1 ]; then
echo "已配置免密"
else
Nopasswd
fi
stop_mysql()
{
ps -ef |grep mysql |grep -v grep |grep -v run_mysql.sh|awk '{print $2}' |xargs kill -9
}
stop_mysql
if grep -q large_pages=1 /etc/my.cnf; then sed -i '/large_pages=1/d' /etc/my.cnf ;fi
install_mysql()
{
yum install -y expect
if [ ! -e "/home/mysql_deploy.tar.gz" ]; then
scp -r root@${Publicip}:/deploy/mysql_deploy.tar.gz .
else
echo "The mysql test Dependency package is exists"
fi
yum install -y cmake doxygen bison ncurses-devel openssl-devel libtool tar rpcgen libtirpc-devel bison bc unzip git gcc-c++ libaio make
if [ ! -e "/usr/local/${filename}" ]; then
if [ ! -e "/home/mysql-8.0.20" ];then
tar -xvf mysql_deploy.tar.gz
tar -xvf mysql-8.0.20-patched_${arch}.tar.gz
cp -r my.cnf${arch} /etc/my.cnf
chmod -R +x mysql-8.0.20
fi
cd /home/mysql-8.0.20/cmake
make clean
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/${filename} -DWITH_BOOST=../boost -DDOWNLOAD_BOOST=1
make -j 64 && make install
else
echo "The version of mysql Package is exists!"
fi
}
prepare_mysql_data()
{
umount /dev/nvme0n1
rm -rf /data
mkfs.xfs /dev/nvme0n1 -f
groupadd mysql
useradd -g mysql mysql
mkdir /data
mount /dev/nvme0n1 /data
rm -rf /data/mysql
mkdir -p /data/mysql
mkdir -p /data/mysql/data
mkdir -p /data/mysql/run
mkdir -p /data/mysql/share
mkdir -p /data/mysql/log
mkdir -p /data/mysql/tmp
chown -R mysql:mysql /data
chown -R mysql:mysql /data/mysql
echo "" > /data/mysql/log/mysql.log
chown -R mysql:mysql /data/mysql/log/mysql.log
}
init_mysql()
{
/usr/local/${filename}/bin/mysqld --defaults-file=/etc/my.cnf --user=root --initialize
/usr/local/${filename}/support-files/mysql.server start
sed -i 's/#skip-grant-tables/skip-grant-tables/g' /etc/my.cnf
/usr/local/${filename}/support-files/mysql.server restart
/usr/local/${filename}/bin/mysql -u root -p123456 <<EOF
use mysql;
Select * from user where user='root' \G;
update user set password_expired='N' where user='root';
Flush privileges;
alter user 'root'@'localhost' identified by '123456';
flush privileges;
update user set host='%' where user='root';
flush privileges;
create database tpcc;
quit
EOF
sed -i 's/skip-grant-tables/#skip-grant-tables/g' /etc/my.cnf
ps -ef |grep mysql |grep -v grep |grep -v run_mysql.sh|awk '{print $2}' |xargs kill -9
sleep 3
mkdir -p ${datapath}
}
copy_mysql_data()
{
if [ ! -e ${datapath}/tpcc ]; then
ssh ${clientip} -C "systemctl stop firewalld"
ssh ${clientip} -C "cd /root/benchmarksql-5.0-hwsql/run && ./runDatabaseBuild.sh props.conf"
sleep 15
cp -r /data/mysql/data/* ${datapath}
sleep 10
else
rm -rf /data/mysql/data/*
cp -r ${datapath}/* /data/mysql/data/
fi
}
manual_test()
{
./affinity ${networkname} $num ${networkname}
if [ $arch = "aarch64" ];then
numactl -C 0-$cores -i 0-3 /usr/local/${filename}/bin/mysqld --defaults-file=/etc/my.cnf &
sleep 60
else
sed -i "s/91 92 93 94 95/76 77 78 79/g" affinity
./affinity $networkname $num $networkname
numactl -C 0-$cores -i 0-1 /usr/local/${filename}/bin/mysqld --defaults-file=/etc/my.cnf &
sleep 60
fi
ssh root@$clientip -C "cd /root/benchmarksql-5.0-hwsql/run && ./runBenchmark.sh props.conf"
}
enable_hugepage()
{
ulimit -l unlimited
export GLIBC_TUNABLES=glibc.malloc.hugetlb=2
echo `id mysql -g` > /proc/sys/vm/hugetlb_shm_group
sed -i "s/server-id=1/server-id=1\nlarge_pages=1/g" /etc/my.cnf
}
enable_gazelle()
{
yum install dpdk libconfig numactl libboundscheck libpcap gazelle
modprobe vfio enable_unsafe_noiommu_mode=1
modprobe vfio-pci
sed -i "s/use_ltran=1/use_ltran=0/g" /etc/gazelle/lstack.conf
if [ $arch = "aarch64" ];then
ip link set ${networkname} down
ifconfig ${networkname} down
dpdk-devbind -b vfio-pci ${networkname}
sed -i "s/2048,0,0,0/2048,2048,2048,2048/g" /etc/gazelle/lstack.conf
else
ip link set ${networkname} down
dpdk-devbind -b vfio-pci ${networkname}
sed -i "s/2048,0,0,0/2048,2048,0,0/g" /etc/gazelle/lstack.conf
fi
if grep -q num_wakeup /etc/gazelle/lstack.conf
then
echo "done"
else
sed -i "s/^.*num_cpus=.*$/num_cpus=\"18,38,58,78\"\nnum_wakeup=\"14,34,54,74\"/g" /etc/gazelle/lstack.conf
fi
sed -i "s/^.*devices=.*$/devices=\"${mac}\"/g" /etc/gazelle/lstack.conf
mkdir -p /mnt/hugepages-2M && mount -t hugetlbfs nodev /mnt/hugepages-2M
}
tmpfs_hugepages()
{
enable_tmpfs=1
mkdir -p /var/mysql
mountpoint -q /var/mysql || mount -t tmpfs -o huge=always tmpfs /var/mysql
if [ ! -L /usr/local/$filename/bin/mysqld ];then
cp /usr/local/$filename/bin/mysqld /usr/local/$filename/bin/mysqld.bak
mv -f /usr/local/$filename/bin/mysqld /var/mysql
ln -sf /var/mysql/mysqld /usr/local/$filename/bin/mysqld
fi
}
reset_tmpfs_hugepages()
{
if [ -L /usr/local/$filename/bin/mysqld ];then
rm -rf /usr/local/$filename/bin/mysqld
mv /usr/local/$filename/bin/mysqld.bak /usr/local/$filename/bin/mysqld
fi
}
if [ -z $action ]; then
echo "No action"
help;
elif [ $action = "install" ]; then
install_mysql
prepare_mysql_data
init_mysql
elif [ $action = "all" ]; then
reset_tmpfs_hugepages
umount /mnt/hugepages-2M
echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
install_mysql
prepare_mysql_data
init_mysql
copy_mysql_data
echo STEAL > /sys/kernel/debug/sched_features
enable_hugepage
enable_gazelle
tmpfs_hugepages
echo 138192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=mysqld /usr/local/${filename}/bin/mysqld --defaults-file=/etc/my.cnf --bind-address=${testip} &
sleep 35
ssh root@${clientip} -C "cd /root/benchmarksql-5.0-hwsql/run && ./runBenchmark.sh props.conf"
elif [ $action = "base" ]; then
reset_tmpfs_hugepages
umount /mnt/hugepages-2M
echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
install_mysql
prepare_mysql_data
init_mysql
copy_mysql_data
echo STEAL > /sys/kernel/debug/sched_features
manual_test
elif [ $action = "rerun_base" ]; then
stop_mysql
rm -rf /data/mysql/data/* && cp -r ${datapath}/* /data/mysql/data
manual_test
elif [ $action = "rerun_all" ]; then
stop_mysql
rm -rf /data/mysql/data/* && cp -r ${datapath}/* /data/mysql/data
sleep 3
LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=mysqld /usr/local/${filename}/bin/mysqld --defaults-file=/etc/my.cnf --bind-address=${testip} &
sleep 35
ssh root@${clientip} -C "cd /root/benchmarksql-5.0-hwsql/run && ./runBenchmark.sh props.conf"
fi