정보통신기술

프로그램의 파일 읽기 쓰기에서 "mmap"을 사용하면 속도가 향상하는 이유

o2zone 2020. 11. 1. 15:08

소프트웨어 개발에 있어서 "파일의 읽고 쓰기"는 사용빈도가 높은 작업이며, 속도의 향상은 소프트웨어의 전체 성능에 크게 영향을 준다. 그러한 파일을 읽고 쓰는 작업을 할때 "mmap을 사용하는 쪽이 보통의 시스템 콜 보다도 빠르게 파일을 조작 할 수있는 이유"에 대해 브리티시 컬럼비아 대학의 부교수 인 Alexandra Fedorova 씨가 설명.



OS 상에서 사용자가 프로그램을 실행할 때, 프로그램은 "사용자 공간"과 "커널 공간"이라는 두 가지 영역을 이용한다. 사용자 공간은 프로그램이 자유롭게 액세스 할 수 있지만, 커널 공간은 프로그램에서 직접 액세스 할 수 없다. 자원 공간을 2개로 분리하는 것은 보안 측면에서는 우수하지만, 파일의 읽고 쓰기 등의 하드웨어 작업을 수반하는 처리는 커널 공간에서만 할 수 밖에없기 때문에, 사용자가 커널 공간을 취급 할 수없다는 것은 불편하다.


그래서 사용자들이 커널 공간을 취급 할 수 있도록, 사용자 공간과 커널 공간의 가교 역할을 해주는 것이 "시스템 콜"이다. 예를 들어 파일을 가져올 경우는 open 시스템 콜을 사용하여 파일의 입출력을 위한 파일 디스크립터를 만들고, read 시스템 콜을 호출해 파일 디스크립터 파일의 데이터를 버퍼에 읽어들여, 데이터의 조작을 가능하게 한다.


위의 내용은 OS상에서 파일 작업을 할 때의 일반적인 절차이지만, 파일의 읽고 쓰기는 mmap 시스템에서도 가능하다. mmap은 파일을 OS의 가상 메모리에 매핑 할 수있는 시스템 콜로, 매핑 된 가상 메모리 주소에서 파일을 읽고 쓸 수 있기 때문에, 다른 시스템 콜을 사용할 필요가 없어진다는 것.




Fedorova 씨는 일반적인 시스템 호출을 사용하는 경우와 mmap을 이용한 경우에서의 파일 작업 속도를 비교하기 위해, 각각의 경우에 있어서의 순차 읽기와 랜덤 읽기 속도를 4kb, 8kb, 16kb의 블록 사이즈로 측정했다는 것. 다음의 그래프는 데이터가 버퍼 캐시에 존재하고 있던 경우의 순차 읽기 속도의 측정 결과로, 노란색으로 표시 된 mmap의 로딩 속도가 더 빠른 것을 알 수있다.



랜덤 읽기 속도도 연속 읽기의 경우와 같이, mmap에 의한 읽기 속도가 일반 시스템 호출의 로딩 속도를 웃돌고있다.



16kb의 블록 크기에서 순차 읽기를 실시했을 때의 CPU 사용량을 보면, 데이터를 커널 공간에서 사용자 공간에 복사하는 "copy_user_enhanced_fast_string"에 걸린 시간이 전체 프로그램의 실행 시간의 약 61%를 차지하는 것을 알수있다. 그밖에도 "functions do_syscall_64"이나 "entry_SYSCALL_64"라는 커널 공간에서 사용자 공간으로의 이동을 수반하는 명령에 약 15%의 시간을 할애하고있다.





mmap을 이용한 경우, 61%가 "__memmove_avx_unaligned_erms"에 소요된 것. 즉, 통상의 시스템 콜에 의한 처리의 대부분을 차지하는 "copy_user_enhanced_fast_string"과 mmap에 의한 처리의 대부분을 차지하는 "__memmove_avx_unaligned_erms"의 효율성의 차이는 읽기 속도의 차이에 크게 영향을 받는다고 말할 수 있다.


https://sasha-f.medium.com/why-mmap-is-faster-than-system-calls-24718e75ab37


양자의 효율성의 차이는 데이터를 여러 스트링으로 취급하는 AVX에 대응하고 있을까..."__memmove_avx_unaligned_erms"는 그 이름대로 AVX를 지원하고 메모리 대역폭을 효율적으로 사용할 수 있지만, "copy_user_enhanced_fast_string"은 AVX에 대응하고 있지않고 대역폭을 최대한 이용할 수 없다는 것. Fedorova 씨는 이것이 보통의 시스템 콜보다 mmap 쪽이 더 빠르게 파일 작업을 수핼하는 큰 이유라고 설명하고있다.


일반 시스템 콜이 AVX를 지원하지 않는 이유는, 시스템 콜마다 레지스터의 저장과 레스 조작이 발생하여, 사용자 공간과 커널 공간을 이동하는 처리의 부하가 커져 버리기 때문이라는 것. Fedorova 씨는 "파일 작업을 보통의 시스템 콜에서 mmap으로 대체하는 것으로, 응용 프로그램을 더 빠르게 작동시킬 수 있을지도 모릅니다"라고 말하고있다.