mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-11-04 11:22:10 +08:00 
			
		
		
		
	* feat: add scripts format Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com> * feat: add go work Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com> --------- Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
		
			
				
	
	
		
			275 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			275 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
# Copyright 2020 Lingfei Kong <colin404@foxmail.com>. All rights reserved.
 | 
						|
# Use of this source code is governed by a MIT style
 | 
						|
# license that can be found in the LICENSE file.
 | 
						|
 | 
						|
: << EOF
 | 
						|
The API performance test script automatically executes wrk commands, collects data, analyzes it, and calls gnuplot to plot it
 | 
						|
 | 
						|
Usage (to test API performance) :
 | 
						|
 | 
						|
Start the openim-api(port 10002)
 | 
						|
 | 
						|
Execute the test script: ./wrktest.sh
 | 
						|
 | 
						|
The script will generate the data file.dat, each column meaning: concurrency QPS average response time success rate
 | 
						|
 | 
						|
Usage (Compare the results of 2 tests)
 | 
						|
 | 
						|
1. The performance test:. / wrktest. Sh openim apiserver - http://127.0.0.1:10002/healthz
 | 
						|
 | 
						|
Execute the command:./wrktest.sh diff apiserver.dat http.dat
 | 
						|
 | 
						|
>  Note: Make sure you have wrk and gnuplot installed on your system
 | 
						|
 | 
						|
EOF
 | 
						|
 | 
						|
openim_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
 | 
						|
wrkdir="${openim_root}/_output/wrk"
 | 
						|
jobname="openim-api"
 | 
						|
duration="300s"
 | 
						|
threads=$((3 * `grep -c processor /proc/cpuinfo`))
 | 
						|
 | 
						|
source "${openim_root}/scripts/lib/color.sh"
 | 
						|
 | 
						|
# Set wrk options
 | 
						|
openim::wrk::setup() {
 | 
						|
  #concurrent="200 500 1000 3000 5000 10000 15000 20000 25000 50000 100000 200000 500000 1000000"
 | 
						|
  concurrent="200 500 1000 3000 5000 10000 15000 20000 25000 50000"
 | 
						|
  cmd="wrk -t${threads} -d${duration} -T30s --latency"
 | 
						|
}
 | 
						|
 | 
						|
# Print usage infomation
 | 
						|
openim::wrk::usage()
 | 
						|
{
 | 
						|
  cat << EOF
 | 
						|
 | 
						|
Usage: $0 [OPTION] [diff] URL
 | 
						|
Performance automation test script.
 | 
						|
 | 
						|
  URL                    HTTP request url, like: http://127.0.0.1:10002/healthz
 | 
						|
  diff                   Compare two performance test results
 | 
						|
 | 
						|
OPTIONS:
 | 
						|
  -h                     Usage information
 | 
						|
  -n                     Performance test task name, default: apiserver
 | 
						|
  -d                     Directory used to store performance data and gnuplot graphic, default: _output/wrk
 | 
						|
 | 
						|
Reprot bugs to <3293172751nss@gmail.com>.
 | 
						|
EOF
 | 
						|
}
 | 
						|
 | 
						|
# Convert plot data to useable data
 | 
						|
function openim::wrk::convert_plot_data()
 | 
						|
{
 | 
						|
  echo "$1" | awk -v datfile="${wrkdir}/${datfile}" ' {
 | 
						|
  if ($0 ~ "Running") {
 | 
						|
    common_time=$2
 | 
						|
  }
 | 
						|
if ($0 ~ "connections") {
 | 
						|
  connections=$4
 | 
						|
  common_threads=$1
 | 
						|
}
 | 
						|
if ($0 ~ "Latency   ") {
 | 
						|
  avg_latency=convertLatency($2)
 | 
						|
}
 | 
						|
if ($0 ~ "50%") {
 | 
						|
  p50=convertLatency($2)
 | 
						|
}
 | 
						|
if ($0 ~ "75%") {
 | 
						|
  p75=convertLatency($2)
 | 
						|
}
 | 
						|
if ($0 ~ "90%") {
 | 
						|
  p90=convertLatency($2)
 | 
						|
}
 | 
						|
if ($0 ~ "99%") {
 | 
						|
  p99=convertLatency($2)
 | 
						|
}
 | 
						|
if ($0 ~ "Requests/sec") {
 | 
						|
  qps=$2
 | 
						|
}
 | 
						|
if ($0 ~ "requests in") {
 | 
						|
  allrequest=$1
 | 
						|
}
 | 
						|
if ($0 ~ "Socket errors") {
 | 
						|
  err=$4+$6+$8+$10
 | 
						|
}
 | 
						|
}
 | 
						|
