2012-06-21 3 views
5

mmap()을 사용하여 cp (파일 복사) 명령을 구현 중입니다. MAP_PRIVATE (내가 읽고 싶을 때) 모드와 대상 파일을 MAP_SHARED 모드로 매핑했습니다 (대상 파일의 변경된 내용을 되돌릴 필요가 있기 때문에).mmap()에 대한 복사시 쓰기 및 0 채우기 비활성화 방법

2 개의 이유로 인해 발생하는 사소한 페이지 오류로 인해 성능이 저하되는 것을 관찰했습니다. 1) 소스 파일에 대해 mmap (MAP_PRIVATE)을 호출하는 동안 요청시 0으로 채 웁니다. 2) 대상 파일에 대해 mmap (MAP_SHARED)을 호출하는 동안 쓰기를 복사합니다.

Zero-fill-on-demand 및 Copy-On-Write를 비활성화하는 방법이 있습니까?

감사합니다, Harish

+0

제로 채우기에 대한 성능 저하가있는 것을보고 놀랍습니다. 어떻게 측정합니까? COW를 비활성화하지 않으려는 경우, 가상 메모리가 작동하는 방식의 기본이며 성능이 향상됩니다. 'write (2)'를 사용하는 것이 복사본에 대해 더 효율적일 수 있다고 생각 했습니까? private 맵을 기입하는 버퍼로서 지정합니다. 'write (2)'는 새로운 파일을 확장하는 단계를 피한다. – cdarke

+0

getrusage()로 부 페이지 오류를 측정하고 있는데 mmam() (읽기 mmap의 경우 약 25000 (MAP_PRIVATE) 및 쓰기 mmap (MAP_SHARED)의 경우)과 함께 1GB의 파일을 복사하는 약 50000 부 페이지 오류가 있음을 보여줍니다. 예, write (2)가 복사를 위해 mmap()보다 더 효율적인지 확인했지만, Zero-fill-on-demand와 Copy-on-write를 사용하지 않으면 mmap()이 효율적일 수 있다고 생각합니다. – Harish

+0

Harish,'madvice()'와'mlock()'syscalls를 확인하십시오. 페이지 폴트 수에 영향을 미칠 수 있습니다. 그리고 빠른 파일 복사를 위해서 syscall'sendfile()'을 확인하십시오. – osgx

답변

2

의 mmap의 MMAP_POPULATE 플래그 (2)가 : A의

http://linux.die.net/man/2/mmap

MAP_POPULATE (리눅스 이후 2.5.46) 채우기 (prefault) 페이지 테이블 맵핑. 파일 매핑의 경우 파일의 미리 읽기가 발생합니다. 나중에 매핑에 대한 액세스가 페이지 오류로 인해 차단되지 않습니다. MAP_POPULATE는 Linux 2.6.23 이후 개인 매핑에만 지원됩니다.

mmap 영역의 모든 페이지를 미리 폴트해야합니다. 그것은 질문 (1)을 위해 작동해야하고 질문 (2) (공유)을 위해 작동하지 않을 수도 있습니다.

+2

주의 :'MAP_POPULATE'는 매핑을 사용할 때 (메모리 압력에 의해 페이징되지 않는 한) 지연을 의미하지 않지만, 전체 파일을 읽을 때까지'mmap' 호출 자체가 블록된다는 것을 의미합니다. ['posix_madvise'] (http://linux.die.net/man/3/posix_madvise) (또는 비표준 ['madvise'] (http://linux.die.net/)에 찬성하여'MAP_POPULATE'를 피하십시오. man/2/madvise))'POSIX_MADV_WILLNEED'를 사용합니다. 이것은'MAP_POPULATE'와 동일하지만, 차단하지는 않습니다. 소스 파일을 열거 나 매핑하여로드하도록 권할 수 있으며, OS는 폴트를 요구하는 대신 대량 읽기를 백그라운드에서 수행합니다. – ShadowRanger

+0

'mmap '에서 읽는 것을 막을 수는 있지만, 전체 읽기가 미리 정해져 있기 때문에, 채워지지 않은 페이지를 쳤을 때 이미 읽기가 진행 중이다. 새로운 I/O 요청을 실시간으로 보내지 않을 것입니다. – ShadowRanger