• siege 부하테스트는 대규모 테스트보다는 개발한 페이지 단위의 테스트에 적합
  • 개발자가 개발하면서 동시에 테스트해 정량적 데이터를 기준으로 성능 개선이 가능한 점이 편리함
  • siege는 유닉스 기반의 명령행 기반 툴으로, GNU GPL 오픈소스 라이선스를 따르기 때문에 사용, 수정, 배포가 모두 무료
  • siege는 단일 URL의 부하 테스트는 물론 많은 URL을 메모리로 불러들여 사용자가 설정한 시뮬레이션 유저만큼의 부하를 동시에 테스트할 수 있음
  • 기록된 총 히트수와 전송된 바이트수, 반응시간, 병행성(Concurrency), 리턴 상태 등을 보여주며, HTTP 1.0/1.1 프로토콜, GET/POST 디렉티브, 쿠키, 트랜잭션 로깅, 기본적인 인증 등을 지원

 

1. Linux에서 siege HTTP 부하 테스트 유틸리티 설치

1.1. CentOS/RHEL에서 siege 설치

$ yum groupinstall 'Development Tools'
$ yum install -y epel-release
$ yum install -y siege


# 설치 후 siege 버전 확인
$ siege --version
SIEGE 4.1.1

Copyright (C) 2021 by Jeffrey Fulmer, et al.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

 

 

1.2. wget 명령어를 사용하여 최신 버전의 siege를 다운로드 후에 설치

# 최신 버전은 siege 다운로드 및 압축 해제
$ wget http://download.joedog.org/siege/siege-latest.tar.gz
$ tar -zxvf siege-latest.tar.gz
$ cd siege-*/


# 컴파일 및 설치
$ ./configure --prefix=/usr/local --with-ssl=/usr/bin/openssl
$ make
$ make install


# 설치된 siege 명령어 위치 확인
$ which siege
/usr/local/bin/siege


# 설치 후 siege 버전 확인
$ siege --version
SIEGE 4.1.5

Copyright (C) 2022 by Jeffrey Fulmer, et al.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

 

 

2. Linux에서 Siege HTTP로드 테스트 유틸리티 구성

  • 설치를 완료하면 Siege 구성 파일 조정 가능
    1. yum을 통해 siege 명령어를 다운받는 경우 생성 구성 파일 : /etc/siege/siegerc
    2. 소스에서 패키지를 빌드로 설치한 경우 생성 구성 파일 ; /usr/local/bin/siege.config
      # ~/.siege/siege.conf에있는 siege.conf 파일이 생성
      $ siege.config

 

  • siegerc 파일 또는 siege.conf 파일 확인 → siege이 1 분에 25 명의 동시 사용자를 모방
    $ cat siegerc | grep -ivE "^$|#"
    verbose = true
    color = on
    quiet = false
    json_output = false
    show-logfile = true
    logging = false
    logfile = ${HOME}/siege.log
    gmethod = HEAD
    parser = true
    nofollow = ad.doubleclick.net
    nofollow = pagead2.googlesyndication.com
    nofollow = ads.pubsqrd.com
    nofollow = ib.adnxs.com
    limit = 255
    protocol = HTTP/1.1
    chunked = true
    cache = false
    connection = close
    concurrent = 25
    delay = 0.0
    internet = false
    benchmark = false
    accept-encoding = gzip, deflate
    url-escaping = true
    unique = true

 

 

3 siege 명령어 사용 옵션

옵션 설명
-C - 특정한 구성 파일 지정
-q - siege의 출력을 억제
-g - GET, HTTP 헤더를 풀다운하고 트랜잭션을 표시
- 디버깅에 유용
-c - 동시 사용자 수 설정
- 기본값은 10
-r - 테스트를 실행할 횟수
-t - 테스트를 실행할 시간 설정
- 테스트 실행 시간 단윈 : S, M, H
- 예시 : -t 10S → 10초 동안 테스트 지정
-d - 각 사용자 요청 사이의 시간 지연 지정
-b - 요청 사이에 지연이 없도록 설정
-i - user 시뮬레이션
- 임의의 URL을 적중하는 데 사용
-f - 지정된 파일에서 URL을 테스트
-l - 로그 파일 지정
-H - 요청할 헤더를 추가함
-A - 사용자 에이전드(User-Agent)를 지정
-T - 요청의 Content-Type을 지정
--no-parser - HTML 페이지 parser를 off
--no-follow - HTTP 리디렉션을 따르지 않음

 

 

