- 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 구성 파일 조정 가능
- yum을 통해 siege 명령어를 다운받는 경우 생성 구성 파일 : /etc/siege/siegerc
- 소스에서 패키지를 빌드로 설치한 경우 생성 구성 파일 ; /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
'성능 테스트' 카테고리의 다른 글
HAR 파일 Import와 Export (with Chrome 브라우저) (0) | 2024.03.21 |
---|---|
아파치벤치(ApacheBench, ab) 활용 (0) | 2023.09.15 |
vegeta(benchmark 오픈소스를 통한 부하테스트) (0) | 2022.07.11 |
sysbench 명령어 (서버 성능 테스트) (0) | 2022.06.27 |