어떤 시점에서 디스크 I / O의 비동기 읽기가 동기보다 효율적입니까?


22

여러 소비자에 대한 파일을 읽는 코드가 약간 있고 파일 크기가 임의의 크기라고 가정하면 : 파일을 비동기 적으로 읽는 것이 어떤 크기에서 더 효율적입니까? 또는 달리 말하면, 파일을 동 기적으로 읽는 것보다 더 빠르려면 파일이 얼마나 작아야합니까?

매우 작은 파일을 읽을 때 동 기적으로 (특히 .NET에서) 비동기 적으로 읽는 데 시간이 더 오래 걸린다는 것을 알았습니다 (아마도 틀 렸습니다). 나는 이것이 I / O 완료 포트, 스레드 등과 같은 것들에 대한 설정 시간과 관련이 있다고 가정합니다.

여기서 도움이 될만한 규칙이 있습니까? 아니면 시스템과 환경에 따라 달라 집니까?


벤치 마크에 사용하는 코드를 제공 할 수 있습니까? 파일 크기가 스트림 리더의 내부 버퍼 크기보다 작은 경우에만 발생할 수 있다고 생각합니다. 당신은 많은 작은 파일을 읽을 필요하지만 당신은 아마 I / O를 디스크에 다른 문제가 충돌합니다
다니엘 Iankov

코드가 편리하지 않습니다. 그것은 내가 잠시 동안 부딪 쳤고 그 이후로 내 마음에 있었던 것입니다. 코드는 .NET에 있으며 for 루프에서 본질적으로 직선 File.ReadAllBytes () 대 FileStream.BeginRead ()
blesh

효율성을 나타내는 곡선이 교차하고 비동기 IO가 동기 IO 곡선보다 높은 값에서 교차를 종료하는 경우
Thomas Eding

답변:


14

불행히도 그 대답은 "그것은 달려있다"입니다. 비동기 및 동기화 읽기 시간을 경험적으로 결정하는 작은 프로그램을 작성하는 것이 쉽습니다.

그것은 많은 요인에 달려 있습니다. 회전 디스크, SSD 또는 네트워크 드라이브에 저장되어 있습니까? 어떤 종류의 CPU를 사용하고 있습니까? 소켓 / 코어는 몇 개입니까? VM 또는 베어 메탈에서 실행 중입니까? 고대 OS 또는 현대 OS를 실행하고 있습니까?


1
그래, 나도 알아 나는 가이드 또는 경험 법칙으로 사용할 일종의 연구가 있기를 바랐습니다.
blesh

9

비동기에는 3 가지 주요 장점이 있습니다.

  1. CPU 사용률이 낮아집니다. 방금 읽은 데이터로 CPU가 많은 작업을 수행하는 경우 유용 할 수 있습니다.
  2. 일종의 비동기 인프라를 사용하면 코드를 쉽게 병렬화 할 수 있습니다. 특히 많은 파일을 읽는 경우.
  3. OS에 여러 읽기 / 쓰기 요청을 보내면 OS와 HW는 이러한 작업의 순서를 빠르게 재조정 할 수 있습니다. SATA2에는 이러한 기능이 있습니다.

비동기 읽기의 주요 장점은 많은 파일로 작업하거나 많은 CPU 전원이 필요할 때입니다.


포인트 2는 I / O 작업이 병목 현상 인 경우 아무것도 최적화하지 않습니다. RAID 나 네트워크를 통해 다른 디스크에있는 파일을 병렬로 액세스하는 경우 상황이 다릅니다.
Arseni Mourzenko

5
흠, 나는 당신이 # 1의 의미를 이해하는 데 어려움을 겪고 있습니다. 나는 그것이 실제로 다른 길이라고 말합니다. 비동기 경우에는 이제 스레드를 blocked waiting for I/O(0 % CPU)에서 continue normal processing(> 0 % CPU)로 변경하고 있습니다.
Isak Savo

3

그것은 달려있다

명심해야 할 것은 프로세스 간 컨텍스트 전환이 얼마나 비싸다는 것입니다. Node.JS는 컨텍스트 스위치를 수행하는 것이 매우 비싸다고 가정하고 그렇지 않으면 컴퓨터를 정지시키는 IE를 기다리는 많은 프로세스를 갖게 될 것이기 때문입니다.

반면에 Erlang은 프로세스 컨텍스트 전환을 매우 저렴하게 만들어 모든 것을 동기화 할 수 있으며 Erlang 런타임은 모든 것을 추적 할 수 있습니다.

따라서 고려해야 할 요소 :

  • 컨텍스트 전환 작업 비용
  • 탐색 조작을위한 디스크 속도
  • 읽기 작업을위한 디스크 속도
  • 캐시에 파일이 있습니까

그리고 저는 6 가지 요소를 배제 할 것이라고 확신합니다


2

특정 "포인트"가 있는지 확실하지 않지만 많은 스레드가 작동하는 경우 I / O를 다른 작업과 겹칠 수 있으므로 가장 의미가 있습니다. 여분의 스레드가 유휴 상태이면 비동기식으로 읽는 것이 유리하지 않습니다. 작업 대기열이 채워지고 스레드가 비동기 파일 액세스가 이점을주는 I / O를 기다리는 대신 다른 작업을 유용하게 수행 할 수있는 경우에만 가능합니다.


네, 이것이 멀티 스레딩의 요점입니다!
Vlad

1

여기서 문제는 지연 시간이므로 읽기 속도가 그리 크지 않다고 생각합니다.

네트워크 드라이브 나 대기열이 긴 느린 기계식 하드 디스크 드라이브에서 읽는 경우 읽기 성능이 떨어집니다. 그리고 응용 프로그램이 GUI 스레드에서 읽기를 수행하는 경우 매우 나쁜 응용 프로그램 인 경우 사용자에게는 끔찍할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.