4. siege 출력 결과 설명

구분 설명
Transactions - HTTP 요청횟수
- 예상되는 히트 수보다 더 많이 출력 가능
- 리다이렉션이나 인증문제로 2개의 히트를 하나로 계산하지 않음 → HTTP 사용을 따르는 브라우저 동작을 모방
Availability - 서버가 성공적으로 처리하는 소켓 연결의 확률
- 성공 횟수/연결시도 횟수 * 100 ( 400, 500 에러 제외)
Elapsed time - 전체 siege 테스트 하는데 걸리는 시간
Data transferred - siege가 시뮬레이션 된 브라우저에 전송하는 전체 데이터량
- 전체 데이터는 컨텐츠 뿐만 아니라 헤더 정보까지 포함
- 헤더 정보를 포함하기에 , siege가 표시하는 전체 데이터량은 서버가 전달하는 양보다 큼
- 특정 설정 파일에 있는 임의의 URL을 사용하는 internet 모드로 설정된 상황에서는 전체 전송 데이터량은 동작할 때마다 각각 값이 달라짐
Response time - siege가 시뮬레이션 된 브라우저의 각 요청에 대해 걸린 평균 응답시간
Transaction rate - 서버가 초당 처리할수 있는 트랜잭션 개수
Throughput - 서버에서 시뮬레이션 된 브라우저로 초당 전송되는 평균바이트단위의 데이터량
Concurrency - 동시 연결할수 있는 평균 개수이고, 증가할때마다 서버의 성능은 저하됨
Successful transactions - 트랜젝션 성공 횟수
- 서버가 400 이하의 응답코드를 반환하는 횟수
Failed transactions - 트랜젝션 실패 횟수
- 서버가 400 혹은 그이상의 응답코드를 반환하는 횟수
- 타임아웃 횟수를 포함한 소켓 연결이 실패된 트랜잭션의 합계도 나타냄
Longest transaction - 모든 트랜잭션중 단일 트랜잭션 처리에 걸린 가장 긴시간
Shortest transaction - 모든 트랜잭션중 단일 트랜잭션 처리에 걸린 가장 짧은 시간

 

 

5. siege 테스트

5.1. 1명의 가상의 유저가 1초동안 무제한으로 계속해서 접속 부하 테스트 (지연 X)

$ siege -c1 -t1s http://[domain]/test/upload/1.jpg
** SIEGE 4.1.1
** Preparing 1 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
....생략....
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.00 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg

Lifting the server siege...
Transactions:                     95 hits
Availability:                 100.00 %
Elapsed time:                   0.57 secs
Data transferred:              13.85 MB
Response time:                  0.01 secs
Transaction rate:             166.67 trans/sec
Throughput:                    24.29 MB/sec
Concurrency:                    0.98
Successful transactions:          95
Failed transactions:               0
Longest transaction:            0.04
Shortest transaction:           0.00

 

 

5.2. 1명의 가상의 유저가 1초동안 1초 간격으로 계속해서 접속 부하 테스트 (가상 유저의 요청 간격은 1초)

$ siege -c1 -t1s -d 1 http://[도메인]/test/upload/1.jpg
** SIEGE 4.1.1
** Preparing 1 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.08 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.00 secs:  152849 bytes ==> GET  /test/upload/1.jpg

Lifting the server siege...
Transactions:                      2 hits
Availability:                 100.00 %
Elapsed time:                   0.34 secs
Data transferred:               0.29 MB
Response time:                  0.04 secs
Transaction rate:               5.88 trans/sec
Throughput:                     0.86 MB/sec
Concurrency:                    0.24
Successful transactions:           2
Failed transactions:               0
Longest transaction:            0.08
Shortest transaction:           0.00

 

 

5.3. 10명의 가상의 유저가 1초동안 1초 간격으로 계속해서 접속 부하 테스트 (가상 유저의 요청 간격은 1초)

