오래전 이야기/Server

HTTP 성능체크

리눅스 엔지니어였던 2009. 2. 26. 10:59
HTTP성능툴
httperf 설명
 간단한버전
httperf --server 서버아이피 --port 80 --rate 1000 --num-conns 20000 --hog 혹은
ab -c 1000 -n 1000 -t 10 http://서버주소

. 웹 페이지 로딩시간 확인
#time -pa lynx -source http://kr.yahoo.com/ > /dev/null
real 0.74
user 0.16
sys 0.09
-------------
실제 접속시간 : 0.74-(0.16+0.09)=0.49초

2. 아파치 벤치 마킹
#man ab  사용법 보기
-n requests 요청을 수행할 개수
-c concurrency 요청을 만들 개수로 동시 사용자 개념으로 이해하면 되겠다.
-v verbosity  얼마나 자세한 정보를 화면에 출력해 줄 것인지 결정
-w HTML 문서형식으로 테이블로 만들어 결과를 화면에 출력
-k HTTP 프로토콜의 지속연결 (KeepAlive) 기능을 사용

#./ab -n 100 -c 10 http://kr.yahoo.com/:80/
10 명의 유저가 동시에 http://kr.yahoo.com//index.html 을 요청하는 것을 모
의 실험.
각각의 시뮬레이트 유저는 요청을 10 번씩 하게 됩니다

# ab -n 1500 -c 50 http://www.apache.kr.net:80/
요청을 30 x 50   (50 명의 사용자가, 각각 30 번의 요청)

Requests per second:    80.48
초당 80.48개를 요청 했음.

