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).
Có 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:
- 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ớ.
- 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 3
và nice -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.
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
@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
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