I/O는 더 이상 병목이 아니다
(benhoyt.com)- 면접에서 종종 묻는 질문 2가지
- 텍스트 파일에서 단어를 세는 프로그램을 작성해 보세요
- 이 프로그램의 성능 병목현상은 어떤 부분인가요?
- 종종 사람들이 "파일에서 읽기" 이라는 답변을 하는데, 이젠 더 이상 그렇지 않음
- 10-20년 전에는 그랬지만, 2022년 현재 디스크에서 시퀀셜하게 읽는 것은 매우 빠름(필자도 테스트 해보기 전에는 몰랐음)
- 병목부분은 입력을 처리/파싱 해서 메모리에 할당하는 것 : 단어로 쪼개고, 소문자 변환하고, 해쉬테이블로 빈도를 세는 등의 작업
- 파이썬/고 로 413MB 텍스트 파일(킹 제임스 성경을 100번 붙인 파일)을 테스트 해봤을 때
- 읽는 것은 0.1~0.2초 면 되고, 처리가 7초에서 2초까지 걸림
- 결론적으로 "빅데이터"를 처리하는 경우 디스크 I/O는 병목이 아닐수 있음
아무리 sequential 접근이라고 해도 언어마다, 라이브러리 마다 IO 파이프 사용 법이나 개발자 IO API요청 빈도 등 영향이 가는부분이 있어 IO가 더이상 병목이 이니라고 하는거는 전제가 필요하다고 본다
디스크 I/O 로 매우 고통받으면서 플래터를 최대한 적게 움직이게 해야하는 일을 하는 저로서는 신기한 이야기이네요.
글 내용에 "시퀀셜"이라는 이야기고 있네요.
seek를 전혀 하지 않는다면 뭐 틀린 이야기가 아닐수도 있죠.
병목이라는 것 자체가 상대적인 시간에 대한 이야기입니다.
cpu 속도와 i/o를 비교하는게 맞습니다.
과거의 io보다 빨라졌다고 해서 io가 cpu보다 빠를 수 없습니다.
mmap을 이용하여 가상 메모리에 로드만 해놓고 실제는 cpu가 연산할 때마다 읽는 것일 수도 있습니다.
cpu와 모든 메모리(레지스터, 메인메모리, 디스크) 간의 통신도 전부 io입니다.
https://stackoverflow.com/questions/5877797/how-does-mmap-work
https://news.ycombinator.com/item?id=33751266 에 있는 첫번째 댓글의 URL이 재미나네요.
Napkin Math (단순한 수학들)
시퀀셜 I/O는 거의 메모리 속도에 근접해 가고 있다고..