Tôi có cấu hình như sau:
- một máy chủ chạy ba container docker:
- MongoDB
- Redis
- Một chương trình sử dụng hai container trước để lưu trữ dữ liệu
Cả Redis và MongoDB đều được sử dụng để lưu trữ lượng dữ liệu khổng lồ. Tôi biết Redis cần giữ tất cả dữ liệu của nó trong RAM và tôi ổn với điều này. Thật không may, điều xảy ra là mongo bắt đầu chiếm rất nhiều RAM và ngay khi RAM máy chủ đầy (chúng ta đang nói về 32GB ở đây), thì mongo hoặc Redis gặp sự cố.
Tôi đã đọc các câu hỏi trước đây về điều này:
- Hạn chế sử dụng RAM MongoDB : rõ ràng hầu hết RAM được sử dụng hết bởi bộ đệm WiredTiger
- Bộ nhớ giới hạn MongoDB : ở đây rõ ràng vấn đề là dữ liệu nhật ký
- Giới hạn việc sử dụng bộ nhớ RAM trong MongoDB : ở đây họ đề xuất giới hạn bộ nhớ của người dùng để nó sử dụng một lượng bộ nhớ nhỏ hơn cho bộ nhớ cache / nhật ký / dữ liệu của nó
- MongoDB sử dụng quá nhiều bộ nhớ : ở đây họ nói rằng đó là hệ thống bộ nhớ đệm WiredTiger có xu hướng sử dụng càng nhiều RAM càng tốt để cung cấp truy cập nhanh hơn. Họ cũng nói
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- Có tùy chọn nào để hạn chế sử dụng bộ nhớ mongodb không? : bộ nhớ đệm một lần nữa, họ cũng thêm
MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
- Mối quan hệ chỉ số / RAM MongoDB : quote:
MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
- Làm cách nào để giải phóng bộ nhớ đệm được MongoDB sử dụng? : trả lời giống như trong 5.
Bây giờ những gì tôi dường như hiểu từ tất cả các câu trả lời là:
- Để truy cập nhanh hơn, sẽ tốt hơn cho mongo phù hợp với tất cả các chỉ số trong RAM. Tuy nhiên, trong trường hợp của tôi, tôi ổn với các chỉ số nằm trong đĩa vì tôi có ổ SSD khá nhanh.
- RAM chủ yếu được sử dụng để lưu vào bộ nhớ cache của mongo.
Xem xét điều này, tôi đã mong đợi mongo sẽ thử và sử dụng nhiều dung lượng RAM nhất có thể nhưng có thể hoạt động với ít không gian RAM và lấy hầu hết mọi thứ từ đĩa. Tuy nhiên, tôi đã giới hạn bộ nhớ của trình chứa Docker (ví dụ như 8GB), bằng cách sử dụng --memory
và --memory-swap
, nhưng thay vì tìm nạp nội dung từ đĩa, mongo chỉ bị hỏng ngay khi hết bộ nhớ.
Làm cách nào tôi có thể buộc mongo chỉ sử dụng bộ nhớ khả dụng và tìm nạp từ đĩa mọi thứ không phù hợp với bộ nhớ?
dmesg
tương quan với việc tắt đột xuất không? Khả năng có thể xảy ra nhất với Docker là các quá trình trong vùng chứa phát hiện RAM tổng thể có sẵn thay vì giới hạn vùng chứa.
mongod
trong một thùng chứa ( lxc
,, cgroups
Docker, v.v.) không có quyền truy cập vào tất cả RAM có sẵn trong hệ thống, bạn phải đặt storage.wiredTiger.engineConfig.cacheSizeGB
giá trị nhỏ hơn dung lượng RAM có sẵn trong các container. Số tiền chính xác phụ thuộc vào các quy trình khác đang chạy trong bộ chứa, nhưng thông thường không nên nhiều hơn giá trị mặc định là 50% RAM trừ đi 1GB.