Vấn đề hiệu suất quan sát được của bạn trên một truy vấn ban đầu có thể là một trong các vấn đề sau (theo thứ tự khả năng xảy ra sơ bộ):
1) Ứng dụng / dịch vụ web của bạn có một số chi phí để khởi tạo theo yêu cầu đầu tiên (tức là cấp phát bộ nhớ, thiết lập nhóm kết nối, phân giải DNS, ...).
2) Chỉ mục hoặc dữ liệu bạn yêu cầu chưa có trong bộ nhớ, vì vậy cần được tải.
3) Trình tối ưu hóa truy vấn có thể mất nhiều thời gian hơn một chút để chạy yêu cầu đầu tiên, vì nó đang so sánh việc thực thi kế hoạch cho mẫu truy vấn của bạn.
Sẽ rất hữu ích nếu kiểm tra truy vấn qua mongo
shell và cô lập xem chi phí có liên quan đến MongoDB hoặc dịch vụ web của bạn hay không (thay vì xác định thời gian cho cả hai, như bạn đã làm).
Sau đây là một số lưu ý liên quan đến MongoDB.
Bộ nhớ đệm
MongoDB không có thời gian "lưu vào bộ nhớ đệm" cho các tài liệu trong bộ nhớ. Nó sử dụng các tệp ánh xạ bộ nhớ cho I / O đĩa và các tài liệu trong bộ nhớ dựa trên các truy vấn đang hoạt động của bạn (tài liệu / chỉ mục bạn đã tải gần đây) cũng như bộ nhớ khả dụng. Trình quản lý bộ nhớ ảo của hệ điều hành phụ trách bộ nhớ đệm và thường sẽ tuân theo thuật toán Ít được Sử dụng Gần đây (LRU) để quyết định những trang nào cần hoán đổi trong bộ nhớ.
Sử dụng bộ nhớ
Hành vi được mong đợi là theo thời gian MongoDB sẽ phát triển để sử dụng tất cả bộ nhớ trống để lưu trữ tập dữ liệu hoạt động đang hoạt động của bạn.
Xem xét db.stats()
đã cung cấp của bạn số (và giả sử đó là duy nhất của bạn cơ sở dữ liệu), có vẻ như kích thước cơ sở dữ liệu của bạn hiện tại khoảng 1Gb, vì vậy bạn có thể giữ mọi thứ trong tổng RAM 10Gb của mình trừ khi:
- có các quy trình khác đang cạnh tranh để giành bộ nhớ
- bạn đã khởi động lại
mongod
của mình máy chủ và các tài liệu / chỉ mục đó chưa được yêu cầu
Trong MongoDB 2.2, có một touch
mới
lệnh bạn có thể sử dụng để tải các chỉ mục hoặc tài liệu vào bộ nhớ sau khi máy chủ khởi động lại. Điều này chỉ nên được sử dụng khi khởi động ban đầu để "hâm nóng" máy chủ, vì nếu không, bạn có thể vô tình buộc dữ liệu "đang hoạt động" thực tế ra khỏi bộ nhớ.
Ví dụ:trên hệ thống linux, bạn có thể sử dụng top
lệnh và sẽ thấy rằng:
- byte ảo / VSIZE sẽ có xu hướng bằng kích thước của toàn bộ cơ sở dữ liệu
- nếu máy chủ không có các quy trình khác đang chạy, byte / RSIZE thường trú sẽ là tổng bộ nhớ của máy (điều này bao gồm nội dung bộ nhớ cache của hệ thống tệp)
-
mongod
không nên sử dụng hoán đổi (vì các tệp được ánh xạ bộ nhớ)
Bạn có thể sử dụng mongostat
công cụ để xem nhanh mongod
của bạn hoạt động .. hoặc hữu ích hơn, hãy sử dụng dịch vụ như MMS
để theo dõi các chỉ số theo thời gian.
Trình tối ưu hóa Truy vấn
MongoDB Trình tối ưu hóa truy vấn
so sánh việc thực thi kế hoạch cho một mẫu truy vấn sau mỗi ~ 1.000 thao tác ghi và sau đó lưu vào bộ nhớ cache kế hoạch truy vấn "chiến thắng" cho đến lần tiếp theo trình tối ưu hóa chạy .. hoặc bạn gọi một cách rõ ràng là explain()
trên truy vấn đó.
Đây sẽ là một thử nghiệm đơn giản:chạy truy vấn của bạn trong mongo
shell với .explain()
và xem thời gian mili giây cũng như số lượng mục nhập chỉ mục và tài liệu được quét. Thời gian cho một giải thích () không phải là thời gian thực mà các truy vấn sẽ chạy, vì nó bao gồm chi phí so sánh các kế hoạch. Quá trình thực thi thông thường sẽ nhanh hơn nhiều .. và bạn có thể tìm các truy vấn chậm trong mongod
của mình nhật ký.
Theo mặc định, MongoDB sẽ ghi lại tất cả các truy vấn chậm hơn 100ms, vì vậy điều này cung cấp một điểm khởi đầu tốt để tìm kiếm các truy vấn để tối ưu hóa. Bạn có thể điều chỉnh giá trị ms chậm bằng --slowms
tùy chọn cấu hình hoặc sử dụng Database Profiler
lệnh.