2013-02-19 23 views
5

Giả thuyết, tôi muốn thực hiện việc viết tuần tự cho một tệp có khả năng rất lớn.Có madvise (___, ___, MADV_DONTNEED) hướng dẫn hệ điều hành để lười biếng ghi vào đĩa?

Nếu tôi mmap() một khu vực khổng lồ và madvise (MADV_SEQUENTIAL) trên toàn bộ khu vực đó, sau đó tôi có thể ghi vào bộ nhớ một cách tương đối hiệu quả. Điều này tôi đã nhận được để làm việc tốt.

Bây giờ, để giải phóng tài nguyên hệ điều hành khác nhau khi tôi đang viết, tôi thỉnh thoảng thực hiện một munmap() trên các phần nhỏ của bộ nhớ đã được ghi vào. Mối quan tâm của tôi là munmap() và msync() sẽ chặn luồng của tôi, chờ dữ liệu được cam kết vật lý vào đĩa. Tôi không thể làm chậm nhà văn của mình chút nào, vì vậy tôi cần phải tìm cách khác.

Sẽ tốt hơn nếu sử dụng madvise (MADV_DONTNEED) trên đoạn bộ nhớ nhỏ, đã viết? Tôi muốn nói với hệ điều hành để viết bộ nhớ đó vào đĩa một cách uể oải, và không để chặn luồng gọi của tôi.

Các manpage trên madvise() đã cho biết, đó là khá mơ hồ:

MADV_DONTNEED 
Do not expect access in the near future. (For the time being, the 
application is finished with the given range, so the kernel can free 
resources associated with it.) Subsequent accesses of pages in this 
range will succeed, but will result either in re-loading of the memory 
contents from the underlying mapped file (see mmap(2)) or 
zero-fill-on-demand pages for mappings without an underlying file. 
+0

Tôi sẽ không thử điều này; 'MADV_DONTNEED' trên một ánh xạ tệp có thể được hiểu là có nghĩa là bạn muốn hệ điều hành * bỏ đi * thay đổi đối với tệp. – zwol

+0

@Zack, bạn có tham chiếu cho MADV_DONTNEED loại bỏ các thay đổi đối với tệp không? – Anton

+1

@antonm http://man7.org/tlpi/code/online/dist/vmem/madvise_dontneed.c.html có một chương trình thể hiện nó (không độc lập, không may, nhưng dễ dàng, đủ để sửa đổi). Xem thêm https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html ("' MADV_DONTNEED': Khu vực không còn cần thiết. Hạt nhân có thể miễn phí các trang này, * gây ra bất kỳ thay đổi nào các trang bị mất * "(nhấn mạnh mỏ)) và chuỗi LKML này từ năm 2005: https://lkml.org/lkml/2005/6/28/188. – zwol

Trả lời

0

đầu tiên, madv_sequential phép readahead tích cực, vì vậy bạn không cần nó. giây, os sẽ lười biếng ghi bộ nhớ bị dồn vào đĩa, dù bạn không làm gì cả. nhưng madv_dontneed sẽ hướng dẫn nó để giải phóng bộ nhớ ngay lập tức (những gì bạn gọi là "tài nguyên os khác nhau"). thứ ba, không rõ ràng rằng các tệp mmapping cho việc viết tuần tự có bất kỳ lợi thế nào. bạn có thể sẽ được phục vụ tốt hơn bằng cách chỉ viết (2) (nhưng sử dụng bộ đệm - hoặc bằng tay hoặc stdio).

+1

Câu trả lời này chỉ là sai, xem câu trả lời ở trên cho lý do tại sao. – Eloff

+0

sửa phần madv_dontneed – pal

11

Không!

Vì lợi ích của chính bạn, hãy tránh xa MADV_DONTNEED. Linux sẽ không phải coi đây là gợi ý để ném các trang đi sau khi viết chúng lại, nhưng để vứt chúng đi ngay lập tức. Đây không phải là một lỗi, mà là một quyết định có chủ ý.

Trớ trêu thay, lý do là các chức năng của một tổ chức phi hủy diệt MADV_DONTNEED đã được đưa ra bởi msync(MS_INVALIDATE|MS_ASYNC), MS_ASYNC mặt khác không bắt đầu I/O (trên thực tế, nó không làm gì cả, sau khi lập luận rằng bẩn trang writeback hoạt động tốt anyway), fsync luôn chặn và sync_file_rangecó thể chặn nếu bạn vượt quá giới hạn tối nghĩa và được coi là "cực kỳ nguy hiểm" bởi tài liệu, điều đó có nghĩa là gì.

Dù bằng cách nào, bạn phải msync(MS_SYNC), hoặc fsync (cả chặn), hoặc sync_file_range (có thể chặn) tiếp theo là fsync, hoặc bạn sẽ bị mất dữ liệu với MADV_DONTNEED. Nếu bạn không thể đủ khả năng để có thể chặn, bạn không có sự lựa chọn, đáng buồn, nhưng để làm điều này trong một chủ đề khác.

+2

Tôi nghĩ rằng bạn có nghĩa là 'msync (MS_INVALIDATE ...' chứ không phải là 'madvise()' – Hasturkun

+0

Đúng vậy, cảm ơn bạn – Damon

+0

@Damon câu trả lời quyết đoán của bạn là [tham chiếu] (https://www.youtube. com/watch? v = bg6-LVCHmGM & feature = youtu.be & t = 4426) trong [Bryan Cantrill's 2015 Surge rant về hành vi MADV_DONTNEED của Linux] (https://www.youtube.com/watch?v=bg6-LVCHmGM&feature=youtu.be&t = 3518). – Anon

Các vấn đề liên quan