기존 C++로 만들던 서버의 TPS는 약 1500 정도였습니다. (HTTP,RTSP 서버)
이중 Netty 로 구현하면 훨씬 좋은 성능을 낼 수 있을것이란 기대를 가지고 HTTP 서버부분만 분리하여 구현을 하였습니다.
(example로 제공되는 snoop http 를 참고해서 구현했습니다.)
버전은 4.0.33 Final 버전입니다.
서버 Bootstrap은 특별한것 없이
// HTTP socket
ServerBootstrap httpBootstrap = new ServerBootstrap();
httpBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
httpBootstrap.group(httpBossGroup, httpWorkerGroup).channel(NioServerSocketChannel.class).childHandler(new HTTPInitializer(sslCtx));
Channel httpChannel;
httpChannel = httpBootstrap.bind(new InetSocketAddress(testIpAddress, testPort)).sync().channel();
Logger.info("Started in IP({}) port({})", SDMServerVersion, testIpAddress, testPort);
위와 같습니다.
initializer 부분도 특별한것 없이 HTTP decoding을 위한 부분만 있습니다. (body parsing은 필요해서 aggregator는 사용합니다.)
ChannelPipeline pipeline = ch.pipeline();
if (sslCtx != null) {
pipeline.addLast(sslCtx.newHandler(ch.alloc()));
}
pipeline.addLast("idleStateHandler", new IdleStateHandler(5, 5, 0));
pipeline.addLast(new HttpServerCodec());
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpObjectAggregator(1048576));
pipeline.addLast(new HTTPHandler());
위와 같습니다.
idlStatsHandler는 유휴소켓 정리를 위해 사용했습니다.
HTTPHandler는 메모리에서 저장되어있는 값을 json형태로 변경해서 return하고..
각각 요청에 대한 spend time을 보면 0ms 에서 길어야 2ms 입니다.
코어는 8개짜리 코어라서 thread dump해보면 group-3-16 까지 16개가 생깁니다.
그래서 쉴새없이 요청을 받고 보내긴 하는데...
TPS가 1,800~1,900 정도에서 유지가 되더라구요. (저는 jmeter와 ngrinder 2개로 테스트 해보았습니다.)
다른 분들 TPS를 보면 훨씬 큰 수치가 나오던데..
제가 뭔가 기본적인걸 크게 잘못 생각하는게 아닌가 합니다.
구현이 잘못된 것인지
아니면 혹 network 환경 설정을 달리 해봐야할지
부하를 주는 테스트 방법이 잘못 된 것인지..
감을 못잡겠습니다.
도움 주실 수 있으신분들은 조금이라도 알려주시면 감사하겠습니다.
제가 테스트한 환경은 아래와 같습니다. (그냥 평범한 데스트탑 개발용 PC입니다.)
CPU : Intel I7-4790 (8 core)
Mem : 8기가
OS : Windows ( cent os 에서도 비슷한 tps 수치 확인)