$ siege -c10 -t1s -d 1 http://[도메인]/test/upload/1.jpg
** SIEGE 4.1.1
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.05 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.05 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.05 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.05 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.05 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.05 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.00 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.05 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.00 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.00 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg

Lifting the server siege...
Transactions:                     16 hits
Availability:                 100.00 %
Elapsed time:                   0.34 secs
Data transferred:               2.33 MB
Response time:                  0.03 secs
Transaction rate:              47.06 trans/sec
Throughput:                     6.86 MB/sec
Concurrency:                    1.47
Successful transactions:          16
Failed transactions:               0
Longest transaction:            0.05
Shortest transaction:           0.04

 

 

5.4. 10명의 가상의 유저가 10회 반복으로 접속 부하 테스트

$ siege -c10 -r 10 http://[도메인]/test/upload/1.jpg
** SIEGE 4.1.1
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.04 secs:  152849 bytes ==> GET  /test/upload/1.jpg
...생략...
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg
HTTP/1.1 200     0.01 secs:  152849 bytes ==> GET  /test/upload/1.jpg

Transactions:                    100 hits
Availability:                 100.00 %
Elapsed time:                   0.17 secs
Data transferred:              14.58 MB
Response time:                  0.02 secs
Transaction rate:             588.24 trans/sec
Throughput:                    85.75 MB/sec
Concurrency:                    9.41
Successful transactions:         100
Failed transactions:               0
Longest transaction:            0.06
Shortest transaction:           0.00

 

 

5.5. 1명의 가상의 유저가 특정 파일의 URL을 읽어서 접속 부하 테스트

# dims_list.txt 파일에는 서로 다른 URL 있음(위 URL 묶음을 넣을 수 있음)
$ siege -c1 -r 40 -f dims_list.txt
** SIEGE 4.1.1
** Preparing 1 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.06 secs:  140803 bytes ==> GET  /test/upload/1.jpg/dims/resize/500X500
HTTP/1.1 200     0.05 secs:  183271 bytes ==> GET  /test/upload/2.jpg/dims/resize/500X500
HTTP/1.1 200     0.35 secs:  350565 bytes ==> GET  /test/upload/3.jpg/dims/resize/500X500
HTTP/1.1 200     0.04 secs:  101547 bytes ==> GET  /test/upload/4.jpg/dims/resize/500X500
...생략...
HTTP/1.1 200     0.04 secs:  151130 bytes ==> GET  /test/upload/36.jpg/dims/resize/500X500
HTTP/1.1 200     0.04 secs:  130278 bytes ==> GET  /test/upload/37.jpg/dims/resize/500X500
HTTP/1.1 200     0.05 secs:  161169 bytes ==> GET  /test/upload/38.jpg/dims/resize/500X500
HTTP/1.1 200     0.04 secs:  150939 bytes ==> GET  /test/upload/39.jpg/dims/resize/500X500
HTTP/1.1 200     0.04 secs:  133090 bytes ==> GET  /test/upload/40.jpg/dims/resize/500X500

Transactions:                     40 hits
Availability:                 100.00 %
Elapsed time:                   2.40 secs
Data transferred:               6.87 MB
Response time:                  0.06 secs
Transaction rate:              16.67 trans/sec
Throughput:                     2.86 MB/sec
Concurrency:                    1.00
Successful transactions:          40
Failed transactions:               0
Longest transaction:            0.36
Shortest transaction:           0.03

 

 

5.6. 40명의 가상의 유저가 특정 파일의 URL을 읽어서 접속 부하 테스트

# dims_list.txt 파일에는 서로 다른 URL 있음(위 URL 묶음을 넣을 수 있음)
$ siege -c40 -r 1 -f dims_list.txt
** SIEGE 4.1.1
** Preparing 40 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.08 secs:  173928 bytes ==> GET  /test/upload/11.jpg/dims/resize/500X500
HTTP/1.1 200     0.08 secs:  130312 bytes ==> GET  /test/upload/5.jpg/dims/resize/500X500
HTTP/1.1 200     0.08 secs:  241077 bytes ==> GET  /test/upload/28.jpg/dims/resize/500X500
HTTP/1.1 200     0.09 secs:  116310 bytes ==> GET  /test/upload/12.jpg/dims/resize/500X500
HTTP/1.1 200     0.09 secs:  181265 bytes ==> GET  /test/upload/14.jpg/dims/resize/500X500
...생략...
HTTP/1.1 200     0.21 secs:  200534 bytes ==> GET  /test/upload/26.jpg/dims/resize/500X500
HTTP/1.1 200     0.22 secs:  249170 bytes ==> GET  /test/upload/9.jpg/dims/resize/500X500
HTTP/1.1 200     0.41 secs:  360241 bytes ==> GET  /test/upload/13.jpg/dims/resize/500X500
HTTP/1.1 200     0.47 secs:  350565 bytes ==> GET  /test/upload/3.jpg/dims/resize/500X500

