2012-06-21 15 views
5

Tôi đang thực hiện lệnh cp (tệp sao chép) bằng cách sử dụng mmap(). Vì vậy, tôi đã ánh xạ tệp nguồn ở chế độ MAP_PRIVATE (Vì tôi chỉ muốn đọc) và tệp đích ở chế độ MAP_SHARED (Vì tôi phải ghi lại nội dung đã thay đổi của tệp đích).Làm thế nào để Vô hiệu hóa Sao chép-ghi-ghi và không điền theo yêu cầu cho mmap()

Trong khi thực hiện việc này, tôi đã quan sát hình phạt hiệu suất do nhiều lỗi trang nhỏ xảy ra do 2 lý do. 1) Không điền theo yêu cầu trong khi gọi mmap (MAP_PRIVATE) cho tệp nguồn. 2) Sao chép khi viết trong khi gọi mmap (MAP_SHARED) cho tệp đích.

Có cách nào để tắt Zero-fill-on-demand và Copy-on-write không?

Cảm ơn, Harish

+0

Tôi ngạc nhiên khi bạn thấy một hình phạt về hiệu suất cho số không điền, bạn đo lường nó như thế nào? Bạn không muốn vô hiệu hóa COW, nó là nền tảng cho cách thức hoạt động của bộ nhớ ảo và cải thiện hiệu suất. Bạn có nghĩ rằng việc sử dụng 'write (2)' có thể hiệu quả hơn cho bản sao không? Chỉ định bản đồ riêng tư làm bộ đệm để ghi. Nó cũng tránh được bước mở rộng tệp mới, vì 'write (2)' sẽ làm điều đó cho bạn. – cdarke

+0

Tôi đang đo lỗi trang nhỏ bởi getrusage() Nó cho thấy có gần 50000 lỗi trang nhỏ để sao chép 1gb tệp với mmam() (gần 25000 cho mmap đọc (MAP_PRIVATE) và tương tự cho viết mmap (MAP_SHARED)). Có, tôi đã kiểm tra viết (2) hiệu quả hơn mmap() để sao chép nhưng tôi nghĩ mmap() có thể hiệu quả nếu chúng tôi vô hiệu hóa Zero-fill-on-demand và Copy-on-write. – Harish

+0

Harish, kiểm tra 'madvice()' và 'mlock()' syscalls. Chúng có thể ảnh hưởng đến số lỗi trang. Và để sao chép tập tin nhanh, hãy kiểm tra syscall 'sendfile()'. – osgx

Trả lời

2

Có cờ MMAP_POPULATE của mmap (2):

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

MAP_POPULATE (vì Linux 2.5.46) cư (prefault) bảng trang cho một ánh xạ. Đối với một ánh xạ tệp, điều này gây ra đọc trước trên tệp. Truy cập sau này vào bản đồ sẽ không bị chặn bởi lỗi trang. MAP_POPULATE chỉ được hỗ trợ cho ánh xạ riêng từ Linux 2.6.23.

Nên đặt trước tất cả các trang trong vùng được định vị. Nó sẽ làm việc cho câu hỏi (1), và có thể không làm việc cho câu hỏi (2) (chia sẻ).

+2

Lưu ý: 'MAP_POPULATE' có nghĩa là không có sự chậm trễ khi bạn đang sử dụng ánh xạ (trừ khi nó được phân trang bởi áp lực bộ nhớ), nhưng nó cũng có nghĩa là cuộc gọi' mmap' tự chặn cho đến khi toàn bộ tệp được đọc. tránh 'MAP_POPULATE' có lợi cho [' posix_madvise'] (http://linux.die.net/man/3/posix_madvise) (hoặc không được chuẩn hóa ['madvise'] (http://linux.die.net/) man/2/madvise)) sử dụng 'POSIX_MADV_WILLNEED', tương đương với' MAP_POPULATE', nhưng không chặn. Bạn có thể mở/ánh xạ tệp nguồn, tư vấn cho nó tải, và hệ điều hành sẽ đọc nền với số lượng lớn, chứ không phải là yêu cầu bị lỗi. – ShadowRanger

+0

Bạn có thể chặn đọc từ 'mmap', nhưng vì toàn bộ nội dung đã đọc được lên lịch trước, việc đọc sẽ được tiến hành khi bạn nhấn trang chưa được mở rộng; bạn sẽ không gửi các yêu cầu I/O mới trực tiếp. – ShadowRanger