Skip to main content Link Menu Expand (external link) Document Search Copy Copied

created at 2023-03-11

INDEX

  1. 서론
  2. HTTP benchmark tool gotybench 제작 및 서버 부하 테스팅

0. 서론

현재까지 저는 INSERT 쿼리를 BatchSize=50 JDBC Batch로 변경하였습니다. 또한 인증서버도 멀티스레드로 구현하였습니다. 이제 직접 서버에 부하를 테스트해볼 차례에요.

제 목표는 1000개 이상의 동시접속 api 를 견딜 수 있는 서버를 만드는 것입니다. 즉, 1000개의 동시성을 테스트 해봐야된다는 소리겠죠? 그러기 위해서는 동시다발적으로 api를 전송하는 툴이 필요한데, 문제는 대부분의 툴들이 Fuzzing된 Json 파일을 지원하지 않는다는 것입니다. 기존 툴들은 1. Json을 랜덤으로 생성해서 파일로 저장하고 -> 2. 이를 읽어서 다량으로 전송 이 두 가지 과정을 거쳐가야만 해야하기에 다소 불편하였습니다. 또한 3. 벤치마크 로그들을 저장하는 서버가 필요했습니다.

기존 툴들 정리 : HTTP Benchmark Tools

그래서 이번 HTTP benchmark tool 은 다음을 목표로 설계 및 제작하였습니다.

  1. 테스트 동시성 보장 : goroutine 경량 멀티 스레드를 사용하였으며, 채널을 통해 통신하도록 설정하였습니다. 기본 net/http 를 사용하기때문에 요청/응답은 Blocking 으로 진행되며 나머지 처리는 채널을 통해 비동기로 진행됩니다. 많은 수의 스레드를 돌리기에 Thread-safe 하게 설계해야합니다. 그래서 HandleResponse를 단일 스레드로 돌리고, 채널을 통해 다른 스레드로부터의 응답을 가져와서 스레드 stack 에서 처리할 수 있도록 설계하였습니다!
  2. 다이나믹 Structure 을 통한 Fuzzed Json 오브젝트 생성 : 사용자가 key와 value type들만 설정해주면 자동으로 랜덤한 json 오브젝트를 생성하도록 제작하였습니다.
    • ex) “gotybench -j [userId,string,userAge,int]” : userId의 value를 랜덤한 string으로 설정합니다. 또한 userAge의 value를 랜덤한 int로 설정합니다.
  3. 벤치마크 로그 서버 개설 : 응답 RTT를 시간 시리즈로 확인할 수 있는 그래프 및 기타 정보들을 저장하는 로컬서버를 오픈했습니다. (Open Port :8022)

gotybench 는 제 Github 리포지토리에 올려놓았습니다. https://github.com/ghkdqhrbals/gotybench

0. 들어가기 전에 결과부터 확인!

img

 LocalContainerNginx+Container
Thread : 10AVG:34.28ms, MAX:633.4ms, MIN:17.74msAVG:47.33ms, MAX:1094.04ms, MIN:23.65msAVG:47.41ms, MAX:1110.89ms, MIN:23.23ms
Thread : 100AVG:106.15ms, MAX:822.36ms, MIN:18.26msAVG:190.93ms, MAX:756.37ms, MIN:30.14msAVG:320.01ms, MAX:2357.13ms, MIN:32.69ms
Thread : 500AVG:547.98ms, MAX:2610.97ms, MIN:24.80msAVG:971.29ms, MAX:5768.36ms, MIN:28.29msAVG:982.68ms, MAX:4768.08ms, MIN:30.1ms
Thread : 1000AVG:1184.84ms, MAX:5455.63ms, MIN:27.25msAVG:1550.86ms, MAX:6895.59ms, MIN:37.54msAVG:1820.41ms, MAX:9866.15ms, MIN:39.19ms

동시에 10, 100, 1000개의 비동기 스레드가 채팅서버에 요청을 보낼 떄마다 AVG(평균 응답 시간)이 증가하는 것을 확인할 수 있습니다. 목표치인 1000개의 동시요청이 발생했을 때, 평균적으로 1.1초 이내 처리하는 것을 확인할 수 있어요!

추가적으로 서버를 Local, Docker Container, Nginx + Container 에서 각각 실행했을 때를 비교해보았는데요. 여기서 추이를 제대로 확인할 수 있는 파라미터 값은 MIN(최저 응답 시간)입니다. 네트워크를 아주 조금이라도 더 탈 수록, 최저 응답시간이 조금씩 증가하는 것을 확인할 수 있죠 :) 그냥 심심해서 비교해보았어요 ㅎㅎ…

1. gotybench 툴 제작 및 서버 부하 테스팅

gotybench 제작 파트는 https://ghkdqhrbals.github.io/portfolios/docs/기타/toyp3/ 를 참고해주세요!

1-1. 테스트 영상 및 gotybench 옵션 설명

img

OptionDetail
-c동시처리가능한 스레드 개수를 해당 옵션으로 설정할 수 있습니다.
-h옵션들의 설명을 확인할 수 있습니다.
-j핵심적인 Fuzzing 기능입니다.
json object를 해당 옵션으로 key/type을 설정하면, 랜덤한 value의 json obejct가 생성됩니다.
Fuzzing이 지원되는 type 은 4가지로 아래와 같습니다.
int, float, string, boolean
Usage Example
ex) -j "[userId,string,userAge,int]"
-rHTTP POST request 개수를 해당 옵션으로 설정할 수 있습니다.
-t벤치마크 클라이언트의 network connection 의 timeout을 해당 옵션으로 설정할 수 있습니다.
-u요청하는 URL을 설정할 수 있습니다.
-s로깅된 이전 벤치마크 데이터 및 그래프들을 서버에 띄웁니다.

이중 특히 -j 옵션은 Dynamic Struct를 차용함으로써, 오브젝트의 private 필드는 사용자의 입력값에 따라 구조가 변경됩니다!

1-2 벤치마크 로그 서버 확인

gotybench는 -s 옵션으로 벤치마크 기록들을 한번에 확인할 수 있는데요. 한번 확인해볼까요?

gyuminhwangbo@Gyuminui-MacBookPro testing % go run main.go -s
Local Server Opened! check here : http://localhost:8022

img

(Appendix) 과도한 CPU 사용 확인…

저는 아래와 같이 여러개의 컨테이너를 제 노트북으로 구동시키는데요. 문제는 CPU가 너무 힘들어 한다는 것이었습니다ㅜㅜ.

구동중인 컨테이너들

img

CPU 사용률

img

제 노트북은 8개의 vCPU 코어를 가지고 있기때문에 cpu 사용률 800% 가 CPU의 최대치란 말이죠? 이를 염두한 채로 위의 그림을 보시면, 도커컨테이너들의 총 cpu 사용률이 750%에 근접하였으며 매우 힘들어하는 것을 확인할 수 있습니다.

제 노트북 스펙 상 ELK 스택은 따로 빼야겠네요:)

(Appendix) 과도한 CPU 사용 확인…