diff --git a/conf/performance/bc-container.conf b/conf/performance/bc-container.conf new file mode 100644 index 0000000000000000000000000000000000000000..a909b9cc50047d02c2808b1383b1743812cdf167 --- /dev/null +++ b/conf/performance/bc-container.conf @@ -0,0 +1,4 @@ +image +busybox +redis +mysql \ No newline at end of file diff --git a/tests/bc-container/install.sh b/tests/bc-container/install.sh new file mode 100644 index 0000000000000000000000000000000000000000..ba6b1d8ecd78867137b961dae2f6775dd1997884 --- /dev/null +++ b/tests/bc-container/install.sh @@ -0,0 +1,21 @@ +DEP_PKG_LIST="wget docker" + +fetch() +{ + : +} + +build() +{ + : +} + +extract_src() +{ + : +} + +install() +{ + : +} diff --git a/tests/bc-container/mysql/Dockerfile b/tests/bc-container/mysql/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..daa0433e3f5ceafb1b9dbb9f97cfa7b52a73f5d9 --- /dev/null +++ b/tests/bc-container/mysql/Dockerfile @@ -0,0 +1,25 @@ +ARG BASE_IMAGE +FROM $BASE_IMAGE + +RUN yum install -y wget tar automake make libtool libaio numactl ncurses-compat-libs +RUN wget --secure-protocol=TLSv1 --no-check-certificate https://downloads.mysql.com/archives/get/p/23/file/mysql-community-devel-8.0.20-1.el8.x86_64.rpm \ + https://downloads.mysql.com/archives/get/p/23/file/mysql-community-libs-8.0.20-1.el8.x86_64.rpm \ + https://downloads.mysql.com/archives/get/p/23/file/mysql-community-common-8.0.20-1.el8.x86_64.rpm \ + https://downloads.mysql.com/archives/get/p/23/file/mysql-community-client-8.0.20-1.el8.x86_64.rpm \ + && yum localinstall -y mysql-community-devel-8.0.20-1.el8.x86_64.rpm \ + mysql-community-libs-8.0.20-1.el8.x86_64.rpm \ + mysql-community-common-8.0.20-1.el8.x86_64.rpm \ + mysql-community-client-8.0.20-1.el8.x86_64.rpm \ + && rm -f *.rpm +RUN wget --secure-protocol=TLSv1 --no-check-certificate https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.20-linux-x86_64-minimal.tar.xz \ + && tar xvJf mysql-8.0.20-linux-x86_64-minimal.tar.xz \ + && mv mysql-8.0.20-linux-x86_64-minimal mysql-8.0.20 \ + && rm -f mysql-8.0.20-linux-x86_64-minimal.tar.xz +RUN mkdir -p /mysql-8.0.20/data && \ + /mysql-8.0.20/bin/mysqld --user=root --initialize-insecure +RUN wget --secure-protocol=TLSv1 --no-check-certificate https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz \ + && tar xvzf 1.0.20.tar.gz && rm -f 1.0.20.tar.gz\ + && mv sysbench-1.0.20 sysbench \ + && cd sysbench && ./autogen.sh && ./configure && make && make install +COPY ./run_benchmark.sh run.sh +CMD ["/bin/bash", "run.sh"] \ No newline at end of file diff --git a/tests/bc-container/mysql/run_benchmark.sh b/tests/bc-container/mysql/run_benchmark.sh new file mode 100755 index 0000000000000000000000000000000000000000..937b06a0a751d9dc069600e3f629e1b5d3cfe50c --- /dev/null +++ b/tests/bc-container/mysql/run_benchmark.sh @@ -0,0 +1,8 @@ +echo "Run mysqld as daemon" +/mysql-8.0.20/bin/mysqld --user=root --daemonize +echo "create database sysbench;" | /mysql-8.0.20/bin/mysql +echo "FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'Qwer1234';" | /mysql-8.0.20/bin/mysql +mkdir -p /var/lib/mysql +ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock +/usr/local/bin/sysbench --db-driver=mysql --test=/usr/local/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua --oltp-test-mode=complex --mysql-db=sysbench --mysql-password=Qwer1234 --max-time=300 --max-requests=0 --mysql-user=root --mysql-table-engine=innodb --oltp-table-size=100000 --oltp-tables-count=10 --rand-type=special --rand-spec-pct=100 --num-threads=10 prepare +/usr/local/bin/sysbench --test=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua --db-driver=mysql --debug=off --mysql-db=sysbench --mysql-password=Qwer1234 --oltp-tables-count=10 --oltp-table-size=100000 --num-threads=10 --max-requests=0 --max-time=300 --oltp-auto-inc=off --mysql-engine-trx=yes --oltp-test-mod=complex --mysql-port=3306 --mysql-user=root --oltp-user-delay-min=10 --oltp-user-delay-max=100 --report-interval=10 run \ No newline at end of file diff --git a/tests/bc-container/parse.awk b/tests/bc-container/parse.awk new file mode 100755 index 0000000000000000000000000000000000000000..4c471cee199f6b8da82b7fefc69dff25cfd24b5d --- /dev/null +++ b/tests/bc-container/parse.awk @@ -0,0 +1,75 @@ +#!/usr/bin/awk -f + +/^100_containers: / { + printf("100_containers_times: %s %s\n", $2, $3) + next +} + +BEGIN { + operation = "" + tps = qps = mysql_latency_95th = mysql_latency_avg = 0 +} + +/====== [[:upper:]]+/ { + match($0, /====== ([[:upper:]]+).+/, a) + operation = tolower(a[1]) +} + +/requests per second/ { + if ($0 ~ / throughput summary:/) + rps[operation] = $3 + else + rps[operation] = $1 +} + +/latency summary/ { + getline + getline + latency_avg[operation] = $1 +} + +/^ transactions:/ { + tps = $3 + sub(/[(]/, "", tps) +} + +/^ queries:/ { + qps = $3 + sub(/[(]/, "", qps) +} + +/^Latency/{ + unit = $2 + sub(/[(]/,"",unit) + sub(/[)]/,"",unit) + sub(/[:]/,"",unit) +} + +/^ 95th percentile:/{ + mysql_latency_95th = $3 +} + +/^ avg:/{ + mysql_latency_avg = $2 +} + +END { + for (k in rps) { + printf("%s_rps: %.2f requests/sec\n", k, rps[k]) + } + for (k in latency_avg) { + printf("%s_latency_avg: %.2f ms\n", k, latency_avg[k]) + } + if (tps != 0) { + printf("tps: %f\n",tps) + } + if (qps != 0) { + printf("qps: %f\n",qps) + } + if (mysql_latency_95th != 0) { + printf("Latency_95th: %.2f %s\n", mysql_latency_95th, unit) + } + if (mysql_latency_avg != 0) { + printf("Latency_avg: %.2f %s\n", mysql_latency_avg, unit) + } +} \ No newline at end of file diff --git a/tests/bc-container/redis/Dockerfile b/tests/bc-container/redis/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..9e163c6f3dc2102babac9bb972ac00c6cc6efbd1 --- /dev/null +++ b/tests/bc-container/redis/Dockerfile @@ -0,0 +1,10 @@ +ARG BASE_IMAGE +FROM $BASE_IMAGE + +RUN yum install -y gcc make wget tar +RUN wget --secure-protocol=TLSv1 --no-check-certificate https://download.redis.io/releases/redis-5.0.5.tar.gz \ + && tar xvzf redis-5.0.5.tar.gz && \ + cd redis-5.0.5 && \ + make distclean && make && make install +COPY ./run_benchmark.sh run.sh +ENTRYPOINT ["/bin/bash", "run.sh"] \ No newline at end of file diff --git a/tests/bc-container/redis/redis-5.0.5.tar.gz b/tests/bc-container/redis/redis-5.0.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3a1bdd2f9f47d72958ed9e9f51b25ec111508896 Binary files /dev/null and b/tests/bc-container/redis/redis-5.0.5.tar.gz differ diff --git a/tests/bc-container/redis/run_benchmark.sh b/tests/bc-container/redis/run_benchmark.sh new file mode 100755 index 0000000000000000000000000000000000000000..2d46aaf3fbdf2350193ede6ae1a8e7c5b0b7a546 --- /dev/null +++ b/tests/bc-container/redis/run_benchmark.sh @@ -0,0 +1,3 @@ +/usr/local/bin/redis-server --daemonize yes +echo "CMD: /usr/local/bin/redis-benchmark $*" +/usr/local/bin/redis-benchmark $* \ No newline at end of file diff --git a/tests/bc-container/run.sh b/tests/bc-container/run.sh new file mode 100644 index 0000000000000000000000000000000000000000..90c48fd2011dc65541ae81130231a08121dc1a99 --- /dev/null +++ b/tests/bc-container/run.sh @@ -0,0 +1,94 @@ +setup(){ + if [ "${image}" != "busybox" ]; then + if [ `arch` == "x86_64" ]; then + arch_str="x86" + else + arch_str="aarch64" + fi + + [ -n "$BCLinux_ID" ] || BCLinux_ID="anolis" + if [ "$BCLinux_ID" == "anolis" ]; then + base_image_url="https://mirrors.cmecloud.cn/bclinux/product/docker/bclinux-8.2-docker.tar" + elif [ "$BCLinux_ID" == "euler" ]; then + base_image_url="https://mirrors.cmecloud.cn/bclinux/product/docker/bc-euler21.10-docker_${arch_str}.tar" + else + echo "Unsupported base OS" + return 1 + fi + + base_image_tar=$(basename ${base_image_url}) + [ ! -f "/tmp/${base_image_tar}" ] && { + echo "== Get the redis/mysql test docker images..." + wget -O /tmp/${base_image_tar} --secure-protocol=TLSv1 --no-check-certificate ${base_image_url} + } + + echo "== Loading docker images..." + base_image=`docker load -i /tmp/${base_image_tar} | grep "Loaded image" | awk -F ": " '{print $2}'` + echo "Image Load and named: ${base_image}" + export BC_BASE_IMAGE=${base_image} + image_tag=`echo ${base_image} | awk -F ":" '{print $2}' | awk -F "." '{print $1}'` + export IMAGE_TAG="bc${image_tag}" + fi + + + if [ "${image}" == "busybox" ]; then + echo "== Get the test busybox docker image..." + [ -n "$BUSYBOX_TAR" ] || { + busybox_image_url="https://artifactory.dep.devops.cmit.cloud:20101/artifactory/generic-local/tools/busybox_$(arch).tar" + [ ! -f "/tmp/$(basename ${busybox_image_url})" ] && { + wget -O /tmp/$(basename ${busybox_image_url}) --secure-protocol=TLSv1 --no-check-certificate ${busybox_image_url} + } + BUSYBOX_TAR=/tmp/$(basename ${busybox_image_url}) + } + echo "== Loading busybox image..." + busybox_image=`docker load -i ${BUSYBOX_TAR} | grep "Loaded image" | awk -F ": " '{print $2}'` + echo "Image loaded and named: ${busybox_image}" + export BUSYBOX_IMAGE=${busybox_image} + elif [ "${image}" == "redis" ]; then + echo "Build Redis image..." + cd $TONE_BM_SUITE_DIR/redis + echo "CMD: docker build -t my_redis:5.0.5_${IMAGE_TAG} --build-arg BASE_IMAGE=\"${BC_BASE_IMAGE}\" ." + docker build -t my_redis:5.0.5_${IMAGE_TAG} --build-arg BASE_IMAGE="${BC_BASE_IMAGE}" . + echo "Build Redis image finished" + elif [ "${image}" == "mysql" ]; then + echo "Build MySQL image..." + cd $TONE_BM_SUITE_DIR/mysql + echo "CMD: docker build -t my_mysql:8.0.20_${IMAGE_TAG} --build-arg BASE_IMAGE=\"${BC_BASE_IMAGE}\" ." + docker build -t my_mysql:8.0.20_${IMAGE_TAG} --build-arg BASE_IMAGE="${BC_BASE_IMAGE}" . + echo "Build Redis image finished" + fi +} + +run(){ + if [ "${image}" == "busybox" ]; then + start_time=`date '+%s%3N'` + for ((i=1;i<=100;i++)) + do + docker run -tid $BUSYBOX_IMAGE + done + end_time=`date '+%s%3N'` + echo "100_containers: $[$end_time-$start_time] ms" + echo + elif [ "${image}" == "redis" ]; then + echo "CMD: docker run -it localhost/my_redis:5.0.5_${IMAGE_TAG} \"-t set,get -d 1024 -n 1000000\"" + docker run -it localhost/my_redis:5.0.5_${IMAGE_TAG} "-t set,get -d 1024 -n 1000000" + elif [ "${image}" == "mysql" ]; then + echo "CMD: docker run -itd localhost/my_mysql:8.0.20_${IMAGE_TAG}" + docker run -it localhost/my_mysql:8.0.20_${IMAGE_TAG} +# echo "CMD: docker run -it localhost/my_mysql:8.0.20_${IMAGE_TAG} \"--db-driver=mysql --test=/usr/local/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua --oltp-test-mode=complex --mysql-db=sysbench --mysql-password=qwer1234 --max-time=300 --max-requests=0 --mysql-user=root --mysql-table-engine=innodb --oltp-table-size=100000 --oltp-tables-count=10 --rand-type=special --rand-spec-pct=100 --num-threads=10\"" +# docker run -it localhost/my_mysql:8.0.20_${IMAGE_TAG} "--db-driver=mysql --test=/usr/local/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua --oltp-test-mode=complex --mysql-db=sysbench --mysql-password=qwer1234 --max-time=300 --max-requests=0 --mysql-user=root --mysql-table-engine=innodb --oltp-table-size=100000 --oltp-tables-count=10 --rand-type=special --rand-spec-pct=100 --num-threads=10" + fi +} + +teardown(){ + echo "Clean the containers..." + for container in `docker ps -a --format "{{.ID}}"` + do + docker stop ${container} + docker rm ${container} + done +} + +parse(){ + "$TONE_BM_SUITE_DIR"/parse.awk +} \ No newline at end of file