윈도우에서 디스크의 좋은 동시 읽기 성능을 얻는 방법
멀티스레드 환경에서 대용량 파일을 다룰 때, 디스크에서 최적의 읽기 성능을 얻는 것은 상당한 도전이 될 수 있습니다. 여러 스레드가 별도의 파일을 동시에 읽으려고 시도할 때, 운영 체제의 디스크 스케줄링 정책 때문에 저조한 처리량을 경험할 수 있습니다. 이 게시물에서는 흔히 겪는 문제를 다루고 디스크 읽기 성능을 개선하기 위한 전략을 제시합니다.
문제: 동시 읽기 성능 제약
2GiB 정도의 큰 파일 두 개가 있고 이 파일을 동시에 읽으려는 두 개의 별도 스레드가 있다고 가정해 보세요. 성능이 향상되기는커녕 두 스레드 모두 성능이 좋지 않고 합산 처리량이 겨우 2-3 MiB/sec에 불과하다는 것을 알게 됩니다. 상황을 요약하면 다음과 같습니다:
- 설정: 각 스레드가 하나의 파일을 읽고 있습니다.
- 관찰: 두 스레드가 모두 활성화되어 있을 때 저조한 결합 처리량 (~2-3 MiB/sec)과 단일 스레드의 훨씬 나은 성능 (~45 MiB/sec).
- 의심되는 원인: Windows 디스크 스케줄러에 의해 영향을 받는 디스크 탐색 행동으로 비효율적인 읽기 패턴 초래.
윈도우의 디스크 스케줄링 이해하기
해결책에 들어가기 전에, 윈도우가 디스크 I/O 요청을 어떻게 관리하는지 이해하는 것이 중요합니다. 역사적으로, 윈도우는 디스크 요청을 위한 FIFO(선입선출) 큐를 사용했으며, 요청이 64KB 블록으로 나뉘었습니다. 이는 다음과 같은 결과를 초래했습니다:
- 빈번한 디스크 탐색: 두 스레드가 동시에 읽으려 할 때 그들의 요청이 교차 간섭하여 디스크를 계속해서 왔다 갔다 탐색하게 됩니다.
- 비유연성: Windows Vista 이전에는 개발자가 디스크 요청 처리를 수정할 수 있는 방법이 거의 없었습니다.
그러나 Windows Vista의 도입으로 더 정교한 디스크 스케줄링 알고리즘이 구현되어 동시 I/O 작업을 개선된 방식으로 관리할 수 있게 되었습니다. 여기서 질문이 제기됩니다: 사전 Vista 시스템 또는 이후 버전에서도 문제가 지속된다면 읽기 성능을 어떻게 최적화할 수 있을까요?
동시 읽기 성능을 개선하기 위한 제안된 해결책
-
자체 제작 디스크 접근 정책: 이전 Windows 버전에서 스케줄링 정책을 수정할 수 없으므로, 스레드에서 디스크 접근을 관리하기 위한 자체 방법을 만드는 것을 고려해 보세요.
- 정책 구현 예시:
if (THREAD_A가 디스크에서 읽고 있다면) { THREAD_A가 읽기를 멈출 때까지 기다리거나 X ms 대기 } X ms 동안 읽기 (또는 Y MB 읽기) 읽기를 멈추고 THREAD_A의 상태를 다시 확인
이 정책은 다른 스레드가 현재 읽고 있지 않을 때만 디스크에 접근하는 대기 메커니즘을 도입하여 탐색 문제를 완화합니다.
- 정책 구현 예시:
-
동기화 원시 사용: 세마포어나 뮤텍스를 사용하여 디스크 접근을 제어하고, 한 번에 하나의 스레드만 읽도록 합니다. 이는 진정한 동시 읽기에 비해 처리량이 약간 줄어들 수 있지만 전체 효율성을 개선할 수 있습니다.
-
성능 모니터링 지표 활용: 성능 모니터링 도구(예:
perfmon
)를 사용하여 디스크 큐 상태를 평가하고, 읽기 간격과 데이터 크기를 동적으로 조정합니다. 이러한 ‘자동 조정’ 접근 방식은 실시간 성능 지표를 기반으로 전략을 조정할 수 있게 해줍니다:- 현재 전송 속도 측정.
- 역사적 성능 데이터를 기반으로 X 및 Y 값 조정.
-
더 최신 Windows 버전으로 업그레이드: 가능하다면 운영 체제를 업그레이드 하는 것을 고려하세요. Windows Vista 이상은 더 스마트한 디스크 스케줄링을 통해 더 효율적인 동시 읽기를 가능하게 합니다.
결론
윈도우에서 디스크의 좋은 동시 읽기 성능을 달성하는 것은 OS의 I/O 스케줄링 한계를 이해하고 이를 우회하기 위한 영리한 소프트웨어 기술을 구현하는 것을 포함합니다. 커스텀 디스크 접근 정책을 도입하고, 동기화 기술을 사용하며, 성능 지표를 모니터링함으로써 대용량 파일과 멀티스레딩을 다룰 때 애플리케이션의 처리량을 크게 향상시킬 수 있습니다.
이러한 전략을 신중하게 구현하면 디스크 읽기 프로세스를 최적화하고 애플리케이션에서 동시 프로그래밍의 힘을 완전히 활용할 수 있게 될 것입니다.