2014-06-14 12 views
5

Tôi có một máy chủ MongoDB chạy trên một VPS Linux rẻ tiền (CPU 1 x 2.0GHz và RAM 1GB).Làm cách nào để biết liệu MongoDB có cần nhiều CPU/RAM hơn không?

Đã gần một ngày và kết quả là db.stats() có vẻ hợp lý.

db.stats() 
{ 
     "db" : "app", 
     "collections" : 11, 
     "objects" : 2067, 
     "avgObjSize" : 238.20416061925496, 
     "dataSize" : 492368, 
     "storageSize" : 1007616, 
     "numExtents" : 18, 
     "indexes" : 9, 
     "indexSize" : 138992, 
     "fileSize" : 16777216, 
     "nsSizeMB" : 16, 
     "dataFileVersion" : { 
       "major" : 4, 
       "minor" : 5 
     }, 
     "extentFreeList" : { 
       "num" : 5, 
       "totalSize" : 286720 
     }, 
     "ok" : 1 
} 

Tôi có thể chiếu số ngày cho đến khi vượt quá dung lượng đĩa.

Tôi biết (từ FAQs) "MongoDB sẽ tự động sử dụng tất cả bộ nhớ miễn phí trên máy làm bộ nhớ cache của máy tính."

  1. Làm cách nào để xác định xem tôi có cần thêm RAM hoặc dung lượng CPU không?

  2. Mặc dù ứng dụng phụ thuộc, RAM hoặc CPU thường quan trọng hơn?

  3. Có bất kỳ điều gì được trả lại bởi db.runCommand({ serverStatus: 1, workingSet: 1 }) mà tôi nên đặc biệt chú ý không?

Trả lời

11

Làm cách nào để xác định xem tôi có cần thêm RAM hoặc dung lượng CPU không?

Điều quan trọng là phải có đủ bộ nhớ để chỉ mục của bạn và dữ liệu có thể vừa với bộ nhớ để đạt được hiệu suất tốt. Nếu workSet của bạn không phù hợp với bộ nhớ, bạn sẽ có rất nhiều page faults. Lỗi trang xảy ra khi MongoDB yêu cầu dữ liệu không được tải trong bộ nhớ vật lý và nó phải đọc từ bộ nhớ ảo (tức là đĩa). Việc truy cập đĩa thay vì bộ nhớ sẽ làm suy giảm hiệu suất của bạn một cách đáng kể khi truy cập đĩa chậm hơn so với việc truy cập dữ liệu trong bộ nhớ. Ổ SSD tốt, nhưng chúng vẫn chậm hơn nhiều so với RAM.

Mọi người thường quên rằng các kết nối mở cũng yêu cầu bộ nhớ. Trên Linux, phí bộ nhớ cho mỗi kết nối là khoảng 10 MB (trên các phiên bản cũ hơn như v1.8). Kể từ v1.9 phí này đã được thay đổi thành khoảng 1MB theo this JIRA ticket. Vì vậy, nếu bạn có 100 kết nối mở, điều đó sẽ gần như dịch sang 1GB (trên cũ) và 100MB (trên phiên bản mới hơn) sử dụng bộ nhớ (số này có thể đã thay đổi với hầu hết các phiên bản MongoDB gần đây, vì vậy YMMV). Bạn có thể kiểm tra số connections trong đầu ra của lệnh serverStatus để xem thông tin về số kết nối hiện tại/có sẵn.

Tôi khuyên bạn nên đọc MongoDB diagnostics.

Mặc dù ứng dụng phụ thuộc, RAM hoặc CPU thường quan trọng hơn?

Có CPU tốt hơn là quan trọng đối với các tác vụ như CPU: quét và sắp xếp, cập nhật và lập lại chỉ mục, giảm bản đồ, lệnh khung tổng hợp và JavaScript phía máy chủ. Có một CPU tốt hơn sẽ giúp với những nhiệm vụ đó, nhưng nếu bạn không có đủ bộ nhớ và bạn liên tục đọc từ đĩa, hiệu suất của bạn sẽ bị suy giảm.

Có điều gì được trả về bởi db.runCommand ({serverStatus: 1, workingSet: 1}) mà tôi nên đặc biệt chú ý không?

Lệnh serverStatus là một công cụ rất hữu ích để thu thập số liệu thống kê về máy chủ của bạn và phân tích thống kê máy chủ của bạn.

Trong đầu ra của serverStatus lệnh bạn nên chú ý đến:

  • mem chứa thông tin về cách sử dụng bộ nhớ hiện tại (ảo và phyisical tức là thường trú)
  • workingSet phần chứa các giá trị hữu ích cho việc ước tính kích thước của bộ làm việc, đó là lượng dữ liệu mà MongoDB sử dụng tích cực.
  • extra_info - đặc biệt là đối phó với page_faults
+0

Bạn có chắc chắn một kết nối duy nhất chiếm 10MB? Vui lòng trích dẫn nguồn của bạn. –

+0

@EladNava đây là phiên bản cũ hơn. Giá trị đã được giảm cho Linux trên các phiên bản không bao giờ MongoDB. Tôi đã thêm một tham chiếu đến vé JIRA. Lưu ý rằng đối với phiên bản 3.2+, điều này có thể khác và tôi không có thời gian để kiểm tra. –

+0

Thú vị, cảm ơn vì ngữ cảnh được thêm vào. –

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