5가지 서버 퍼포먼스 툴의 사용 예시와 용도, 장단점을 따지는 글입니다. 예시는 거창한 내용은 아니고 설치 방법과 튜토리얼을 요약한 내용입니다.
가장 유명한 HP의 loadrunner는 상용 툴이기에 제외했습니다.
WrkVegetaGatlingJMeternGrinderakka-http를 사용해서 요청을 받으면 로컬에 로깅하고 로그파일을 S3에 올리는 간단한 scala 프로그램을 만들었습니다.
서버에서 sbt를 이용해 jar 파일을 실행시킵니다.
프로그램이 올라간 서버는 AWS EC2의 t2.medium (CPU 2개, 메모리 4GIB)입니다.
Wrk는 멀티 스레드로 사용자를 만들어 테스트하는 오픈소스 툴 입니다.
// wrk -t[쓰레드] -c[유저수] -d[시간] -s [lua script] "http://url/postback" --latency
wrk -t8 -c256 -d10s -s pipeline.lua "http://url/postback" --latencypipeline.lua
request = function()
wrk.headers["Connection"] = "Keep-Alive"
param_value1 = math.random(1, 5)
param_value2 = math.random(1, 5)
type_rand = math.random(1, 30)
path1 = "?name=" .. type_rand
path2 = "&p1=" .. param_value1
path3 = "&p2=" .. param_value2
return wrk.format(nil, "http://url/postback" .. path1 .. path2 .. path3)
end결과
Running 10s test @ http://ec2-ip.ap-northeast-2.compute.amazonaws.com:18080/postback
8 threads and 256 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 464.61ms 253.14ms 1.99s 87.46%
Req/Sec 48.67 34.53 217.00 70.43%
Latency Distribution
50% 409.18ms
75% 549.74ms
90% 664.65ms
99% 1.63s
3279 requests in 10.07s, 658.96KB read
Socket errors: connect 0, read 0, write 0, timeout 130
Requests/sec: 325.46
Transfer/sec: 65.41KBlight java 라는 라이브러리 Github 페이지에서 다른 프레임워크와 밴치마킹을 하는 것을 보고 사용했는데 간단하고 CLI 환경에서 사용하기는 괜찮았습니다.
한 가지 이상했던 점은 결과 값으로 나온 3279 + 120 요청보다 실제 로그에 기록된 횟수는 더 많았습니다. 실제 몇 개가 날라갔는지 알 방법은 없어 보였습니다.
Vegeta는 go 기반으로 만들어졌고 Github 리드미에도 드래곤볼 베지터가 그려진 나름 센스있는 툴입니다.
//echo [method url] | vageta attack -[시간] -[시간당 보내는 개수] -[시간제한] | tee [에러셋 리포트 이름] | vegeta report
echo "GET http://url/postback?name=user1&ak=123&ck=456&t=test" | vegeta attack -duration=5s -rate=200 -timeout=5s | tee results.bin | vegeta report
Requests [total, rate] 1000, 200.17
Duration [total, attack, wait] 11.790169924s, 4.995631893s, 6.794538031s
Latencies [mean, 50, 95, 99, max] 3.497947328s, 3.541281665s, 6.435849969s, 6.760585856s, 6.804998234s
Bytes In [total, mean] 78000, 78.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:1000
Error Set:Wrk와 다르게 Vegeta는 보낸 요청의 timeout이 안 지나면 요청에 응답이 돌아올 때까지 기다리고 리포트를 띄우는 걸로 보입니다.
duration 인자에 시간과 별개로 시간이 걸리고 Error Set을 출력해줍니다.
Go와 명령행에서 둘 다 쓸수 있는 점은 매우 좋아보입니다.
인자들을 확인하려면 다음 링크에서 확인하세요
https://github.com/tsenart/vegeta
Gatling은 scala 기반으로 netty, akka를 사용한 테스트 툴 입니다.
gatling 사이트에서 들어가면 다운로드 파일을 받습니다.
gatling 파일에 테스트 스크립트를 작성합니다.
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicSimulation extends Simulation {
// http의 헤더 설정
val httpConf = http
.baseURL("http://url")
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.doNotTrackHeader("1")
.acceptLanguageHeader("en-US,en;q=0.5")
.acceptEncodingHeader("gzip, deflate")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")
def randNum = (Math.random() * 10 + 1).toInt
// 임의에 query param
def randParam = Map(
"name" -> s"name${randNum}",
"p1" -> randNum,
"p2" -> randNum
)
// 실제 시나리오
val scn = scenario("BasicSimulation") // 시나리오 이름
.exec(http("request-1").get("/hello")) // 시나리오 1
.pause(2) // 대기
.exec(http("request-2").get("").queryParamMap(randParam)) // 시나리오 2
.pause(2)
setUp(
scn.inject(atOnceUsers(1))
).protocols(httpConf)
}환경변수를 넣어줍니다.
export GATLING_HOME=/Users/Downloads/gatling-charts-highcharts-bundle-2.3.1gatling.sh를 실행합니다. 윈도우에서는 gatling.bat 파일을 실행해줍니다.
sudo $GATLING_HOME/bin/gatling.sh테스트 결과 다음과 같습니다.
Select simulation id (default is 'basicsimulation'). Accepted characters are a-z, A-Z, 0-9, - and _
test-1
Select run description (optional)
Simulation computerdatabase.BasicSimulation started...
================================================================================
2018-07-10 18:07:04 5s elapsed
---- Requests ------------------------------------------------------------------
> Global (OK=200 KO=0 )
> request-1 (OK=100 KO=0 )
> request-2 (OK=100 KO=0 )
---- BasicSimulation -----------------------------------------------------------
[##########################################################################]100%
waiting: 0 / active: 0 / done:100
================================================================================
Simulation computerdatabase.BasicSimulation completed in 3 seconds
Parsing log file(s)...
Parsing log file(s) done
Generating reports...
================================================================================
---- Global Information --------------------------------------------------------
> request count 200 (OK=200 KO=0 )
> min response time 442 (OK=442 KO=- )
> max response time 1311 (OK=1311 KO=- )
> mean response time 796 (OK=796 KO=- )
> std deviation 189 (OK=189 KO=- )
> response time 50th percentile 748 (OK=748 KO=- )
> response time 75th percentile 898 (OK=898 KO=- )
> response time 95th percentile 1100 (OK=1100 KO=- )
> response time 99th percentile 1102 (OK=1102 KO=- )
> mean requests/sec 50 (OK=50 KO=- )
---- Response Time Distribution ------------------------------------------------
> t < 800 ms 131 ( 66%)
> 800 ms < t < 1200 ms 68 ( 34%)
> t > 1200 ms 1 ( 1%)
> failed 0 ( 0%)
================================================================================터미널에 로그도 띄어주고 응답시간이나 성공, 실패등을 그래프로 그려서 html 파일에 저장해줍니다.


html 리포트 파일을 보시면 응답시간 분포를 확인할 수 있습니다.
시간별 응답 분포를 볼 수 있고 테스트 중에서도 퍼포먼스만 테스트한다면 괜찮은 툴로 보였습니다. 하지만 단점으로는 스칼라로 스크립트를 해야하는 점이 별로였습니다. 스칼라 특유의 난해함을 스크립트 작성때도 느껴야 하는 것은 별로입니다.
JMeter는 아파치에서 만든 java 기반의 오픈소스로 오래된 테스트 툴중 하나입니다.
JMeter 기본적으로 자바가 설치되어 있어야합니다.
설치는 https://jmeter.apache.org/download_jmeter.cgi를 참고하거나 mac과 우분투에서는 apt, brew 같은 패키지 관리자로도 설치가 가능합니다.
brew install jmeter저는 brew로 설치해 응용프로그램에 jmeter가 안 보여서 콘솔에서 jmeter를 켜야했습니다.
sudo jmeter먼저 시나리오를 만들어서 그 안에 스레드 그룹을 만들고 유저수(스레드)와 몇 번 반복할지를 입력합니다.

그 다음 원하는 add 버튼을 눌러서 프로토콜의 request를 추가하고 server ip와 포트를 입력하고 인자 값까지 추가 할수 있습니다.

리포트는 graph, summary, table 등 다양하게 있습니다. 보고 싶은 리포트가 있다면 add 버튼에서 listener를 추가할 수 있습니다.

start 버튼으로 실행시키면 테스트가 실행됩니다.
추가적으로 groovy, java, shell 스크립트를 추가할 수 있습니다.
제 서버에서는 S3에서 파일을 다운 받아 제대로 로깅 됬는지 확인하는 스크립트를 작성할수 있었습니다.
http://doloadtest.blogspot.com/2018/04/upload-download-from-aws-s3-via-jmeter.html
위의 테스트 툴이 웹서버에만 한정해서 테스트가 가능했다면 JMeter는 서버 전체의 다양한 테스트가 가능했습니다.
구관이 명관이란 말이 있듯 좋은 툴입니다. 부하테스트만 할 생각인데 불필요할 정도로 기능이 많고 플러그인도 많고 부하 테스트 외 다른 테스트 목적으로도 쓸모 있어 보였습니다.
nGrinder는 네이버에서 만든 오픈 소스입니다.
저는 tomcat을 설치하고 싶지 않아서 nGrinder controller는 docker에서 설치했습니다.
docker pull ngrinder/controller:3.4
docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller -p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 ngrinder/controller:3.4그 후 localhost에 들어가 로그인하고 agent를 설치했습니다. 초기 아이디 비밀번호는 admin으로 들어가시면 됩니다.
agent를 실행하면 controller에서 agent를 찾아냅니다.
/ngrinder-agent/run_agent.sh다른 툴들과 같이 입력할 사항 스크립트를 등록하고 테스트를 실행시킵니다.

그러면 모니터링을 볼수 있고 결과가 남습니다.

테스트를 예약해서 주기적으로 할 수 있고 모니터링도 심플하고 좋았습니다. 개인적으로 위의 4가지 툴 보다 편리했습니다.
Wrk : 몇 개 날리는게 상관 없이 간단하게 서버 부하 테스트를 하고 싶을 때
Vegeta : 초당 몇 개의 부하를 버티는지 테스트 하고 싶을 때
Gatling : 높은 성능, 시나리오 작성, html 보고서
JMeter : 성능 보단 다양한 기능이나 플러그인
nGrinder : 지속적인 테스트, 모니터링
<매드업>은 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원활하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.
<매드업>은 회사는 개인정보처리방침을 개정하는 경우 웹사이트 공지사항(또는 개별공지)을 통하여 공지할 것입니다.
○ 본 방침은 2020년 1월 15일부터 시행됩니다.
개인정보의 처리 목적 <매드업>은 개인정보를 다음의 목적을 위해 처리합니다. 처리한 개인정보는 다음의 목적 이외의 용도로는 사용되지 않으며 이용 목적이 변경될 시에는 사전동의를 구할 예정입니다.
가. 홈페이지 회원가입 및 관리 회원 가입의사 확인, 회원제 서비스 제공에 따른 본인 식별·인증, 회원자격 유지·관리, 제한적 본인확인제 시행에 따른 본인확인, 서비스 부정이용 방지, 만14세 미만 아동 개인정보 수집 시 법정대리인 동의 여부 확인, 각종 고지·통지, 고충처리, 분쟁 조정을 위한 기록 보존 등을 목적으로 개인정보를 처리합니다.
나. 민원사무 처리 민원인의 신원 확인, 민원사항 확인, 사실조사를 위한 연락·통지, 처리결과 통보 등을 목적으로 개인정보를 처리합니다.
다. 재화 또는 서비스 제공 물품배송, 서비스 제공, 청구서 발송, 콘텐츠 제공, 맞춤 서비스 제공, 본인인증, 연령인증, 요금결제·정산 등을 목적으로 개인정보를 처리합니다.
라. 마케팅 및 광고에의 활용 신규 서비스(제품) 개발 및 맞춤 서비스 제공, 이벤트 및 광고성 정보 제공 및 참여기회 제공 , 인구통계학적 특성에 따른 서비스 제공 및 광고 게재 , 서비스의 유효성 확인, 접속빈도 파악 또는 회원의 서비스 이용에 대한 통계 등을 목적으로 개인정보를 처리합니다.
개인정보 파일 현황
가. 개인정보 파일명 : 개인정보 처리방침
개인정보 항목 : 이메일, 휴대전화번호, 비밀번호, 이름, 업체명, 제목, 광고 예산, 내용, 사업자 등록 번호, 신용카드정보, 은행계좌정보, 예금주, 생년월일, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보, 결제기록
수집방법 : 홈페이지, 계약서
보유근거 : 홈페이지 회원정보 수집 등에 관한 기록
보유기간 : 5년
관련법령 : 대금결제 및 재화 등의 공급에 관한 기록 : 5년
개인정보의 처리 및 보유 기간 ① <매드업>은 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의 받은 개인정보 보유,이용기간 내에서 개인정보를 처리,보유합니다. ② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.
가. <홈페이지 회원가입 및 관리> <홈페이지 회원가입 및 관리>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<5년>까지 위 이용목적을 위하여 보유.이용됩니다.
보유근거 : 홈페이지 회원정보 수집 등에 관한 기록
관련법령 : 대금결제 및 재화 등의 공급에 관한 기록 : 5년
예외사유 :
나. <재화 또는 서비스 제공> <재화 또는 서비스 제공>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<5년>까지 위 이용목적을 위하여 보유.이용됩니다.
보유근거 : 계약 또는 청약철회 등에 관한 기록
관련법령 : 계약 또는 청약철회 등에 관한 기록 : 5년
예외사유 :
다. <마케팅 및 광고에의 활용> <마케팅 및 광고에의 활용>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<3년>까지 위 이용목적을 위하여 보유.이용됩니다.
보유근거 : 전자상거래등에서의 소비자보호에 관한 법률
관련법령 : 소비자의 불만 또는 분쟁처리에 관한 기록 : 3년
예외사유 :
정보 주체와 법정대리인의 권리·의무 및 그 행사방법 이용자는 개인정보주체로써 다음과 같은 권리를 행사할 수 있습니다.
① 정보주체는 매드업에 대해 언제든지 개인정보 열람,정정,삭제,처리 정지 요구 등의 권리를 행사할 수 있습니다.
② 제1항에 따른 권리 행사는 매드업에 대해 개인정보 보호법 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 매드업은 이에 대해 지체 없이 조치하겠습니다.
③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다. 이 경우 개인정보 보호법 시행규칙 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다.
④ 개인정보 열람 및 처리 정지 요구는 개인정보보호법 제35조 제5항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다.
⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.
⑥ 매드업은 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리 정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다.
처리하는 개인정보의 항목 작성
① <매드업>은 다음의 개인정보 항목을 처리하고 있습니다.
가. <홈페이지 문의 및 관리>
필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 휴대전화번호, 비밀번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보
선택항목 : 프로필 사진
나. <재화 또는 서비스 제공>
필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 비밀번호, 이름, 회사명, 사업자 등록 번호, 신용카드정보, 은행계좌정보, 예금주, 생년월일, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보, 결제기록
선택항목 :
다. <마케팅 및 광고에의 활용>
필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 휴대전화번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보
선택항목 :
개인정보의 파기<매드업>은 원칙적으로 개인정보 처리 목적이 달성된 경우에는 지체없이 해당 개인정보를 파기합니다. 파기의 절차, 기한 및 방법은 다음과 같습니다.
파기절차
이용자가 입력한 정보는 목적 달성 후 별도의 DB에 옮겨져(종이의 경우 별도의 서류) 내부 방침 및 기타 관련 법령에 따라 일정기간 저장된 후 혹은 즉시 파기됩니다. 이 때, DB로 옮겨진 개인정보는 법률에 의한 경우가 아니고서는 다른 목적으로 이용되지 않습니다.
파기기한
이용자의 개인정보는 개인정보의 보유기간이 경과된 경우에는 보유기간의 종료일로부터 5일 이내에, 개인정보의 처리 목적 달성, 해당 서비스의 폐지, 사업의 종료 등 그 개인정보가 불필요하게 되었을 때에는 개인정보의 처리가 불필요한 것으로 인정되는 날로부터 5일 이내에 그 개인정보를 파기합니다.
파기방법
전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다. 종이에 출력된 개인정보는 분쇄기로 분쇄하거나 소각을 통하여 파기합니다.
개인정보 자동 수집 장치의 설치•운영 및 거부에 관한 사항
① 매드업은 개별적인 맞춤서비스를 제공하기 위해 이용 정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용합니다.
② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터 내의 하드디스크에 저장되기도 합니다.
가. 쿠키의 사용 목적 : 이용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 이용자에게 최적화된 정보 제공을 위해 사용됩니다.
나. 쿠키의 설치•운영 및 거부 : 웹브라우저 상단의 도구>인터넷 옵션>개인정보 메뉴의 옵션 설정을 통해 쿠키 저장을 거부 할 수 있습니다.
다. 쿠키 저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다.
개인정보 보호책임자 작성
① 매드업은 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.
▶ 개인정보 보호책임자
성명 : 강남석
직책 : CFO
직급 : CFO
연락처 : 02-1522-1060, contact@madup.com
※ 개인정보 보호 담당부서로 연결됩니다.
▶ 개인정보 보호 담당부서
부서명 : General Affairs Team
담당자 : 민상준
연락처 : 02-1522-1060, contact@madup.com
② 정보 주체께서는 매드업의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. 매드업은 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.
개인정보 처리방침 변경
① 이 개인정보처리방침은 시행일로부터 적용되며, 법령 및 방침에 따른 변경 내용의 추가, 삭제 및 정정이 있는 경우에는 변경사항의 시행 7일 전부터 공지사항을 통하여 고지할 것입니다.
개인정보의 안전성 확보 조치 <매드업>은 개인정보보호법 제29조에 따라 다음과 같이 안전성 확보에 필요한 기술적/관리적 및 물리적 조치를 하고 있습니다.
가. 정기적인 자체 감사 실시 개인정보 취급 관련 안정성 확보를 위해 정기적(분기 1회)으로 자체 감사를 실시하고 있습니다.
나. 개인정보 취급 직원의 최소화 및 교육 개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.
다. 내부관리계획의 수립 및 시행 개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.
라. 해킹 등에 대비한 기술적 대책 <매드업>은 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신·점검을 하며 외부로부터 접근이 통제된 구역에 시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.
마. 개인정보의 암호화 이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다.
바. 접속 기록의 보관 및 위변조 방지 개인정보처리시스템에 접속한 기록을 최소 6개월 이상 보관, 관리하고 있으며, 접속 기록이 위변조 및 도난, 분실되지 않도록 보안기능 사용하고 있습니다.
사. 개인정보에 대한 접근 제한 개인정보를 처리하는 데이터베이스시스템에 대한 접근 권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다.
아. 문서 보안을 위한 잠금 장치 사용 개인정보가 포함된 서류, 보조저장매체 등을 잠금 장치가 있는 안전한 장소에 보관하고 있습니다.
자. 비인가자에 대한 출입 통제 개인정보를 보관하고 있는 물리적 보관 장소를 별도로 두고 이에 대해 출입통제 절차를 수립, 운영하고 있습니다.