여러 웹 프레임워크에 대한 간단한 성능 테스트
여러 웹 프레임워크에 대한 간단한 성능 테스트
테스트 대상 웹 프레임워크
- netty
- armeria
- akka-http
- vertx
- spring webflux
- springboot 2.3.9
- springboot 2.3.9 with spring security
- springboot 2.3.9 by kotlin
- graalvm with spring-native
- golang with gin
테스트 환경
- AWS EC2에서 테스트함.
- 서버 사양
- client(tool) : t3.medium (2 cpu, 4G memory)
- target server : t3.medium (2 cpu, 4G memory)
- 테스팅 툴 : gatling
- 테스트 내용
- 테스트 툴에서, millisecond로 url을 만들어서 서버에 요청함. (따라서 millisecond 마다 url이 변함)
- (예) /1616726889044
- 받아주는 서버는, url을 세번 붙인 String을 리턴해줌.
- (예) 161672688904416167268890441616726889044
- 테스트 툴에서, millisecond로 url을 만들어서 서버에 요청함. (따라서 millisecond 마다 url이 변함)
- 부하테스트 시간 : 1분
테스트의 제약사항
- 단순한 요청을 받아서 그것을 거의 그대로 리턴하는 수준이다.
실제 웹 프레임워크가 하는 일들(datbase, redis, MQ, httpclient)은 무시됨.
- 시스템 리소스의 사용량 등에 대한 모니터링은 없다.
- netty는 네트워크 라이브러리이므로, 여기에 포함시키는게 맞지는 않지만. netty가 다른 것이랑 얼마나 차이가 날지 궁금해서 포함시켜 봤다.
테스트 결과
웹 프레임워크 | 평균 처리시간(msec) | 초당처리건수 |
---|---|---|
netty | 146 | 13,622 |
armeria | 229 | 11,599 |
akka-http | 547 | 9,760 |
vertx | 114 | 15,802 |
springboot with webflux | 545 | 10,729 |
springboot | 1043 | 4,819 |
springboot with spring security | 1944 | 2,544 |
springboot with kotlin | 1102 | 4,504 |
graalvm with spring-native | 1099 | 4,398 |
golang with gin | 154 | 15,471 |
평균처리시간은 작을수록 좋고, 초당처리건수는 클수록 좋다.
결론
이 테스트는 실제 웹서버가 처리하는 일들은 하지 않기 때문에 그냥 참고용으로만 보면 좋을듯 하다.
- 실제 서버라면, database, redis, message queue, http client 등등의 처리를 할 것이다.
- 따라서, gateway 같은 것을 만드는게 아니라면, 이런 테스트는 사실상 좀 동떨어져 있고,
- eco system과 개발,유지보수 측면이 더 중요할 것이라서.
테스트 결과를 보면
- golang은 참 가성비가 좋은 언어이다.
- jvm 기반의 framework들과 비교했을때 아주 우수했다.
- 프로그램 시작도 순식간이고, 처리량도 아주 좋았다.
- 실행파일과 goroutine의 힘인가?
- non-blocking이 blocking보다 확실히 성능이 좋았다.
- 테스트한 서버 사양이 매우 좋은 편이 아니고, 또 concurrent user가 만명 정도라서 non-blocking과 blocking 사이에 아주 큰 차이가 나지는 않은것 같다.
- 하지만, concurrent user가 훨씬 더 많고(수만,수십만?), 서버 사양도 받쳐준다면, 차이는 굉장히 많이 날 것으로 예상된다.
- non-blocking으로 인한 코딩의 복잡함과 번거로움을 상쇄할 만큼, 업무에서 non-blocking이 필요한 곳이 얼마나 될까?
- loom 프로젝트가 java에 적용되면 상황이 달라지겠지만,
- springboot를 kotlin으로 개발했을때, 그로인한 성능 저하는 없는거 같다. (당연해 보이지만)
- spring security를 추가하면 성능이 반 정도로 떨어지는거 같다.
- spring security를 씀으로 성능저하가 생긴다고 해서 안쓰진 않을 것이다.
- graalvm은 처음 실행시간은 굉장히 빠르다.
- 그냥 바로 뜬다.
- 그런데, 성능은 java로 실행 했을때와 비슷했다.
- graalvm을 빌드해서 native-image를 만드려면, 많은 메모리가 필요하다.
- graalvm으로 windows용 실행파일을 만드는 것은 아직 쉽지 않은거 같다. 실패했다.
github 위치
https://github.com/SoonPoong-Hong/simple-http-performance-test-of-various-frameworks
실행가능한 jar와 단독실행 파일 위치
- https://github.com/SoonPoong-Hong/simple-http-performance-test-of-various-frameworks/tree/main/executable-outputs
java 11
로 실행
(예)java -jar armeria-fat.jar
./gin-main
./rocklike.test.graalvmtest.graalvmserver