WEB 서비스를 운영하다 보면 해당 서비스 이하 WEB 서버들의 단위 응답속도나 전송 속도등의 성능 측정 데이터가 필요할 경우가 있다.
시중에는 이미 HP Lode Runner 와 같이 상용 성능 부하 테스트 측정 솔루션이 나와 있지만 그 가격이 만만치 않다.
때문에 자신이 운영하는 WEB 서버의 응답속도나 간단한 부하테스트등을 하기 위해서 Apache httpd 패키지에 포함된 ab 유틸을 활용한 Shell Script 을 이용하면 만족스러운 데이터를 얻을 수 있다.
1. 사용환경
- 아래와 같이 Shell Script를 수행할 수 있는 Linux OS 이하에 httpd Apache 패키지가 설치되어 있는 환경.
[root@TEST01 ~]# [root@TEST01 ~]# which ab /usr/bin/ab [root@TEST01 ~]# [root@TEST01 ~]# rpm -qf `which ab` httpd-2.2.3-63.el5.centos [root@TEST01 ~]# |
- ab 커맨드가 설치되어 있지 않을 경우 아래와 같이 YUM을 통해 httpd 패키지 설치
[root@TEST01 ~]# [root@TEST01 ~]# yum -y install httpd [root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# chkconfig --level 12345 httpd off [root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# chkconfig --list | grep httpd httpd 0:해제 1:해제 2:해제 3:해제 4:해제 5:해제 6:해제 [root@TEST01 ~]# [root@TEST01 ~]# |
2. Shell Script 의 실행
- 아래와 같이 shell script 만을 실행할 경우 사용 예시가 출력됨
[root@TEST01 ~]# [root@TEST01 ~]# ./performance_web.sh
Usage1 - ./performance_web.sh [URL] ex1) - ./performance_web.sh helperchoi.com
Usage2 - ./performance_web.sh [URL] [Run Time] [Start User] [Max User] [Incremental User] ex2) - ./performance_web.sh helperchoi.com 1 1 10 1
[root@TEST01 ~]# |
- 아래와 같이 서비스 URL 또는 WEB 서버의 IP를 파라메터로 입력할 경우 각각 TPS (Web서버의 초당 Request 처리량), Request 처리 응답시간, Request 를 처리하는 과정에서 초당 전체 전송된 데이터량, 성공한 Request , 응답 실패한 Request 수가 표기 되며, 측정 대상 Web 서버는 종류에 상관없이 측정이 가능하다.
[root@TEST01 ~]# [root@TEST01 ~]# ./performance_web.sh helperchoi.com
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request] 1 35.92 27.841 17.96 2 0
Web Server - Apache/2.2.3 Test URL - helperchoi.com Request Count - 1 User Session - 1 Use Keep Alive - No
[root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# ./performance_web.sh 14.49.42.115
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request] 1 36.54 27.369 18.27 2 0
Web Server - Apache/2.2.3 Test URL - 14.49.42.115 Request Count - 1 User Session - 1 Use Keep Alive - No
[root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# ./performance_web.sh google.com
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request] 1 7.85 127.350 3.93 2 0
Web Server - gws Test URL - google.com Request Count - 1 User Session - 1 Use Keep Alive - No
[root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# [root@TEST01 ~]# ./performance_web.sh yahoo.co.kr
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request] 1 3.38 295.906 1.69 2 1
Web Server - YTS/1.20.10 Test URL - yahoo.co.kr Request Count - 1 User Session - 1 Use Keep Alive - No
|
- 만약 단순 응답속도 측정이 아닌 성능 부하 테스트 형태의 동시단말(동시 접속 및 질의) User별 응답속도 및 측정 데이터가 필요할 경우 아래와 같이 각각 URL, 구간별 Request 를 발생시킬 Stress Time, Start User, Max User, 구간별 User 증가치 값을 파라메터로 입력하여 간단히 성능측정이 가능하다.
단 MAX User 값을 너무 많이 대입 할 경우 해당 시스템에 실제 부하를 초래하기 때문에 주의 필요.
(※출력된 데이터는 필드별 TAB 구분되어 출력되기 때문에 Excel 등에 Copy & Paste 하여 활용 할 수 있음)
[root@TEST01 ~]# [root@TEST01 ~]# ./performance_web.sh helperchoi.com 1 1 10 1
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request] 1 202.53 4.938 145.66 203 0 2 451.92 2.213 324.94 452 0 3 655.91 1.525 472.21 657 0 4 861.24 1.161 620.02 864 0 5 1076.45 0.929 774.60 1077 0 6 1355.77 0.738 975.84 1356 0 7 1626.63 0.615 1170.73 1627 0 8 1873.46 0.534 1349.17 1876 0 9 2049.00 0.488 1475.28 2050 0 10 2199.76 0.455 1583.83 2200 0
Web Server - Apache/2.2.3 Test URL - helperchoi.com Stress Time - 1 sec Start User - 1 Max User - 10 Incremental User - 1 Use Keep Alive - Yes
[root@TEST01 ~]# |
3. Shell Script Code
[root@TEST01 ~]# [root@TEST01 ~]# vi ./performance_web.sh #!/bin/bash #By Kwangmin Choi
[ $1 -ge 0 2>/dev/null ] VERIFY_CEHCK=`expr $2 + $3 + $4 + $5 + 0 2>/dev/null`
if [ $# -eq 0 ] then echo echo "Usage1 - $0 [URL]" echo "ex1) - $0 helperchoi.com" echo "" echo "Usage2 - $0 [URL] [Run Time] [Start User] [Max User] [Incremental User]" echo "ex2) - $0 helperchoi.com 1 1 10 1" echo exit 0
elif [ $# -eq 1 -a "$?" -ne 0 ] then URL=$1 echo echo -e "[Run User] \t[TPS] \t[Time Per Request : millisec] \t[Transfer rate: Kbytes/sec] \t[Complete Request] \t[Failed Request]" ab -n 2 -c 1 http://${URL}/ 2>/dev/null > result.list
TPS=`cat result.list | grep "Requests" | awk '{print $4}'` RESPONES_T_THREAD=`cat result.list | grep "across all concurrent requests" | awk '{print $4}'` TRANS_RATE=`cat result.list | grep "Transfer rate" | awk '{print $3}'` COMPLETE_R=`cat result.list | grep "Complete requests" | awk '{print $3}'` FAILED_R=`cat result.list | grep "Failed requests" | awk '{print $3}'`
echo -e "1 \t${TPS} \t${RESPONES_T_THREAD} \t${TRANS_RATE} \t${COMPLETE_R} \t${FAILED_R}"
echo echo "Web Server - `ab http://${URL}/ | grep "Server Software" | awk '{print $3}'`" echo "Test URL - ${URL}" echo "Request Count - 1" echo "User Session - 1" echo "Use Keep Alive - No" echo exit 0
elif [ $# -eq 5 -a "$VERIFY_CEHCK" -ge 0 ] then URL=$1 ###### helperchoi.com RUN_TIME=$2 ##### Request 지속시간 [sec] START_USER=$3 ##### 최소 동시단말 수 MAX_USER=$4 ##### 최대 동시단말 수 INCREMENTAL=$5 ##### 동시단말 증가 수 RUNUSER=${START_USER}
echo echo -e "[Run User] \t[TPS] \t[Time Per Request : millisec] \t[Transfer rate: Kbytes/sec] \t[Complete Request] \t[Failed Request]" while true do ab -t ${RUN_TIME} -c ${RUNUSER} -k http://${URL}/ 2>/dev/null > result.list TPS=`cat result.list | grep "Requests" | awk '{print $4}'` RESPONES_T_THREAD=`cat result.list | grep "across all concurrent requests" | awk '{print $4}'` TRANS_RATE=`cat result.list | grep "Transfer rate" | awk '{print $3}'` COMPLETE_R=`cat result.list | grep "Complete requests" | awk '{print $3}'` FAILED_R=`cat result.list | grep "Failed requests" | awk '{print $3}'` echo -e "${RUNUSER} \t${TPS} \t${RESPONES_T_THREAD} \t${TRANS_RATE} \t${COMPLETE_R} \t${FAILED_R}" RUNUSER=`expr ${RUNUSER} + ${INCREMENTAL}` if [ "${RUNUSER}" -gt "${MAX_USER}" ] then echo echo "Web Server - `ab http://${URL}/ | grep "Server Software" | awk '{print $3}'`" echo "Test URL - ${URL}" echo "Stress Time - ${RUN_TIME} sec" echo "Start User - ${START_USER}" echo "Max User - ${MAX_USER}" echo "Incremental User - ${INCREMENTAL}" echo "Use Keep Alive - Yes" echo exit 0 fi sleep 1 done else echo echo "Usage1 - $0 [URL]" echo "ex1) - $0 helperchoi.com" echo "" echo "Usage2 - $0 [URL] [Run Time] [Start User] [Max User] [Incremental User]" echo "ex2) - $0 helperchoi.com 1 1 10 1" echo exit 0 fi |