ab -n 10 -c 10 http://kr.yahoo.com/
ab[ -k ] [ -i ] [ -n 요청수 ] [ -t시간제한 ] [ -c 동시접속 ] [ -p POST file ]
[ -A인증 유저이름:패스워드 ] [ -P 프락시인증유저이름:패스워드 ] [ -H Custom
header ] [ -C Cookiename=value ] [ -Tcontent-type ] [ -v verbosity ] ] [ -w
HTML 출력 ] ] [-x <table> 속성] ] [ -y <tr> 속성 ] ] [ -z <td> 속성
][http://]서버이름[:port]/path
ab [ -V ] [ -h ]

설명
ab는 Apache Web server의 상태를 측정하는 툴이며 초당 Apache server가 얼마나
많은 요청을 처리할수 있는지를 측정할수 있다.

옵션
-k
HTTP KeepAlive (연결 지속성) 요소를 사용 가능 하게 한다. 이것은 하나의 HTTP
session에서 여러 개의 요청을 처리할 수 있다. 기본값은 연결 지속성 기능을
사용하지 않는다.
-i
GET 방식 대신에 HTTP 'HEAD'를 사용한다. POST와 섞어서 사용할수 없다.
-n 요청수
측정을 하기 위한 요청수를 지정한다. 따로 지정하지 않는다면 하나의 요청만이
수행된다.
-t 시간제한
측정을 어느 정도까지 할 지 초단위로 지정한다. 따로 지정하지 않으면 측정 세션에
대해서 50000개의 요청을 자동으로 정의한다. 고정된 시간 동안 서버를 측정하기
위하여 사용한다. 기본적으로 시간을 제한하지는 않는다.
-c 동시접속수
동시에 요청을 처리할 수 있는 수량을 지정한다. 기본값으로는 한번에 하나의
요청만을 수행한다. 즉 동시 접속을 하지 않는다는 의미이다.

-p POST file
아파치 웹서버에 어떠한 HTTP POST 요청을 보내기 위한 data를 가진 파일을
지정한다.

-A Authorization username:password
서버로 신용증명을 하는 기본 인증을 지원한다. 사용자 이름과 패스워드는 하나의
':'로 구분하고, uuencoded로변환한데이터를 보낸다. 문자열은 서버가 필요로 하든
안하든 상관없이 보내며, 401 인증을 보내는 것을 필요로 한다.

-p Proxy-Authorization username:password
프락시 서버로 신용증명을 하는 기본 인증을 지원한다. 사용자 이름과 패스워드는
하나의 ':'로 구분하고, uuencoded로변환한데이터를 보낸다. 문자열은 프락시가
필요로 하든 안하든 상관없이 보내며, 407 인증을 보내는 것을 필요로 한다.

-C Cookie name=value
요청에 'Cookie:' line을 추가한다. 이 인자는 'name=value'의 형태를 가진다. 이
옵션은 반복된다.

-H Header string
요청에 임의의 헤더를 추가한다. 이 인자는 유효한 헤더의 형태를 가지며, 보통
하나의 쌍으로 이루어진 필드 값을 콜론(:)으로 구분을 한다. 예를 들어

-T content-type
POST data에 대한 content-type header를 지정한다.

-v
출력 레벨을 지정한다. 4단계는 결과값 상단에 HTML 헤더를 출력하며, 3단계는
결과물 상단에 응답 코드(예를 들어 404, 200등)를 출력하며, 2단계는 경고와 정보
메세지를 출력한다.

-w
HTML table로 결과물을 출력한다. 기본 table은 2칼럼이며 흰색 바탕이다.
-x attributes
<table> 에 대한 속성을 지정한다. 속성은 <table 속성> 과 같이 들어간다.
-y attributes
<tr>에 대한 속성값을 지정한다.
-z attributes
<td>에 대한 속성값을 지정한다.
-V
버전 정보를 출력하고 프로그램을 종료한다.
-h
사용법에 대한 정보를 출력한다.

버그
고정 길이를 가진 다양한 정적 선언 버퍼가 있다. 이 사실로 인해서 비효율적인
명령 라인의 인자와 서버로부터의 헤더 응답, 그리고 다른 외부 입력과의 결합으로
인해 버퍼 오버 플로우가 발생할 수 있다.
Ab는 HTTP/1.x를 완전하게 충족시키지는 못한다.
대신 어떠한 형태의 응답도 수용할 수 있다.
프로그램에의한strstr(3)의 과도한 사용은 비정상적인 수행 결과를 가져오며, CPU
리소스를 잡아 먹게 된다.
서버의 한계에도달하기전에 ab에 의하여 한계에 접근 하지 않도록 ab를 수행해야
한다.

3.Httperf
Httperf 툴은 요청이 발생하는 비율, 총 연결 수, 타임아웃 한계 등을 제어할 수
있다.

프로그램 다운로드
http://www.hpl.hp.com/research/linux/httperf/download.php

# httperf --server www.superuser.co.kr --uri=/index.php --port 80 --num-conns
# 20000 --rate 1000 --hog
www.superuser.co.kr 웹서버의 80번 포트로 1초에 1000개씩 총 20000개의 접속을
만들어서 테스트 하는 예이다.
설치
#] ./configure
#] make
#] make install

--server 서버주소
여기에 적어 준 서버로 접속을 시도한다
--uri
여기에 적어 준 웹 페이지를 테스트한다
--port 숫자
여기에 적어 준 포트로 접속을 시도한다
--num-conns 숫자
총 몇개의 접속을 만들 것인지를 결정한다.
--rate 숫자
초당 몇개의 접속을 만들 것인지를 결정한다.
--timeout 숫자
숫자만큼의 초 이후 응답이 없는 연결은 timeout 에러로 처리한다.
--think-timeout 숫자
CGI등 서버쪽에서 처리해야 하는 일들이 있는 페이지의 경우 서버측에 이를 처리할
시간을 준다. timeout에서 이곳에 주어진 숫자만큼을 더한 값이 진짜 timeout값이
된다.
--hog
가능한 모든 포트를 사용한다. 이 옵션을 주지 않으면 기본적으로 1024부터
5000까지의 포트만 사용한다.



 복작합버전
 공개SW 웹서버 성능측정 프로그램 httperf

 1. 소개
 Httperf 툴은 요청이 발생하는 비율, 총 연결 수, 타임아웃 한계 등을 제어할 수 있다.
 다운로드는 http://www.hpl.hp.com/research/linux/httperf/ 에서 가능하며 설치는 일반적인 소스설치법과 동일하게
 ./configure ; make; make install 로 진행할수 있다.
 2. 명령행 옵션
 사용할 수 있는 옵션은 아래와 같다

 --server 서버주소
 여기에 적어 준 서버로 접속을 시도한다
 --port 숫자
 여기에 적어 준 포트로 접속을 시도한다
 --num-conns 숫자
 총 몇개의 접속을 만들 것인지를 결정한다.
 --rate 숫자
 초당 몇개의 접속을 만들 것인지를 결정한다.
 --timeout 숫자
 숫자만큼의 초 이후 응답이 없는 연결은 timeout 에러로 처리한다.
 --think-timeout 숫자
 CGI등 서버쪽에서 처리해야 하는 일들이 있는 페이지의 경우 서버측에 이를 처리할 시간을 준다.
 timeout에서 이곳에 주어진 숫자만큼을 더한 값이 진짜 timeout값이 된다.
 --hog
 가능한 모든 포트를 사용한다. 이 옵션을 주지 않으면 기본적으로 1024부터 5000까지의 포트만 사용한다.
 3. httperf - 사용예
 # httperf --server www.superuser.co.kr --port 80 --num-conns 20000 --rate 1000 --hog
 www.superuser.co.kr 웹서버의 80번 포트로 1초에 1000개씩 총 20000개의 접속을 만들어서 테스트 하는 예이다.

 4. idleconn - 사용예
 idleconn은 httperf 패키지안에 포함되어 있는 Idle connection 을 만들어 주는 프로그램이다.
 이 프로그램을 이용해서 동시접속자의 상황을 만들어 테스트 할수 있다.
 idleconn 이라고 치면 아래처럼 사용법이 나온다.
 [root@ns httperf-0.8]# idleconn
 Usage: idleconn server port numidle
 동시접속자를 한 250명정도 만들어본다
 [root@ns httperf-0.8]# idleconn linuxhowto.co.kr 80 250
 idleconn: creating and maintaining 250 idle connections
 동시접속자가 정말 만들어 졌는지 확인해보자
 [root@ns ~]# netstat -anptgrep httpdgrep ESTAwc -l
 250
 보는것처럼 250개의 연결된 접속을 생성해냈다.
 5. 결과분석
 실제 테스트 결과 아래와 같은 결과가 나타난다.
 각 항목이 무엇을 말하는지는 알아보자.
 Total: connections 500 requests 500 replies 500 test-duration 9.983 s
 Connection rate: 50.1 conn/s (20.0 ms/conn, <=1 concurrent connections)
 Connection time [ms]: min 1.6 avg 1.8 max 2.9 median 1.5 stddev 0.1
 Connection time [ms]: connect 0.0
 Connection length [replies/conn]: 1.000
 Request rate: 50.1 req/s (20.0 ms/req)
 Request size [B]: 67.0
 Reply rate [replies/s]: min 50.0 avg 50.0 max 50.0 stddev 0.0 (1 samples)
 Reply time [ms]: response 1.8 transfer 0.0
 Reply size [B]: header 217.0 content 5726.0 footer 0.0 (total 5943.0)
 Reply status: 1xx=0 2xx=500 3xx=0 4xx=0 5xx=0
 CPU time [s]: user 3.06 system 6.90 (user 30.7% system 69.1% total 99.8%)
 Net I/O: 294.0 KB/s (2.4*10^6 bps)
 Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
 Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
 결 과는 6개의 그룹으로 표시되고 전체테스트 요약("Total"), 접속상태관련("Connection"),
 HTTP request 부분 ("Request"), 서버로부터 받은 응답부분 ("Reply"),
 CPU 시간과 network bandwidth 사용량, 마지막으로 에러집계 ("Errors") 부분으로 구성된다
 실제 테스트 결과에서 주의깊게 보아야 하는부분은 서버의 응답시간을 표시하는 Reply time 부분이다.
 위의 결과에서는 응답시간이 1.8 ms 인것을 확인할수 있다
======================
<출처 : http://chokori.tistory.com/tag/HTTP >