Kinerja basis data memengaruhi kinerja organisasi, dan kami cenderung ingin mencari perbaikan cepat. Ada banyak cara berbeda untuk meningkatkan kinerja di MongoDB. Di blog ini, kami akan membantu Anda untuk lebih memahami beban kerja database Anda, dan hal-hal yang dapat membahayakannya. Pengetahuan tentang cara menggunakan sumber daya yang terbatas sangat penting bagi siapa saja yang mengelola database produksi.
Kami akan menunjukkan kepada Anda bagaimana mengidentifikasi faktor-faktor yang membatasi kinerja database. Untuk memastikan bahwa database berfungsi seperti yang diharapkan, kami akan memulai dari alat pemantauan Cloud MongoDB gratis. Kemudian kami akan memeriksa cara mengelola file log dan cara memeriksa kueri. Untuk dapat mencapai penggunaan sumber daya perangkat keras yang optimal, kita akan melihat optimasi kernel dan pengaturan OS penting lainnya. Terakhir, kita akan melihat replikasi MongoDB dan cara memeriksa kinerjanya.
Pemantauan Kinerja Gratis
MongoDB memperkenalkan alat pemantauan kinerja gratis di cloud untuk instans mandiri dan set replika. Saat diaktifkan, data yang dipantau diunggah secara berkala ke layanan cloud vendor. Itu tidak memerlukan agen tambahan apa pun, fungsionalitasnya dibangun ke dalam MongoDB 4.0+ yang baru. Prosesnya cukup sederhana untuk diatur dan dikelola. Setelah aktivasi perintah tunggal, Anda akan mendapatkan alamat Web unik untuk mengakses statistik kinerja terbaru Anda. Anda hanya dapat mengakses data yang dipantau yang telah diunggah dalam 24 jam terakhir.
Berikut cara mengaktifkan fitur tersebut. Anda dapat mengaktifkan/menonaktifkan pemantauan gratis selama runtime menggunakan:
-- Enable Free Monitoring
db.enableFreeMonitoring()
-- Disable Free Monitoring
db.disableFreeMonitoring()
Anda juga dapat mengaktifkan atau menonaktifkan pemantauan gratis selama startup mongod menggunakan pengaturan file konfigurasi cloud.monitoring.free.state atau opsi baris perintah --enableFreeMonitoring
db.enableFreeMonitoring()
Setelah aktivasi, Anda akan melihat pesan dengan status sebenarnya.
{
"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
}
Cukup salin/tempel URL dari keluaran status ke browser, dan Anda dapat mulai memeriksa metrik kinerja.
Pemantauan MongoDB Gratis memberikan informasi tentang metrik berikut:
- Waktu Eksekusi Operasi (BACA, TULIS, PERINTAH)
- Utilisasi disk (MAX UTIL % DARI SETIAP DRIVE, RATA-RATA UTIL % DARI SEMUA DRIVE)
- Memori (PENDUDUK, VIRTUAL, PEMETAAN)
- Jaringan - Masukan / Keluaran (BYTES IN, BYTES KELUAR)
- Jaringan - Jumlah Permintaan (NUM PERMINTAAN)
- Penyimpanan (INSERT, QUERY, UPDATE, DELETE, GETMORE, COMMAND)
- Penanganan - Replikasi (INSERT, QUERY, UPDATE, DELETE, GETMORE, COMMAND)
- Penargetan Kueri (DIPILIH / DIKEMBALIKAN, OBJEK YANG DIPILIH / DIKEMBALIKAN)
- Antrian (BACA, PENULIS, TOTAL)
- Penggunaan Cpu Sistem (USER, BAGUS, KERNEL, IOWAIT, IRQ, SOFT IRQ, STEAL, GUEST)
Untuk melihat status layanan pemantauan gratis Anda, gunakan metode berikut:
db.getFreeMonitoringStatus()
ServerStatus dan helper db.serverStatus() juga menyertakan statistik pemantauan gratis di bidang Pemantauan gratis.
Saat menjalankan dengan kontrol akses, pengguna harus memiliki hak istimewa berikut untuk mengaktifkan pemantauan gratis dan mendapatkan status:
{ resource: { cluster : true }, actions: [ "setFreeMonitoring", "checkFreeMonitoringStatus" ] }
Alat ini mungkin merupakan awal yang baik bagi mereka yang kesulitan membaca keluaran status server MongoDB dari baris perintah:
db.serverStatus()
Pemantauan Gratis adalah awal yang baik tetapi memiliki opsi yang sangat terbatas, jika Anda memerlukan alat yang lebih canggih, Anda mungkin ingin memeriksa Manajer Operasi MongoDB atau ClusterControl.
Mencatat operasi basis data
Driver MongoDB dan aplikasi klien dapat mengirim informasi ke file log server. Informasi tersebut tergantung pada jenis acara. Untuk memeriksa pengaturan saat ini, login sebagai admin dan jalankan:
db.getLogComponents()
Pesan log mencakup banyak komponen. Ini untuk memberikan kategorisasi fungsional dari pesan. Untuk setiap komponen, Anda dapat mengatur verbositas log yang berbeda. Daftar komponen saat ini adalah:
ACCESS, COMMAND, CONTROL, FTD, GEO, INDEX, NETWORK, QUERY, REPL_HB, REPL, ROLLBACK, REPL, SHARDING, STORAGE, RECOVERY, JOURNAL, STORAGE, WRITE.
Untuk detail lebih lanjut tentang masing-masing komponen, periksa dokumentasi.
Menangkap kueri - Profiler Basis Data
MongoDB Database Profiler mengumpulkan informasi tentang operasi yang dijalankan terhadap instans mongod. Secara default, profiler tidak mengumpulkan data apa pun. Anda dapat memilih untuk mengumpulkan semua operasi (nilai 2), atau operasi yang membutuhkan waktu lebih lama dari nilai perlambatan . Yang terakhir adalah parameter instan yang dapat dikontrol melalui file konfigurasi mongodb. Untuk memeriksa level saat ini:
db.getProfilingLevel()
Untuk menangkap semua kumpulan kueri:
db.setProfilingLevel(2)
Di file konfigurasi, Anda dapat mengatur:
profile = <0/1/2>
slowms = <value>
Pengaturan ini akan diterapkan pada satu instance dan tidak menyebar ke seluruh kumpulan replika atau cluster bersama, jadi Anda perlu mengulangi perintah ini untuk semua node jika ingin merekam semua aktivitas. Pembuatan profil basis data dapat memengaruhi kinerja basis data. Aktifkan opsi ini hanya setelah mempertimbangkan dengan cermat.
Kemudian untuk daftar 10 terbaru:
db.system.profile.find().limit(10).sort(
{ ts : -1 }
).pretty()
Untuk membuat daftar semua:
db.system.profile.find( { op:
{ $ne : 'command' }
} ).pretty()
Dan untuk daftar koleksi tertentu:
db.system.profile.find(
{ ns : 'mydb.test' }
).pretty()
Pencatatan MongoDB
Lokasi log MongoDB ditentukan dalam pengaturan logpath konfigurasi Anda, dan biasanya /var/log/mongodb/mongod.log. Anda dapat menemukan file konfigurasi MongoDB di /etc/mongod.conf.
Ini contoh datanya:
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
Anda dapat memodifikasi log verbositas komponen dengan menyetel (contoh kueri):
db.setLogLevel(2, "query")
File log bisa menjadi signifikan, jadi Anda mungkin ingin menghapusnya sebelum membuat profil. Dari konsol baris perintah MongoDB, masukkan:
db.runCommand({ logRotate : 1 });
Memeriksa parameter sistem operasi
Batas memori
Untuk melihat batasan yang terkait dengan login Anda, gunakan perintah ulimit -a. Ambang batas dan pengaturan berikut sangat penting untuk penerapan mongod dan 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
Versi yang lebih baru dari skrip startup mongod (/etc/init.d/mongod) memiliki pengaturan default yang dibangun ke dalam opsi mulai:
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
}
Peran subsistem manajemen memori yang juga disebut manajer memori virtual adalah untuk mengelola alokasi memori fisik (RAM) untuk seluruh kernel dan program pengguna. Ini dikendalikan oleh parameter vm.*. Ada dua yang harus Anda pertimbangkan terlebih dahulu untuk menyesuaikan kinerja MongoDB - vm.dirty_ratio dan vm.dirty_background_ratio .
vm.dirty_ratio adalah jumlah maksimum memori sistem yang dapat diisi dengan halaman kotor sebelum semuanya harus dikomit ke disk. Ketika sistem mencapai titik ini, semua I/O baru memblokir hingga halaman kotor telah ditulis ke disk. Ini sering menjadi sumber jeda I/O yang lama. Standarnya adalah 30, yang biasanya terlalu tinggi. vm.dirty_background_ratio adalah persentase memori sistem yang dapat diisi dengan halaman "kotor" — halaman memori yang masih perlu ditulis ke disk. Awal yang baik adalah mulai dari 10 dan mengukur kinerja. Untuk lingkungan memori rendah, 20 adalah awal yang baik. Pengaturan yang disarankan untuk rasio kotor pada server database dengan memori besar adalah vm.dirty_ratio =15 dan vm.dirty_background_ratio =5 atau mungkin kurang.
Untuk memeriksa rasio kotor, jalankan:
sysctl -a | grep dirty
Anda dapat mengatur ini dengan menambahkan baris berikut ke “/etc/sysctl.conf”:
Swappiness
Pada server di mana MongoDB adalah satu-satunya layanan yang berjalan, praktik yang baik adalah menyetel vm.swapiness =1. Setelan default disetel ke 60 yang tidak sesuai untuk sistem basis data.
vi /etc/sysctl.conf
vm.swappiness = 1
Halaman besar yang transparan
Jika Anda menjalankan MongoDB di RedHat, pastikan bahwa Transparent Huge Pages dinonaktifkan.
Ini dapat diperiksa dengan perintah:
cat /proc/sys/vm/nr_hugepages
0
0 berarti halaman besar transparan dinonaktifkan.
Opsi sistem file
ext4 rw,seclabel,noatime,data=ordered 0 0
NUMA (Akses Memori Non-Seragam)
MongoDB tidak mendukung NUMA, nonaktifkan di BIOS.
Tumpukan jaringan
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
Setan NTP
Untuk menginstal NTP time server demon, gunakan salah satu perintah sistem berikut.
#Red Hat
sudo yum install ntp
#Debian
sudo apt-get install ntp
Anda dapat menemukan detail lebih lanjut tentang kinerja OS untuk MongoDB di blog lain.
Jelaskan rencana
Mirip dengan sistem database populer lainnya, MongoDB menyediakan fasilitas menjelaskan yang mengungkapkan bagaimana operasi database dijalankan. Hasil penjelasan menampilkan rencana kueri sebagai pohon tahapan. Setiap tahap melewati acaranya (yaitu dokumen atau kunci indeks) ke simpul induk. Node daun mengakses koleksi atau indeks. Anda dapat menambahkan explain('executionStats') ke kueri.
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/ } ]
} );
Kunci yang nilainya harus Anda perhatikan dalam output dari eksekusi perintah di atas:
- totalKeysExamined:Jumlah total entri indeks yang dipindai untuk mengembalikan kueri.
- totalDocsExamined:Jumlah total dokumen yang dipindai untuk menemukan hasilnya.
- executionTimeMillis:Total waktu dalam milidetik yang diperlukan untuk pemilihan paket kueri dan eksekusi kueri.
Mengukur kinerja jeda replikasi
Replikasi lag adalah penundaan antara operasi pada primer dan penerapan operasi tersebut dari oplog ke sekunder. Dengan kata lain, ini mendefinisikan seberapa jauh sekunder berada di belakang simpul utama, yang dalam skenario kasus terbaik, harus sedekat mungkin dengan 0.
Proses replikasi dapat dipengaruhi karena berbagai alasan. Salah satu masalah utama bisa jadi anggota sekunder kehabisan kapasitas server. Operasi tulis yang besar pada anggota utama menyebabkan anggota sekunder tidak dapat memutar ulang oplog, atau pembuatan indeks pada anggota utama.
Untuk memeriksa jeda replikasi saat ini, jalankan di shell 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)"
Output status replikasi dapat digunakan untuk menilai status replikasi saat ini, dan menentukan apakah ada penundaan replikasi yang tidak diinginkan.
rs.printSlaveReplicationInfo()
Ini menunjukkan waktu tunda antara anggota sekunder sehubungan dengan utama.
rs.status()
Ini menunjukkan detail mendalam untuk replikasi. Kami dapat mengumpulkan informasi yang cukup tentang replikasi dengan menggunakan perintah ini. Semoga tips ini memberikan gambaran singkat tentang cara meninjau kinerja MongoDB. Beri tahu kami jika ada yang terlewat.