안녕하세요.
TCP 대용량 다운로드 서버를 개발하여 성능테스트 진행중입니다.
현재 사용중인 Handler는
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("IDLE_TIMEOUT_HANDLER", idleStateHandler);
pipeline.addLast("GLOBAL_TRAFFIC_SHAPING_HANDLER", globalTrafficShapingHandler);
pipeline.addLast("CHANNEL_TRAFFIC_SHAPING_HANDLER", new ChannelTrafficShapingHandler(timer, 0, 0));
pipeline.addLast("DOWNLOAD_TRAFFIC_CALC_HANDLER", new ChannelTrafficShapingHandler(new TransferSizeEstimator(), timer));
pipeline.addLast("CHUNKED_WRITE_HANDLER", new ChunkedWriteHandler());
pipeline.addLast("RESPONSE_ENCODER_HANDLER", new ResponseEncoderHandler()); // extends SimpleChannelDownstreamHandler()
pipeline.addLast("REQUEST_DECODER_HANDLER", new RequestDecoderHandler()); // extends ReplayingDecoder<VoidEnum>
pipeline.addLast("EXECUTION_HANDLER", executionHandler); // OrderedDownstreamThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2)
pipeline.addLast("BUSINESS_HANDLER", new BusinessHandler());
이며,
다운로드 기능은 ChunkedFile를 응용하여 개발하였습니다.
(DefaultFileRegion을 사용하면 트래픽 제어가 안되더라구요.. )
GlobalTrafficShapingHandler의 writeLimit은 1Gbps망에서 900Mbps로 제어중이며,
1000명의 Client가 140MB의 파일을 접속->다운로드->종료 를 무한반복하며 다운로드를 받고 있습니다.
원하는 결과는 각각의 Client들이 921Kbps(900Mbps / 1000명)로 균일하게 다운로드를 받는것인데,
최저 300Kbps에서 최대 1800Kbps로 고르게 분배되고 있지 않습니다.
(평균치는 950Kbps ~ 980kbps 정도입니다.)
접속된 Client들에게 트래픽을 고르게 분배할수 있는 좋은 방안에 대해 조언을 구하고 싶습니다.
감사합니다. ^^