END {
 | 
						|
rate=sprintf("%.2f", (allrequest-err)*100/allrequest)
 | 
						|
print connections,qps,avg_latency,rate >> datfile
 | 
						|
}
 | 
						|
 | 
						|
function convertLatency(s) {
 | 
						|
  if (s ~ "us") {
 | 
						|
    sub("us", "", s)
 | 
						|
    return s/1000
 | 
						|
  }
 | 
						|
if (s ~ "ms") {
 | 
						|
  sub("ms", "", s)
 | 
						|
  return s
 | 
						|
}
 | 
						|
if (s ~ "s") {
 | 
						|
  sub("s", "", s)
 | 
						|
  return s * 1000
 | 
						|
}
 | 
						|
}'
 | 
						|
}
 | 
						|
 | 
						|
# Remove existing data file
 | 
						|
function openim::wrk::prepare()
 | 
						|
{
 | 
						|
  rm -f ${wrkdir}/${datfile}
 | 
						|
}
 | 
						|
 | 
						|
# Plot according to gunplot data file
 | 
						|
function openim::wrk::plot() {
 | 
						|
  gnuplot <<  EOF
 | 
						|
set terminal png enhanced #输出格式为png文件
 | 
						|
set ylabel 'QPS'
 | 
						|
set xlabel 'Concurrent'
 | 
						|
set y2label 'Average Latency (ms)'
 | 
						|
set key top left vertical noreverse spacing 1.2 box
 | 
						|
set tics out nomirror
 | 
						|
set border 3 front
 | 
						|
set style line 1 linecolor rgb '#00ff00' linewidth 2 linetype 3 pointtype 2
 | 
						|
set style line 2 linecolor rgb '#ff0000' linewidth 1 linetype 3 pointtype 2
 | 
						|
set style data linespoints
 | 
						|
 | 
						|
set grid #显示网格
 | 
						|
set xtics nomirror rotate #by 90#只需要一个x轴
 | 
						|
set mxtics 5
 | 
						|
set mytics 5 #可以增加分刻度
 | 
						|
set ytics nomirror
 | 
						|
set y2tics
 | 
						|
 | 
						|
set autoscale  y
 | 
						|
set autoscale y2
 | 
						|
 | 
						|
set output "${wrkdir}/${qpsttlb}"  #指定数据文件名称
 | 
						|
set title "QPS & TTLB\nRunning: ${duration}\nThreads: ${threads}"
 | 
						|
plot "${wrkdir}/${datfile}" using 2:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE0000" axis x1y1 t "QPS","${wrkdir}/${datfile}" using 3:xticlabels(1) w lp pt 5 ps 1 lc rgbcolor "#0000CD" axis x2y2 t "Avg Latency (ms)"
 | 
						|
 | 
						|
unset y2tics
 | 
						|
unset y2label
 | 
						|
set ytics nomirror
 | 
						|
set yrange[0:100]
 | 
						|
set output "${wrkdir}/${successrate}"  #指定数据文件名称
 | 
						|
set title "Success Rate\nRunning: ${duration}\nThreads: ${threads}"
 | 
						|
plot "${wrkdir}/${datfile}" using 4:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#F62817" t "Success Rate"
 | 
						|
EOF
 | 
						|
}
 | 
						|
 | 
						|
# Plot diff graphic
 | 
						|
