MongoDB: Yêu cầu về RAM


20

Là đủ để có toàn bộ chỉ mục trong bộ nhớ / ram hay mongodb thậm chí còn cố gắng phân bổ càng nhiều ram càng tốt để lưu trữ ngay cả dữ liệu để đọc nhanh?

Tôi muốn chạy mongodb + các ứng dụng khác và có vẻ như mongodb là ứng dụng duy nhất không cho phép tôi xác định phạm vi RAM, để nói "max_memory_allocated_or_reserved = 8GB".

Nếu không có cách nào để làm như vậy, tôi nên giải thích với oom-killer rằng mongod là quá trình "xấu" không phải là cách thực hành tốt nhất theo quan điểm của tôi ...

Câu trả lời:


18

Lý do thực sự tại sao bạn không thể làm như bạn yêu cầu (giới hạn bộ nhớ) là vì MongoDB không quản lý bộ nhớ mà nó sử dụng trực tiếp - nó cho phép HĐH làm điều đó. MongoDB chỉ cần bộ nhớ ánh xạ tất cả dữ liệu của nó và sau đó có trang hệ điều hành trong và ngoài bộ nhớ khi cần. Kết quả là, không có sự quản lý trực tiếp số tiền được sử dụng cho đến khi MongoDB thực hiện việc này theo một cách hoàn toàn khác hoặc HĐH cho phép nó (không thể có trong Linux kể từ 2,4 ngày).

Cách duy nhất để thực sự tách biệt các tài nguyên hiện tại là sử dụng giải pháp ảo hóa và cô lập MongoDB trong VM của chính nó. Vâng, có những chi phí liên quan (mặc dù các nhà ảo thuật đã tốt hơn rất nhiều), nhưng tại thời điểm đó là cái giá phải trả cho mức độ kiểm soát tài nguyên đó.

Về mặt OOM Killer, ngay cả khi không có quá trình nào khác trên máy chủ, miễn là tập dữ liệu và chỉ mục của bạn vượt quá bộ nhớ khả dụng, MongoDB có thể gặp sự cố OOM Killer. Điều này là do cách dữ liệu được phân trang ra khỏi bộ nhớ - nếu không có áp lực bộ nhớ (không có gì khác muốn bộ nhớ Resident) và bạn tiếp tục thêm / chạm vào dữ liệu và chỉ mục mới, thì cuối cùng nó sẽ phát triển để tiêu thụ hết RAM có sẵn. Do đó, khuyến nghị luôn luôn định cấu hình một số trao đổi khi chạy MongoDB:

https://docs.mongodb.com/manual/adftime/production-notes/#swap

Tất nhiên, dữ liệu LRU sẽ được phân trang trước, các quá trình khác cũng có thể chiếm res mem, nhưng khái niệm này vẫn được áp dụng trừ khi bạn tải dữ liệu của mình vào bộ nhớ và sau đó nó ở trạng thái tĩnh. Điều tốt nhất để làm nếu bạn lo lắng là đưa nó vào MMS và theo dõi việc sử dụng theo thời gian:

http://mms.mongodb.com

Cập nhật: Tháng 8 năm 2015

Kể từ khi tôi viết câu trả lời này, mọi thứ đã chuyển sang phần nào và thông tin có chút lỗi thời. Ví dụ, Linux hiện có các nhóm và công nghệ liên quan ( ví dụ: Docker container ) đã hoàn thiện đến mức chúng cho phép bạn cách ly và hạn chế tốt hơn các tài nguyên ( bao gồm cả bộ nhớ ) được sử dụng bởi bất kỳ quy trình nào trong môi trường sản xuất, ngay cả một quy trình sử dụng ánh xạ bộ nhớ như MongoDB.

Ngoài ra, với sự ra đời của các công cụ lưu trữ mới ngoài MMAP như WiredTiger trong MongoDB 3.0+, bạn có thể sử dụng chức năng tích hợp để giới hạn kích thước bộ đệm cho MongoDB. Do đó, các yêu cầu về RAM bây giờ thực sự phụ thuộc vào cách bạn chọn định cấu hình MongoDB, môi trường bạn chạy nó và công cụ lưu trữ nào bạn chọn.


liên quan đến WiredTiger: "Storage.wiredTiger.engineConfig.cacheSizeGB chỉ giới hạn kích thước của bộ đệm WiredTiger, chứ không phải tổng dung lượng bộ nhớ được sử dụng bởi mongod. Bộ đệm WiredTiger chỉ là một thành phần của RAM được sử dụng bởi MongoDB. MongoDB cũng tự động sử dụng tất cả bộ nhớ trống trên máy thông qua bộ đệm hệ thống tập tin ... "
Stefan Rogin

đúng, nhưng cũng có thể nói như vậy đối với bất kỳ ứng dụng nào xóa dữ liệu trên đĩa, bộ đệm FS không còn là phương thức lưu trữ chính cho dữ liệu như trước đây với các tệp được ánh xạ bộ nhớ trong công cụ lưu trữ MMAP
Adam C

6

MongoDB sẽ sử dụng bộ nhớ trống có sẵn để lưu vào bộ đệm và trao đổi vào đĩa khi cần để cung cấp bộ nhớ cho các ứng dụng khác trên cùng một máy chủ. Để có hiệu suất tốt nhất, bạn sẽ muốn có đủ RAM để giữ các chỉ số và dữ liệu thường xuyên sử dụng ("bộ công việc") trong bộ nhớ.

Đọc hữu ích:


3

Một số điều được thay đổi trong nhiều năm về MongoDB.

TL; DR

Nếu công cụ lưu trữ MMAPv1 được sử dụng trên working setkích thước MongoDB phải phù hợp với RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-usiness-set-size-fit-ram

Nếu công cụ lưu trữ WiredTiger được sử dụng trên MongoDB, không cần quan tâm đến việc RAM có phù hợp working sethay không . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-st Storage-engine

Chẩn đoán bộ nhớ cho Công cụ lưu trữ WiredTiger

Kích thước bộ làm việc của tôi phải phù hợp với RAM?

Không.

Làm cách nào để tính toán tôi cần bao nhiêu RAM cho ứng dụng của mình?

Với WiredTiger, MongoDB sử dụng cả bộ đệm trong của WiredTiger và bộ đệm của hệ thống tập tin.

Thay đổi trong phiên bản 3.2: Bắt đầu từ MongoDB 3.2, bộ đệm trong của WiredTiger, theo mặc định, sẽ sử dụng lớn hơn một trong hai:

60% RAM trừ đi 1 GB, hoặc 1 GB.


Vâng, câu trả lời này không giúp ích nhiều, cũng không chính xác khủng khiếp.
Philip Schiff
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.