본문 바로가기

카테고리 없음

자바 IO의 성능개선 (무복사 기법을 통한 효율적인 데이터 전송)

얼마전 자바 NIO를 활용한 통신 프로그램을 개발하면서 자바 네트워크 프로그래밍에 관심을 가졌었는데요. 마침 제 관심분야에 대한 IBM developerWorks의 고급기사가 발행되었기에 소개합니다.

무복사 기법을 통한 효율적인 데이터 전송

기사 내용이 무슨 말인가 하니, 하나의 IO가 일어날때 디스크<->커널<->자바어플리케이션 의 영역을 넘나드는데, 무복사 기법은 자바어플리케이션 영역을 빼고 디스크와 커널간의 직접 통신만으로 IO가 가능하며 성능이 많이 향상된다는 내용입니다.

"많은 웹 애플리케이션은 상당한 분량의 정적 내용을 제공한다. 즉, 디스크에서 데이터를 읽어 응답을 위한 소켓에 써 넣는다. 이런 처리는 상대적으로 CPU를 거의 사용하지 않을 것 같지만 다소 비효율적이다. 즉, 먼저 커널이 디스크에서 해당 데이터를 읽어 커널-사용자 간 경계를 넘어 애플리케이션으로 밀어 낸다. 그러면 애플리케이션은 해당 데이터를 소켓에 써 넣기 위해 다시 커널-사용자 간 경계를 넘어 커널로 밀어 넣는다. 결과적으로 애플리케이션은 그저 디스크에서 데이터를 가져다가 소켓으로 옮기는 비효율적인 중개자인 셈이다.

데이터가 사용자-커널 간 경계를 넘나들려면 매번 복사를 해야 한다. 이 때 CPU 사이클과 메모리 대역폭이 소모된다. 다행히 무복사 기법을 사용하면 불필요한 복사를 피할 수 있다(참으로 적절한 이름이다). 무복사 기법을 사용하는 애플리케이션은 해당 데이터를 자신을 거치지 않고 커널이 직접 디스크에서 소켓으로 복사하도록 요청한다. 무복사 기법은 애플리케이션 성능을 크게 향상시키고 커널과 사용자 모드 간의 맥락 전환 수를 줄여 준다."

이 무복사 기법을 지원하는 자바 클래스는 'java.nio.channels.FileChannel 클래스의 transferTo() 메서드를 통해 무복사 기법을 지원한다' 고 합니다.

저도 통신 프로그램 튜닝할때 꼭 써봐야 겠습니다.

> IBM developerWorks

무복사 기법을 통한 효율적인 데이터 전송