티스토리 뷰

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

 

반응형
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday