2017-07-25 21 views
8

Tôi có cấu trúc dữ liệu mà tôi muốn làm lại để trang theo yêu cầu. mmap có vẻ như một cách dễ dàng để chạy một số thử nghiệm ban đầu. Tuy nhiên, tôi muốn giới hạn số lượng bộ đệm đệm mà sử dụng mmap. Máy có đủ bộ nhớ để trang toàn bộ cấu trúc dữ liệu vào bộ nhớ cache, nhưng vì lý do kiểm tra (và một số lý do sản xuất nữa) tôi không muốn cho phép nó làm điều đó.Bộ đệm bộ đệm giới hạn được sử dụng cho mmap

Có cách nào để giới hạn số lượng bộ đệm đệm được sử dụng bởi mmap không?

Cách khác, thay thế mmap có thể đạt được điều gì đó tương tự và vẫn hạn chế sử dụng bộ nhớ cũng sẽ hoạt động.

+2

bộ đệm đệm được tự động duy trì một cách tự động bởi hạt nhân. Bản thân nó sẽ không gây ra lỗi bộ nhớ. Tại sao bạn muốn tự mình kiểm soát? – fukanchik

+0

@fukanchik Vì môi trường của tôi, tôi phải biết chính xác dung lượng bộ nhớ mà quá trình của tôi sẽ sử dụng và giới hạn nó. Ngoài ra, tôi có một máy có bộ nhớ 100GB, nhưng tôi muốn kiểm tra phần mềm như thể máy chỉ có bộ nhớ 1GB. – JaredC

+0

Tôi nghĩ rằng đặt cược tốt nhất của bạn không phải là để xử lý điều này từ bên trong ứng dụng, nhưng ở cấp độ hệ điều hành để thay thế. Đây là một điểm khởi đầu tốt: https://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process – Frank

Trả lời

3

Từ sự hiểu biết của tôi, điều đó là không thể. Ánh xạ bộ nhớ được điều khiển bởi hệ điều hành. Hạt nhân sẽ đưa ra quyết định cách sử dụng bộ nhớ có sẵn theo cách tốt nhất, nhưng nó nhìn vào hệ thống. Tôi không biết rằng hạn ngạch cho cache trên một mức độ quy trình được hỗ trợ (ít nhất, tôi đã không thấy các API như vậy trong Linux hoặc BSD).

madvise để cung cấp gợi ý hạt nhân, nhưng không hỗ trợ giới hạn bộ nhớ cache được sử dụng cho một quy trình. Bạn có thể đưa ra các gợi ý như MADV_DONTNEED, điều này sẽ giảm áp lực lên bộ nhớ cache của các ứng dụng khác, nhưng tôi cho rằng nó sẽ gây hại nhiều hơn là tốt, vì nó sẽ làm cho bộ nhớ đệm kém hiệu quả hơn. trên tổng số hệ thống.

Tôi chỉ thấy hai lựa chọn thay thế. Bật đang cố gắng giải quyết vấn đề ở cấp hệ điều hành và cách khác là giải quyết vấn đề ở cấp ứng dụng.

Ở cấp độ hệ điều hành, tôi thấy hai lựa chọn:

  1. Bạn có thể chạy một máy ảo, nhưng rất có thể đây không phải là những gì bạn muốn. Tôi cũng hy vọng rằng nó sẽ không cải thiện hiệu năng hệ thống tổng thể. Tuy nhiên, nó sẽ là ít nhất một cách để xác định giới hạn trên về mức tiêu thụ bộ nhớ.
  2. Docker là một ý tưởng khác xuất hiện trong đầu, cũng hoạt động ở cấp hệ điều hành, nhưng theo hiểu biết tốt nhất của tôi, nó không hỗ trợ định nghĩa hạn ngạch trên bộ đệm. Tôi không nghĩ rằng nó sẽ làm việc.

Điều đó chỉ còn một tùy chọn, đó là xem xét cấp ứng dụng. Thay vì sử dụng các tệp ánh xạ bộ nhớ, bạn có thể sử dụng các hoạt động hệ thống tệp rõ ràng. Nếu bạn cần có toàn quyền kiểm soát bộ đệm, tôi nghĩ đó là lựa chọn thực tế duy nhất. Đó là công việc nhiều hơn so với bản đồ bộ nhớ, và nó cũng không được đảm bảo để thực hiện tốt hơn.

Nếu bạn muốn ở lại với ánh xạ bộ nhớ, bạn cũng có thể ánh xạ chỉ một phần của tệp trong bộ nhớ và bỏ qua các phần khác khi bạn vượt quá hạn ngạch bộ nhớ của mình. Nó cũng có cùng một vấn đề như các hoạt động IO tập tin rõ ràng (công việc thực hiện nhiều hơn và điều chỉnh không tầm thường để tìm một chiến lược bộ nhớ đệm tốt).

Có nói rằng, bạn có thể đặt câu hỏi về yêu cầu giới hạn mức sử dụng bộ nhớ cache. Tôi hy vọng rằng hạt nhân sẽ làm một công việc khá tốt trong việc phân bổ tài nguyên bộ nhớ theo cách tốt. Ít nhất, nó có thể sẽ tốt hơn so với các giải pháp mà tôi đã phác thảo. (Tệp IO rõ ràng, cộng với bộ nhớ cache nội bộ, có thể nhanh, nhưng nó không phải là tầm thường để thực hiện và điều chỉnh. Ở đây, là so sánh các lần cân bằng: mmap() vs. reading blocks.)

Trong khi thử nghiệm, bạn có thể chạy ứng dụng với ionice -c 3nice -n 20 để phần nào giảm tác động đối với các ứng dụng sản xuất khác. Ngoài ra còn có một công cụ gọi là nocache.Tôi không bao giờ sử dụng nó nhưng khi đọc qua tài liệu của nó, nó có vẻ hơi liên quan đến câu hỏi của bạn.

0

Có thể thực hiện điều này thông qua việc sử dụng mmap()Linux Control Groups (thông thường hơn, here hoặc here). Sau khi cài đặt, bạn có khả năng tạo ra giới hạn tùy ý về số lượng, trong số những thứ khác, bộ nhớ vật lý được sử dụng bởi một quá trình. Ví dụ, ở đây chúng tôi giới hạn bộ nhớ vật lý để 128 meg và bộ nhớ swap 256 meg:

cgcreate -g memory:/limitMemory 
echo $((128 * 1024 * 1024)) > /sys/fs/cgroup/memory/limitMemory/memory.limit_in_bytes 
echo $((256 * 1024 * 1024)) > /sys/fs/cgroup/memory/limitMemory/memory.memsw.limit_in_bytes 
1

tôi sẽ đi con đường của các bộ phận bản đồ duy nhất của tập tin tại một thời điểm, do đó bạn có thể duy trì kiểm soát hoàn toàn vào chính xác bao nhiêu bộ nhớ được sử dụng.

-1

bạn có thể sử dụng phân đoạn bộ nhớ dùng chung ipc, bạn sẽ là chủ của phân đoạn bộ nhớ.

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