Transactions:                     40 hits
Availability:                 100.00 %
Elapsed time:                   0.47 secs
Data transferred:               6.87 MB
Response time:                  0.15 secs
Transaction rate:              85.11 trans/sec
Throughput:                    14.63 MB/sec
Concurrency:                   12.51
Successful transactions:          40
Failed transactions:               0
Longest transaction:            0.47
Shortest transaction:           0.08

 

 

5.7. 200명의 가상의 유저가 특정 파일의 URL을 읽어서 접속 부하 테스트

# 200_dims_list.txt 파일에 resize 크기만 다르게 하여서 200개 생성
$ siege -c200 -r 1 -f 200_dims_list.txt
** SIEGE 4.1.1
** Preparing 200 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.11 secs:   22699 bytes ==> GET  /test/upload/12.jpg/dims/resize/200X200
HTTP/1.1 200     0.12 secs:  218332 bytes ==> GET  /test/upload/37.jpg/dims/resize/700X700
HTTP/1.1 200     0.13 secs:   25510 bytes ==> GET  /test/upload/31.jpg/dims/resize/200X200
HTTP/1.1 200     0.16 secs:  130278 bytes ==> GET  /test/upload/37.jpg/dims/resize/500X500
HTTP/1.1 200     0.16 secs:   27489 bytes ==> GET  /test/upload/39.jpg/dims/resize/200X200
HTTP/1.1 200     0.22 secs:  131463 bytes ==> GET  /test/upload/35.jpg/dims/resize/500X500
HTTP/1.1 200     0.26 secs:   31468 bytes ==> GET  /test/upload/36.jpg/dims/resize/200X200
...생략...
HTTP/1.1 200     2.91 secs: 1531300 bytes ==> GET  /test/upload/14.jpg/dims/resize/2100X2100
HTTP/1.1 200     2.93 secs: 1870440 bytes ==> GET  /test/upload/2.jpg/dims/resize/2100X2100
HTTP/1.1 200     2.94 secs: 1286358 bytes ==> GET  /test/upload/38.jpg/dims/resize/2100X2100
HTTP/1.1 200     3.11 secs:  350565 bytes ==> GET  /test/upload/3.jpg/dims/resize/500X500
HTTP/1.1 200     3.26 secs:  621024 bytes ==> GET  /test/upload/13.jpg/dims/resize/700X700
HTTP/1.1 200     3.31 secs:   68988 bytes ==> GET  /test/upload/3.jpg/dims/resize/200X200
HTTP/1.1 200     3.60 secs:  360241 bytes ==> GET  /test/upload/13.jpg/dims/resize/500X500
HTTP/1.1 200     3.64 secs:  609878 bytes ==> GET  /test/upload/3.jpg/dims/resize/700X700
HTTP/1.1 200     4.56 secs: 1044667 bytes ==> GET  /test/upload/3.jpg/dims/resize/1000X1000
HTTP/1.1 200     6.75 secs: 3148711 bytes ==> GET  /test/upload/3.jpg/dims/resize/2100X2100
HTTP/1.1 200     7.96 secs: 3231253 bytes ==> GET  /test/upload/13.jpg/dims/resize/2100X2100

Transactions:                    200 hits
Availability:                 100.00 %
Elapsed time:                   7.98 secs
Data transferred:             100.42 MB
Response time:                  1.60 secs
Transaction rate:              25.06 trans/sec
Throughput:                    12.58 MB/sec
Concurrency:                   40.20
Successful transactions:         200
Failed transactions:               0
Longest transaction:            7.96
Shortest transaction:           0.11

+ Recent posts