function openim::wrk::plot_diff()
 | 
						|
{
 | 
						|
  gnuplot <<  EOF
 | 
						|
set terminal png enhanced #输出格式为png文件
 | 
						|
set xlabel 'Concurrent'
 | 
						|
set ylabel 'QPS'
 | 
						|
set y2label 'Average Latency (ms)'
 | 
						|
set key below left vertical noreverse spacing 1.2 box autotitle columnheader
 | 
						|
set tics out nomirror
 | 
						|
set border 3 front
 | 
						|
set style line 1 linecolor rgb '#00ff00' linewidth 2 linetype 3 pointtype 2
 | 
						|
set style line 2 linecolor rgb '#ff0000' linewidth 1 linetype 3 pointtype 2
 | 
						|
set style data linespoints
 | 
						|
 | 
						|
#set border 3 lt 3 lw 2   #这会让你的坐标图的border更好看
 | 
						|
set grid #显示网格
 | 
						|
set xtics nomirror rotate #by 90#只需要一个x轴
 | 
						|
set mxtics 5
 | 
						|
set mytics 5 #可以增加分刻度
 | 
						|
set ytics nomirror
 | 
						|
set y2tics
 | 
						|
 | 
						|
#set pointsize 0.4 #点的像素大小
 | 
						|
#set datafile separator '\t' #数据文件的字段用\t分开
 | 
						|
 | 
						|
set autoscale  y
 | 
						|
set autoscale y2
 | 
						|
 | 
						|
#设置图像的大小 为标准大小的2倍
 | 
						|
#set size 2.3,2
 | 
						|
 | 
						|
set output "${wrkdir}/${t1}_${t2}.qps.ttlb.diff.png"  #指定数据文件名称
 | 
						|
set title "QPS & TTLB\nRunning: ${duration}\nThreads: ${threads}"
 | 
						|
plot "/tmp/plot_diff.dat" using 2:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE0000" axis x1y1 t "${t1} QPS","/tmp/plot_diff.dat" using 5:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE82EE" axis x1y1 t "${t2} QPS","/tmp/plot_diff.dat" using 3:xticlabels(1) w lp pt 5 ps 1 lc rgbcolor "#0000CD" axis x2y2 t "${t1} Avg Latency (ms)", "/tmp/plot_diff.dat" using 6:xticlabels(1) w lp pt 5 ps 1 lc rgbcolor "#6495ED" axis x2y2 t "${t2} Avg Latency (ms)"
 | 
						|
 | 
						|
unset y2tics
 | 
						|
unset y2label
 | 
						|
set ytics nomirror
 | 
						|
set yrange[0:100]
 | 
						|
set output "${wrkdir}/${t1}_${t2}.successrate.diff.png"  #指定数据文件名称
 | 
						|
set title "Success Rate\nRunning: ${duration}\nThreads: ${threads}"
 | 
						|
plot "/tmp/plot_diff.dat" using 4:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE0000" t "${t1} Success Rate","/tmp/plot_diff.dat" using 7:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE82EE" t "${t2} Success Rate"
 | 
						|
EOF
 | 
						|
}
 | 
						|
 | 
						|
# Start API performance testing
 | 
						|
openim::wrk::start_performance_test() {
 | 
						|
  openim::wrk::prepare
 | 
						|
 | 
						|
  for c in ${concurrent}
 | 
						|
  do
 | 
						|
    wrkcmd="${cmd} -c ${c} $1"
 | 
						|
    echo "Running wrk command: ${wrkcmd}"
 | 
						|
    result=`eval ${wrkcmd}`
 | 
						|
    openim::wrk::convert_plot_data "${result}"
 | 
						|
  done
 | 
						|
 | 
						|
  echo -e "\nNow plot according to ${COLOR_MAGENTA}${wrkdir}/${datfile}${COLOR_NORMAL}"
 | 
						|
  openim::wrk::plot &> /dev/null
 | 
						|
  echo -e "QPS graphic file is: ${COLOR_MAGENTA}${wrkdir}/${qpsttlb}${COLOR_NORMAL}
 | 
						|
Success rate graphic file is: ${COLOR_MAGENTA}${wrkdir}/${successrate}${COLOR_NORMAL}"
 | 
						|
}
 | 
						|
 | 
						|
while getopts "hd:n:" opt;do
 | 
						|
  case ${opt} in
 | 
						|
    d)
 | 
						|
      wrkdir=${OPTARG}
 | 
						|
      ;;
 | 
						|
    n)
 | 
						|
      jobname=${OPTARG}
 | 
						|
      ;;
 | 
						|
    ?)
 | 
						|
      openim::wrk::usage
 | 
						|
      exit 0
 | 
						|
      ;;
 | 
						|
  esac
 | 
						|
done
 | 
						|
 | 
						|
shift $(($OPTIND-1))
 | 
						|
 | 
						|
mkdir -p ${wrkdir}
 | 
						|
case $1 in
 | 
						|
  "diff")
 | 
						|
    if [ "$#" -lt 3 ];then
 | 
						|
      openim::wrk::usage
 | 
						|
      exit 0
 | 
						|
    fi
 | 
						|
 | 
						|
    t1=$(basename $2|sed 's/.dat//g') # 对比图中红色线条名称
 | 
						|
    t2=$(basename $3|sed 's/.dat//g') # 对比图中粉色线条名称
 | 
						|
 | 
						|
    join $2 $3 > /tmp/plot_diff.dat
 | 
						|
    openim::wrk::plot_diff `basename $2` `basename $3`
 | 
						|
    exit 0
 | 
						|
    ;;
 | 
						|
  *)
 | 
						|
    if [ "$#" -lt 1 ];then
 | 
						|
      openim::wrk::usage
 | 
						|
      exit 0
 | 
						|
    fi
 | 
						|
    url="$1"
 | 
						|
 | 
						|
    qpsttlb="${jobname}_qps_ttlb.png"
 | 
						|
    successrate="${jobname}_successrate.png"
 | 
						|
    datfile="${jobname}.dat"
 | 
						|
 | 
						|
    openim::wrk::setup
 | 
						|
    openim::wrk::start_performance_test "${url}"
 | 
						|
    ;;
 | 
						|
esac
 |