-
Buffered I/O Steram vs I/O Stream: 커널 영역 접근과 성능 비교개발 2024. 7. 8. 19:58
들어가며
저번 주 우아한테크캠프 미션을 진행하면서 WAS를 구현하고 있는데, 그룹 리뷰에서 I/O Stream 보다 Buffered I/O Stream 을 사용하는 게 더 좋다는 피드백을 받아서 Buffered I/O Stream과 일반 I/O Stream의 차이점이 궁금해졌습니다.
Buffered I/O Steram vs I/O Stream
여러분은 Java에서 파일을 읽고 쓸 때 어떤 방식을 사용하시나요? 저는 InputStream 은 BufferedInputStream 으로 OutputStream은 그냥 OutputStream으로 구현했습니다. 이유는 InputStream은 BufferedInputStream을 사용해서 받는 경우를 많이 봤지만 OutputStream은 잘 못봤기 때문이었습니다. 하지만, 그냥 I/O Stream과 Buffered I/O Stream은 큰 차이가 있습니다.
I/O Stream은 데이터를 바이트 단위로 읽고 쓰는 기본적인 방식입니다. 하지만, 매 바이트 마다 커널 영역에 접근해 비싼 Context Swtiching 비용을 지불해야합니다. Buffered I/O Stream은 내부 메모리에 버퍼를 두어 데이터를 모았다가 한 번에 읽거나 쓰는 방식입니다. 버퍼 크기만큼 모았다가 커널 영역에 접근하기 때문에 커널 접근 횟수가 상대적으로 적습니다.
예를 들어 1MB 파일을 읽는다면 일반 I/O 는 1,049,000 번 접근하게 되지만, 버퍼의 크기가 8KB인 Buffered I/O는 128번만 접근하게 됩니다.
실제 POST /create 요청의 response 성능 비교
그래서 실제로도 그러한 성능 차이가 발생하는지 궁금하여 WAS 미션 중 POST /create 요청에 대한 처리 성능을 비교해봤습니다.
해당 응답은 약 360B의 크기를 가지고 있습니다.
Buffered I/O Stream은 기본 버퍼 크기(8KB)로 하였습니다.
결과는 약 33배의 차이가 났습니다. 이는 입력 세팅을 제와한 write 시간의 비교입니다. 따라서 커널 영역 접근 감소에 따른 성능 향상으로 볼 수 있습니다.Buffered IO Stream vs IO Stream 하지만
일반적인 상황에서는 Buffered I/O Stream이 거의 대부분 더 좋은 성능을 보여줍니다. 하지만, 버퍼를 위한 추가적인 메모리를 사용하고 버퍼의 크기가 작으면 더 많이 커널 영역에 접근하므로 제한된 상황에서는 메모리 사용량과 실제 사용 케이스를 고려할 필요는 있습니다.
따라서
이러한 I/O Stream의 동작 원리와 내부 구조를 이해한다면 더 효율적으로 HTTP request, response를 처리할 수 있다는 것을 알았습니다. 혼자 공부했다면 이렇게 자세히 공부할 수 없었을 것 같습니다. 우아한테크캠프를 통해 다양한 사람들과 기술에 대한 고민을 할 수 있어서 더 깊이 공부하고 빠르게 성장할 수 있는 것 같습니다.
'개발' 카테고리의 다른 글
Java 프로그램 바이트 코드를 분석해보자 (0) 2024.07.10 ServerSocket의 내부 동작 살펴보기: TCP 연결 설정의 로우레벨 이해 (0) 2024.07.08 [LiveStreamingOnWebRTC] 스트리밍 서비스를 WebRTC로 구현해보기 (0) 2024.05.02 WebRTC 찍어먹기 (0) 2024.05.01 AWS ec2에 wireguard로 VPN 구축하기 (0) 2023.07.25