여러 웹 프레임워크에 대한 간단한 성능 테스트

1 분 소요

여러 웹 프레임워크에 대한 간단한 성능 테스트

테스트 대상 웹 프레임워크

  • 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
  • 부하테스트 시간 : 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/result-reports

업데이트: