Hiệu suất cơ sở dữ liệu ảnh hưởng đến hiệu suất của tổ chức và chúng tôi có xu hướng muốn tìm kiếm một giải pháp khắc phục nhanh chóng. Có nhiều cách khác nhau để cải thiện hiệu suất trong MongoDB. Trong blog này, chúng tôi sẽ giúp bạn hiểu rõ hơn về khối lượng công việc cơ sở dữ liệu của bạn và những điều có thể gây hại cho nó. Kiến thức về cách sử dụng các nguồn lực hạn chế là điều cần thiết cho bất kỳ ai quản lý cơ sở dữ liệu sản xuất.
Chúng tôi sẽ chỉ cho bạn cách xác định các yếu tố hạn chế hoạt động của cơ sở dữ liệu. Để đảm bảo rằng cơ sở dữ liệu hoạt động như mong đợi, chúng tôi sẽ bắt đầu từ công cụ giám sát Đám mây MongoDB miễn phí. Sau đó, chúng tôi sẽ kiểm tra cách quản lý tệp nhật ký và cách kiểm tra các truy vấn. Để có thể đạt được việc sử dụng tài nguyên phần cứng một cách tối ưu, chúng tôi sẽ xem xét tối ưu hóa hạt nhân và các cài đặt hệ điều hành quan trọng khác. Cuối cùng, chúng ta sẽ xem xét bản sao MongoDB và cách kiểm tra hiệu suất.
Giám sát hiệu suất miễn phí
MongoDB đã giới thiệu một công cụ giám sát hiệu suất miễn phí trên đám mây cho các phiên bản độc lập và nhóm bản sao. Khi được bật, dữ liệu được giám sát sẽ được tải lên định kỳ lên dịch vụ đám mây của nhà cung cấp. Điều đó không yêu cầu bất kỳ tác nhân bổ sung nào, chức năng được tích hợp trong MongoDB 4.0+ mới. Quá trình này khá đơn giản để thiết lập và quản lý. Sau khi kích hoạt một lệnh duy nhất, bạn sẽ nhận được một địa chỉ Web duy nhất để truy cập số liệu thống kê hiệu suất gần đây của bạn. Bạn chỉ có thể truy cập dữ liệu được giám sát đã được tải lên trong vòng 24 giờ qua.
Đây là cách kích hoạt tính năng này. Bạn có thể bật / tắt tính năng giám sát miễn phí trong thời gian chạy bằng cách sử dụng:
-- Enable Free Monitoring
db.enableFreeMonitoring()
-- Disable Free Monitoring
db.disableFreeMonitoring()
Bạn cũng có thể bật hoặc tắt tính năng giám sát miễn phí trong quá trình khởi động mongod bằng cách sử dụng cài đặt tệp cấu hình cloud.monitoring.free.state hoặc tùy chọn dòng lệnh --enableFreeMoosystem
db.enableFreeMonitoring()
Sau khi kích hoạt, bạn sẽ thấy một thông báo với trạng thái thực tế.
{
"state" : "enabled",
"message" : "To see your monitoring data, navigate to the unique URL below. Anyone you share the URL with will also be able to view this page. You can disable monitoring at any time by running db.disableFreeMonitoring().",
"url" : "https://cloud.mongodb.com/freemonitoring/cluster/XEARVO6RB2OTXEAHKHLKJ5V6KV3FAM6B",
"userReminder" : "",
"ok" : 1
}
Chỉ cần sao chép / dán URL từ đầu ra trạng thái vào trình duyệt và bạn có thể bắt đầu kiểm tra số liệu hiệu suất.
MongoDB Giám sát miễn phí cung cấp thông tin về các số liệu sau:
- Thời gian thực hiện hoạt động (ĐỌC, VIẾT, LỆNH)
- Hiệu suất sử dụng đĩa (TỐI ĐA% TIỆN ÍCH CỦA BẤT KỲ Ổ đĩa nào, TIỆN ÍCH AVERAGE% CỦA TẤT CẢ CÁC Ổ Đĩa)
- Bộ nhớ (RESIDENT, VIRTUAL, MAPPED)
- Mạng - Đầu vào / Đầu ra (BYTES IN, BYTES OUT)
- Mạng - Số yêu cầu (NUM YÊU CẦU)
- Bộ đếm (CHÈN, QUERY, CẬP NHẬT, XÓA, GETMORE, COMMAND)
- Bộ đếm - Sao chép (CHÈN, QUERY, CẬP NHẬT, XÓA, GETMORE, COMMAND)
- Nhắm mục tiêu theo truy vấn (ĐÃ QUÉT / QUAY LẠI, ĐỐI TƯỢNG ĐƯỢC QUY HOẠCH / ĐÃ TRỞ LẠI)
- Hàng đợi (NGƯỜI ĐỌC, NGƯỜI VIẾT, TOTAL)
- Sử dụng Cpu hệ thống (USER, NICE, KERNEL, IOWAIT, IRQ, SOFT IRQ, STEAL, GUEST)
Để xem trạng thái của dịch vụ giám sát miễn phí của bạn, hãy sử dụng phương pháp sau:
db.getFreeMonitoringStatus()
ServerStatus và trình trợ giúp db.serverStatus () cũng bao gồm thống kê giám sát miễn phí trong trường Giám sát miễn phí.
Khi chạy với kiểm soát truy cập, người dùng phải có các đặc quyền sau để cho phép theo dõi miễn phí và nhận trạng thái:
{ resource: { cluster : true }, actions: [ "setFreeMonitoring", "checkFreeMonitoringStatus" ] }
Công cụ này có thể là một khởi đầu tốt cho những ai cảm thấy khó khăn khi đọc đầu ra trạng thái máy chủ MongoDB từ dòng lệnh:
db.serverStatus()
Giám sát miễn phí là một khởi đầu tốt nhưng nó có các tùy chọn rất hạn chế, nếu bạn cần một công cụ nâng cao hơn, bạn có thể muốn kiểm tra MongoDB Ops Manager hoặc ClusterControl.
Ghi nhật ký các hoạt động cơ sở dữ liệu
Trình điều khiển MongoDB và ứng dụng khách có thể gửi thông tin đến tệp nhật ký máy chủ. Thông tin như vậy phụ thuộc vào loại sự kiện. Để kiểm tra cài đặt hiện tại, hãy đăng nhập với tư cách quản trị viên và thực thi:
db.getLogComponents()
Thông báo nhật ký bao gồm nhiều thành phần. Điều này là để cung cấp một phân loại chức năng của các tin nhắn. Đối với mỗi thành phần, bạn có thể đặt độ dài nhật ký khác nhau. Danh sách các thành phần hiện tại là:
ACCESS, COMMAND, CONTROL, FTD, GEO, INDEX, NETWORK, QUERY, REPL_HB, REPL, ROLLBACK, REPL, SHARDING, STORAGE, RECOVERY, JOURNAL, STORAGE, WRITE.
Để biết thêm chi tiết về từng thành phần, hãy kiểm tra tài liệu.
Thu thập truy vấn - Hồ sơ cơ sở dữ liệu
MongoDB Database Profiler thu thập thông tin về các hoạt động chạy trên một phiên bản mongod. Theo mặc định, trình biên dịch không thu thập bất kỳ dữ liệu nào. Bạn có thể chọn thu thập tất cả các thao tác (giá trị 2) hoặc những thao tác mất nhiều thời gian hơn giá trị của slowms . Sau đó là một tham số cá thể có thể được điều khiển thông qua tệp cấu hình mongodb. Để kiểm tra mức hiện tại:
db.getProfilingLevel()
Để nắm bắt tất cả các truy vấn đã đặt:
db.setProfilingLevel(2)
Trong tệp cấu hình, bạn có thể đặt:
profile = <0/1/2>
slowms = <value>
Cài đặt này sẽ được áp dụng trên một phiên bản duy nhất và không phổ biến trên một nhóm bản sao hoặc cụm được chia sẻ, vì vậy bạn cần lặp lại lệnh này cho tất cả các nút nếu bạn muốn nắm bắt tất cả các hoạt động. Cấu hình cơ sở dữ liệu có thể ảnh hưởng đến hiệu suất cơ sở dữ liệu. Chỉ bật tùy chọn này sau khi cân nhắc kỹ lưỡng.
Sau đó, để liệt kê 10 gần đây nhất:
db.system.profile.find().limit(10).sort(
{ ts : -1 }
).pretty()
Để liệt kê tất cả:
db.system.profile.find( { op:
{ $ne : 'command' }
} ).pretty()
Và để liệt kê cho một bộ sưu tập cụ thể:
db.system.profile.find(
{ ns : 'mydb.test' }
).pretty()
Ghi nhật ký MongoDB
Vị trí nhật ký MongoDB được xác định trong cài đặt đường dẫn đăng nhập của cấu hình của bạn và nó thường là /var/log/mongodb/mongod.log. Bạn có thể tìm thấy tệp cấu hình MongoDB tại /etc/mongod.conf.
Đây là dữ liệu mẫu:
2018-07-01T23:09:27.101+0000 I ASIO [NetworkInterfaceASIO-Replication-0] Connecting to node1:27017
2018-07-01T23:09:27.102+0000 I ASIO [NetworkInterfaceASIO-Replication-0] Failed to connect to node1:27017 - HostUnreachable: Connection refused
2018-07-01T23:09:27.102+0000 I ASIO [NetworkInterfaceASIO-Replication-0] Dropping all pooled connections to node1:27017 due to failed operation on a connection
2018-07-01T23:09:27.102+0000 I REPL_HB [replexec-2] Error in heartbeat (requestId: 21589) to node1:27017, response status: HostUnreachable: Connection refused
2018-07-01T23:09:27.102+0000 I ASIO [NetworkInterfaceASIO-Replication-0] Connecting to node1:27017
Bạn có thể sửa đổi độ dài nhật ký của thành phần bằng cách đặt (ví dụ truy vấn):
db.setLogLevel(2, "query")
Tệp nhật ký có thể rất quan trọng, vì vậy bạn có thể muốn xóa nó trước khi lập hồ sơ. Từ bảng điều khiển dòng lệnh MongoDB, nhập:
db.runCommand({ logRotate : 1 });
Kiểm tra thông số hệ điều hành
Giới hạn bộ nhớ
Để xem các giới hạn liên quan đến thông tin đăng nhập của bạn, hãy sử dụng lệnh ulimit -a. Các ngưỡng và cài đặt sau đặc biệt quan trọng đối với việc triển khai mongod và mongos:
-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-n (open files): 64000
-m (memory size): unlimited [1]
-u (processes/threads): 32000
Phiên bản mới hơn của tập lệnh khởi động mongod (/etc/init.d/mongod) có cài đặt mặc định được tích hợp trong tùy chọn bắt đầu:
start()
{
# Make sure the default pidfile directory exists
if [ ! -d $PIDDIR ]; then
install -d -m 0755 -o $MONGO_USER -g $MONGO_GROUP $PIDDIR
fi
# Make sure the pidfile does not exist
if [ -f "$PIDFILEPATH" ]; then
echo "Error starting mongod. $PIDFILEPATH exists."
RETVAL=1
return
fi
# Recommended ulimit values for mongod or mongos
# See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
#
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
ulimit -u 64000
ulimit -l unlimited
echo -n $"Starting mongod: "
daemon --user "$MONGO_USER" --check $mongod "$NUMACTL $mongod $OPTIONS >/dev/null 2>&1"
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongod
}
Vai trò của hệ thống con quản lý bộ nhớ còn được gọi là trình quản lý bộ nhớ ảo là quản lý việc cấp phát bộ nhớ vật lý (RAM) cho toàn bộ hạt nhân và các chương trình người dùng. Điều này được kiểm soát bởi các tham số vm. *. Có hai điều bạn nên cân nhắc trước tiên để điều chỉnh hiệu suất MongoDB - vm.dirty_ratio và vm.dirty_background_ratio .
vm.dirty_ratio là dung lượng bộ nhớ hệ thống tối đa tuyệt đối có thể được lấp đầy bởi các trang bẩn trước khi mọi thứ phải được đưa vào đĩa. Khi hệ thống đến thời điểm này, tất cả các khối I / O mới cho đến khi các trang bẩn được ghi vào đĩa. Đây thường là nguyên nhân dẫn đến việc tạm dừng I / O kéo dài. Giá trị mặc định là 30, thường là quá cao. vm.dirty_background_ratio là phần trăm bộ nhớ hệ thống có thể bị lấp đầy bởi các trang “bẩn” - các trang bộ nhớ vẫn cần được ghi vào đĩa. Khởi đầu tốt là đi từ điểm 10 và đo lường hiệu suất. Đối với môi trường bộ nhớ thấp, 20 là một khởi đầu tốt. Cài đặt được khuyến nghị cho tỷ lệ bẩn trên máy chủ cơ sở dữ liệu bộ nhớ lớn là vm.dirty_ratio =15 và vm.dirty_background_ratio =5 hoặc có thể ít hơn.
Để kiểm tra tỷ lệ bẩn chạy:
sysctl -a | grep dirty
Bạn có thể đặt điều này bằng cách thêm các dòng sau vào “/etc/sysctl.conf”:
Sự thích thú
Trên các máy chủ mà MongoDB là dịch vụ duy nhất đang chạy, bạn nên đặt vm.swapiness =1. Cài đặt mặc định được đặt thành 60, không phù hợp với hệ thống cơ sở dữ liệu.
vi /etc/sysctl.conf
vm.swappiness = 1
Các trang lớn trong suốt
Nếu bạn đang chạy MongoDB của mình trên RedHat, hãy đảm bảo rằng Trang khổng lồ trong suốt đã bị tắt.
Bạn có thể kiểm tra điều này bằng dấu phẩy:
cat /proc/sys/vm/nr_hugepages
0
0 có nghĩa là các trang khổng lồ trong suốt bị vô hiệu hóa.
Tùy chọn hệ thống tệp
ext4 rw,seclabel,noatime,data=ordered 0 0
NUMA (Quyền truy cập bộ nhớ không thống nhất)
MongoDB không hỗ trợ NUMA, hãy tắt nó trong BIOS.
Ngăn xếp mạng
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_max_syn_backlog = 4096
Chấp nhận NTP
Để cài đặt máy chủ thời gian NTP quỷ, hãy sử dụng một trong các lệnh hệ thống sau.
#Red Hat
sudo yum install ntp
#Debian
sudo apt-get install ntp
Bạn có thể tìm thêm thông tin chi tiết về hiệu suất hệ điều hành cho MongoDB trong một blog khác.
Giải thích kế hoạch
Tương tự như các hệ thống cơ sở dữ liệu phổ biến khác, MongoDB cung cấp một cơ sở giải thích cho biết cách một hoạt động cơ sở dữ liệu được thực thi. Kết quả giải thích hiển thị các kế hoạch truy vấn dưới dạng cây các giai đoạn. Mỗi giai đoạn chuyển các sự kiện của nó (tức là tài liệu hoặc khóa chỉ mục) đến nút cha. Các nút lá truy cập vào bộ sưu tập hoặc các chỉ số. Bạn có thể thêm giải thích ('executeStats') vào một truy vấn.
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} ).explain('executionStats');
or append it to the collection:
db.inventory.explain('executionStats').find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} );
Các khóa có giá trị mà bạn nên chú ý trong đầu ra của việc thực thi lệnh trên:
- totalKeysExamined:Tổng số mục nhập chỉ mục được quét để trả về truy vấn.
- totalDocsExamined:Tổng số tài liệu được quét để tìm kết quả.
- executeTimeMillis:Tổng thời gian tính bằng mili giây cần thiết để lựa chọn kế hoạch truy vấn và thực thi truy vấn.
Đo hiệu suất độ trễ sao chép
Độ trễ sao chép là độ trễ giữa một hoạt động trên chính và việc áp dụng hoạt động đó từ oplog sang phụ. Nói cách khác, nó xác định khoảng cách nút phụ phía sau nút chính, trong trường hợp tốt nhất, nút này phải càng gần nút chính càng tốt.
Quá trình sao chép có thể bị ảnh hưởng vì nhiều lý do. Một trong những vấn đề chính có thể là các thành viên phụ đang sử dụng hết dung lượng máy chủ. Các hoạt động ghi lớn trên thành viên chính dẫn đến thành viên thứ cấp không thể phát lại các oplog hoặc xây dựng chỉ mục trên thành viên chính.
Để kiểm tra độ trễ sao chép hiện tại, hãy chạy trong trình bao MongoDB:
db.getReplicationInfo()
db.getReplicationInfo()
{
"logSizeMB" : 2157.1845703125,
"usedMB" : 0.05,
"timeDiff" : 4787,
"timeDiffHours" : 1.33,
"tFirst" : "Sun Jul 01 2018 21:40:32 GMT+0000 (UTC)",
"tLast" : "Sun Jul 01 2018 23:00:19 GMT+0000 (UTC)",
"now" : "Sun Jul 01 2018 23:00:26 GMT+0000 (UTC)"
Đầu ra trạng thái sao chép có thể được sử dụng để đánh giá trạng thái hiện tại của quá trình sao chép và xác định xem có bất kỳ sự chậm trễ sao chép ngoài ý muốn nào không.
rs.printSlaveReplicationInfo()
Nó hiển thị thời gian trễ giữa các thành viên phụ đối với thành viên chính.
rs.status()
Nó hiển thị các chi tiết chuyên sâu để nhân rộng. Chúng ta có thể thu thập đủ thông tin về sao chép bằng cách sử dụng các lệnh này. Hy vọng rằng những thủ thuật này cung cấp một cái nhìn tổng quan nhanh chóng về cách đánh giá hiệu suất MongoDB. Hãy cho chúng tôi biết nếu chúng tôi đã bỏ lỡ điều gì.