MongoDB Không sử dụng tất cả RAM có sẵn


9

Tôi có một cái gì đó khoảng 200 GB dữ liệu được lưu trữ trong một cụm mongo. Bộ nhớ vật lý trên một trong những trường hợp chạy mongo là 8GB. Không có gì khác của bất kỳ hậu quả chạy trong trường hợp này. Gần như tôi có thể hiểu dựa trên tài liệu của Mongo (như thế này: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ) điều này có nghĩa là quy trình mongod nên sử dụng khoảng 100% bộ nhớ vật lý có sẵn. Nhưng nếu bạn nhìn vào đầu ra sau từ toplệnh, bạn sẽ thấy rằng cá thể mongod chỉ sử dụng 2GB bộ nhớ lưu trú và có đầy đủ 2GB bộ nhớ vật lý miễn phí có sẵn mà không được sử dụng.

Ai đó có thể giải thích hành vi này cho tôi? Tại sao có 2GB bộ nhớ trống?

top đầu ra:

top - 23:19:43 up 89 days, 20:05,  2 users,  load average: 0.41, 0.55, 0.59
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.0%us,  1.3%sy,  0.0%ni, 93.9%id,  2.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8163664k total,  6131764k used,  2031900k free,    54976k buffers
Swap: 16771848k total,    10604k used, 16761244k free,  5367700k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
 1401 mongodb   20   0  174g 2.0g 1.9g S   23 26.2  18070:55 mongod
 ...

Thông tin hệ thống:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

Ghi chú:

  • Có một ví dụ khác trong cụm này nơi mongod đang hoạt động như tôi mong đợi và sử dụng tất cả bộ nhớ có sẵn.
  • Nhìn vào bộ điều chỉnh có vẻ như liên tục có một số lỗi trang, do đó, số lượng bộ nhớ được sử dụng sẽ tăng lên:
  • (Tôi đã hỏi câu hỏi tương tự trên nhóm google người dùng mongodb nhưng không có phản hồi.)

Bản phân phối Linux nào? Là 32 hay 64 bit? (Chỉnh sửa câu hỏi của bạn với đầu ra của lsb-release -auname -axin vui lòng)
Philᵀᴹ

Cảm ơn. Đã thêm unamenhưng tôi chưa lsb-releasecài đặt.
Chris W.

Bạn đã vô tình tải xuống phiên bản MongoDB 32 bit? Kích thước tối đa của phiên bản Mongo 32 bit là 2GB.
Aaron

@ BryceAtNetwork23 không; chúng tôi chắc chắn có hơn 2GB trong tổng số mongodb của chúng tôi (thực tế vài trăm hợp đồng biểu diễn).
Chris W.

@ChrisW có nghĩa là kích thước bộ nhớ tối đa - không phải kích thước cơ sở dữ liệu. Và có vẻ như nó sẽ giải thích tốt 2GB.
rfusca

Câu trả lời:


5

Kích thước bộ nhớ thường trú biểu thị số lượng trang trong bộ nhớ thực sự được mongodxử lý. Nếu nó thấp hơn đáng kể so với bộ nhớ khả dụng và dữ liệu vượt quá bộ nhớ khả dụng (thì của bạn), thì đó có thể là trường hợp đơn giản là chưa chủ động chạm vào đủ các trang.

Để xác định xem đây có phải là trường hợp không, bạn nên chạy free -m, đầu ra sẽ trông giống như thế này:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680

Trong ví dụ của tôi, bộ nhớ cache không gần với tổng số, điều đó có nghĩa là không chỉ mongod chưa chạm đủ các trang, bộ đệm của hệ thống tập tin thậm chí còn không được lấp đầy bởi các trang được đọc từ đĩa nói chung.

Biện pháp khắc phục nhanh cho việc này sẽ là lệnh cảm ứng (được thêm vào 2.2) - nên thận trọng khi sử dụng các tập dữ liệu lớn vì nó sẽ cố tải mọi thứ vào RAM ngay cả khi dữ liệu quá lớn để phù hợp (gây ra rất nhiều lỗi IO và lỗi trang). Nó chắc chắn sẽ lấp đầy bộ nhớ hiệu quả mặc dù :)

Nếu giá trị được lưu trong bộ nhớ cache của bạn gần với tổng số khả dụng, thì vấn đề của bạn là một số lượng lớn các trang được đọc vào bộ nhớ từ đĩa không liên quan đến (và do đó không được chạm vào) quá trình mongod. Ứng cử viên thông thường cho loại khác biệt này là readahead. Tôi đã đề cập chi tiết về chủ đề cụ thể đó ở nơi khác , vì vậy tôi sẽ chỉ liên kết hai câu trả lời đó để đọc trong tương lai nếu cần thiết.

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.