Example:
brandon@brandon-laptop:~/workspaces/go/gb$ ./ab+.sh -k http://localhost/
Start benchmark
#/usr/bin/ab -c CONCURRENCY=(100 to 10000 step 100) -n NUM=(100*CONCURRENCY) -k http://localhost/
#start time,concurrency,complete requests,failed requests,tps,min,mean,stddev,median,max,90%,95%,99%
Wed Apr 3 11:52:29 CST 2013,100,10000,0,31272.48,0,3,5.4,0,32,11,16,22
Wed Apr 3 11:52:29 CST 2013,200,20000,0,32050.72,0,6,14.2,0,113,23,40,64
Wed Apr 3 11:52:30 CST 2013,300,30000,0,33527.94,0,5,11.6,0,207,16,28,53
Wed Apr 3 11:52:31 CST 2013,400,40000,0,32396.87,0,12,25.0,0,189,48,70,105
Wed Apr 3 11:52:32 CST 2013,500,50000,0,32492.75,0,15,35.9,0,391,51,109,166
Wed Apr 3 11:52:34 CST 2013,600,60000,0,33188.85,0,18,38.8,0,448,73,110,166
Wed Apr 3 11:52:36 CST 2013,700,70000,0,33436.38,0,21,46.9,0,483,71,134,221
Wed Apr 3 11:52:38 CST 2013,800,80000,0,33370.64,0,24,54.5,0,1015,74,145,264
Wed Apr 3 11:52:40 CST 2013,900,90000,0,34093.27,0,26,66.4,0,1150,78,133,260
Wed Apr 3 11:52:43 CST 2013,1000,100000,0,34448.17,0,27,68.4,2,1251,85,136,266
Wed Apr 3 11:52:46 CST 2013,1100,110000,0,34072.87,0,32,78.1,0,1129,101,170,368
Wed Apr 3 11:52:49 CST 2013,1200,120000,0,33332.79,0,36,86.2,0,1032,144,228,386
Wed Apr 3 11:52:53 CST 2013,1300,130000,0,34580.66,0,37,96.0,5,3349,116,201,346
Wed Apr 3 11:52:57 CST 2013,1400,140000,0,33776.24,0,41,96.3,0,689,153,262,475
Wed Apr 3 11:53:01 CST 2013,1500,150000,0,31418.26,0,47,114.7,0,1031,164,295,533
Wed Apr 3 11:53:06 CST 2013,1600,160000,0,33285.65,0,48,111.8,0,629,217,340,492
Wed Apr 3 11:53:11 CST 2013,1700,170000,0,33441.14,0,50,121.5,0,825,211,356,559
Wed Apr 3 11:53:16 CST 2013,1800,180000,0,31452.71,0,52,166.0,0,4253,163,294,496
Wed Apr 3 11:53:22 CST 2013,1900,190000,0,33781.89,0,56,139.8,0,1018,234,425,627
Wed Apr 3 11:53:28 CST 2013,2000,200000,0,33766.12,0,59,137.8,1,1335,265,398,624
...
ab+.sh 使用方式跟 ab 一樣,除了 -c 跟 -n 是由 script 動態來調整外,其它 ab 參數可以從命令列尾端代入,另外測試前要修改壓力參數來給定測試壓力範圍
- LOW_CONCURRENCY 初始的 concurreny 數
- HIGH_CONCURRENCY 最大的 concurreny 數
- RATE_CONCURRENCY 每回測試 concurreny 的累加值
- NUM_CALL 單個 concurrent user 要發送的 request 次數
ab+.sh
#!/bin/bash # ab+ # # os and network tuning # ulimit -n 100000 # sudo echo "2048 64512" > /proc/sys/net/ipv4/ip_local_port_range # sudo echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle # sudo echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse # sudo echo "10" > /proc/sys/net/ipv4/tcp_fin_timeout # sudo echo "65535" > /proc/sys/net/core/somaxconn # sudo echo "65535" > /proc/sys/net/ipv4/tcp_max_syn_backlog AB_PATH=/usr/bin/ab SS_PATH=/bin/ss LOW_CONCURRENCY=100 HIGH_CONCURRENCY=1000 CONCURRENCY_STEP=100 NUM_CALL=100 HOST=$(echo "$*" | perl -ne '/http.*?:\/\/([^\/?:#]*)/; print $1') PREFIX=$HOST$(date +"_%Y%m%d_%H%M") OUTPUT_FILE=$PREFIX.csv MAX_OPEN_FILES=$(ulimit -n) trap "exit;" SIGINT SIGTERM if [ "$MAX_OPEN_FILES" -le $HIGH_CONCURRENCY ]; then echo "Warning: open file limit < HIGH_CONCURRENCY" exit 1 fi echo "Starting benchmark" mkdir -p temp/"$PREFIX" echo "#$AB_PATH -c CONCURRENCY=($LOW_CONCURRENCY to $HIGH_CONCURRENCY step $CONCURRENCY_STEP) -n NUM=($NUM_CALL*CONCURRENCY) $*" | tee "$OUTPUT_FILE" echo "#start time,concurrency,complete requests,failed requests,tps,min,mean,stddev,median,max,90%,95%,99%" | tee -a "$OUTPUT_FILE" for (( concurrency=LOW_CONCURRENCY; concurrency<=HIGH_CONCURRENCY; concurrency+=CONCURRENCY_STEP )) do tempFile="temp/$PREFIX/c$concurrency-n$((NUM_CALL*concurrency)).log" echo "$AB_PATH -c $concurrency -n $((NUM_CALL*concurrency)) $*" > "$tempFile" startTime=$(date) $AB_PATH -c $concurrency -n $((NUM_CALL*concurrency)) "$@" >> "$tempFile" 2>&1 if [ $? -ne 0 ]; then echo "Error: please check $tempFile" exit 1 fi stats=$(egrep "Complete requests:|Failed requests:|Requests per second:|Total:" "$tempFile" | perl -pe 's/[^\d\.]+/ /g; s/^\s+//g;' | perl -pe 's/\s+$//g; s/\s+/,/g') histogram=$(egrep "90%|95%|99%" "$tempFile" | cut -c6- | perl -pe 's/[^\d\.]+/ /g; s/^\s+//g;' | perl -pe 's/\s+$//g; s/\s+/,/g') echo "$startTime,$concurrency,$stats,$histogram" | tee -a "$OUTPUT_FILE" tcpConnections=$($SS_PATH -s | egrep 'TCP:' | perl -ne '/(\d+)/; print $1') while [ $((tcpConnections+concurrency+CONCURRENCY_STEP)) -ge "$MAX_OPEN_FILES" ] do sleep 1 tcpConnections=$($SS_PATH -s | egrep 'TCP:' | perl -ne '/(\d+)/; print $1') done done rm -rf temp echo "Finished benchmark, see $OUTPUT_FILE"