Periksa jumlah koneksi saat ini ke MongoDb

90

Apa perintah untuk mendapatkan jumlah klien yang terhubung ke server MongoDB tertentu?

DafaDil
sumber

Jawaban:

163

sambungkan ke database admin dan jalankan db.serverStatus():

> var status = db.serverStatus()
> status.connections
   {"current" : 21, "available" : 15979}
> 

Anda bisa langsung mendapatkannya dengan query

db.serverStatus().connections

Untuk memahami apa arti dari db.serverStatus().connectionsrespon MongoDb , baca dokumentasinya di sini .

koneksi

"connections" : {
   "current" : <num>,
   "available" : <num>,
   "totalCreated" : NumberLong(<num>)
},

koneksi Sebuah dokumen yang melaporkan status koneksi. Gunakan nilai-nilai ini untuk menilai kebutuhan beban dan kapasitas server saat ini.

koneksi.current Jumlah koneksi masuk dari klien ke server database. Jumlah ini termasuk sesi shell saat ini. Pertimbangkan nilai koneksi.available untuk menambahkan lebih banyak konteks ke datum ini.

Nilainya akan mencakup semua koneksi masuk termasuk koneksi shell atau koneksi dari server lain, seperti anggota kumpulan replika atau instance mongos.

koneksi.available Jumlah koneksi masuk yang tidak terpakai tersedia. Pertimbangkan nilai ini dalam kombinasi dengan nilai koneksi.current untuk memahami beban koneksi pada database, dan dokumen pengaturan ulimit UNIX untuk informasi selengkapnya tentang ambang sistem pada koneksi yang tersedia.

koneksi.totalCreated Hitungan semua koneksi masuk yang dibuat ke server. Jumlah ini termasuk koneksi yang telah ditutup.

Milan
sumber
25

Hitungan Koneksi oleh ClientIP, dengan Total

Kami menggunakan ini untuk melihat jumlah koneksi dengan IPAddress dengan jumlah koneksi total. Ini sangat membantu dalam men-debug masalah ... sampai di sana sebelum mencapai koneksi maksimal!

Untuk Mongo Shell:

db.currentOp(true).inprog.reduce((accumulator, connection) => { ipaddress = connection.client ? connection.client.split(":")[0] : "Internal"; accumulator[ipaddress] = (accumulator[ipaddress] || 0) + 1; accumulator["TOTAL_CONNECTION_COUNT"]++; return accumulator; }, { TOTAL_CONNECTION_COUNT: 0 })

Diformat:

db.currentOp(true).inprog.reduce(
  (accumulator, connection) => {
    ipaddress = connection.client ? connection.client.split(":")[0] : "Internal";
    accumulator[ipaddress] = (accumulator[ipaddress] || 0) + 1;
    accumulator["TOTAL_CONNECTION_COUNT"]++;
    return accumulator;
  },
  { TOTAL_CONNECTION_COUNT: 0 }
)

Contoh pengembalian:

{
    "TOTAL_CONNECTION_COUNT" : 331,
    "192.168.253.72" : 8,
    "192.168.254.42" : 17,
    "127.0.0.1" : 3,
    "192.168.248.66" : 2,
    "11.178.12.244" : 2,
    "Internal" : 41,
    "3.100.12.33" : 86,
    "11.148.23.34" : 168,
    "81.127.34.11" : 1,
    "84.147.25.17" : 3
}

(alamat 192.xxx di pemantauan internal Atlas)

"Internal" adalah proses internal yang tidak memiliki klien eksternal. Anda dapat melihat daftarnya dengan ini:

db.currentOp(true).inprog.filter(connection => !connection.client).map(connection => connection.desc);
SuperGoTeam
sumber
Bisakah Anda menjelaskan arti IP "Internal" dalam daftar pengembalian?
carton.swing
Saya tidak dapat menjalankan contoh di atas pada contoh atlas mongo: E QUERY [js] TypeError: db.currentOp(...).inprog is undefined :menggunakan pengguna admin
otong
@ carton.swing Saya telah memperbarui jawaban dengan penjelasan dan perintah untuk melihatnya.
SuperGoTeam
@otong apa yang kamu dapatkan kembali db.currentOp(true)?
SuperGoTeam
Sepertinya itu dibantah oleh atlas mongodb: { "ok" : 0, "errmsg" : "Using $all for currentOp is disallowed in this atlas tier", "code" : 8000, "codeName" : "AtlasError" }
otong
19

db.serverStatus()tidak memberikan koneksi opend dan avail tetapi tidak menunjukkan koneksi dari klien mana. Untuk info lebih lanjut Anda bisa menggunakan perintah ini sudo lsof | grep mongod | grep TCP. Saya membutuhkannya ketika saya melakukan replikasi dan simpul utama memiliki banyak koneksi klien yang lebih besar daripada sekunder.

$ sudo lsof | grep mongod | grep TCP
mongod    5733             Al    6u     IPv4 0x08761278       0t0       TCP *:28017 (LISTEN)
mongod    5733             Al    7u     IPv4 0x07c7eb98       0t0       TCP *:27017 (LISTEN)
mongod    5733             Al    9u     IPv4 0x08761688       0t0       TCP 192.168.1.103:27017->192.168.1.103:64752 (ESTABLISHED)
mongod    5733             Al   12u     IPv4 0x08761a98       0t0       TCP 192.168.1.103:27017->192.168.1.103:64754 (ESTABLISHED)
mongod    5733             Al   13u     IPv4 0x095fa748       0t0       TCP 192.168.1.103:27017->192.168.1.103:64770 (ESTABLISHED)
mongod    5733             Al   14u     IPv4 0x095f86c8       0t0       TCP 192.168.1.103:27017->192.168.1.103:64775 (ESTABLISHED)
mongod    5733             Al   17u     IPv4 0x08764748       0t0       TCP 192.168.1.103:27017->192.168.1.103:64777 (ESTABLISHED)

Ini menunjukkan bahwa saat ini saya memiliki lima koneksi yang terbuka ke port MongoDB (27017) di komputer saya. Dalam kasus saya, saya terhubung ke MongoDB dari server Scalatra, dan saya menggunakan driver MongoDB Casbah, tetapi Anda akan melihat koneksi TCP lsof yang sama terlepas dari klien yang digunakan (selama mereka terhubung menggunakan TCP / AKU P).

Hitesh Mundra
sumber
1
Perintah ini mengembalikan beberapa entri untuk satu koneksi: stackoverflow.com/a/42930337/1843751
menyalakan
3
Saya sarankan menggunakan flag -i untuk lsof. Kemudian Anda hanya mendapatkan 1 entri setiap koneksi dan tidak perlu grep untuk TCP. yaitusudo lsof -i | grep mongod
datdo
7

Saya mencoba melihat semua koneksi untuk database mongo dengan mengikuti perintah.

netstat -anp --tcp --udp | grep mongo

Perintah ini dapat menampilkan setiap koneksi tcp untuk mongodb secara lebih detail.

tcp        0      0 10.26.2.185:27017           10.26.2.1:2715              ESTABLISHED 1442/./mongod       
tcp        0      0 10.26.2.185:27017           10.26.2.1:1702              ESTABLISHED 1442/./mongod  
tcp        0      0 10.26.2.185:27017           10.26.2.185:39506           ESTABLISHED 1442/./mongod       
tcp        0      0 10.26.2.185:27017           10.26.2.185:40021           ESTABLISHED 1442/./mongod       
tcp        0      0 10.26.2.185:27017           10.26.2.185:39509           ESTABLISHED 1442/./mongod 
tcp        0      0 10.26.2.185:27017           10.26.2.184:46062           ESTABLISHED 1442/./mongod       
tcp        0      0 10.26.2.185:27017           10.26.2.184:46073           ESTABLISHED 1442/./mongod       
tcp        0      0 10.26.2.185:27017           10.26.2.184:46074           ESTABLISHED 1442/./mongod   
Kyaw Min Thu L
sumber
7

Di OS X, lihat juga koneksinya langsung di antarmuka jaringan, lakukan saja :

$ lsof -n -i4TCP:27017

mongod     2191 inanc    7u  IPv4 0xab6d9f844e21142f  0t0  TCP 127.0.0.1:27017 (LISTEN)
mongod     2191 inanc   33u  IPv4 0xab6d9f84604cd757  0t0  TCP 127.0.0.1:27017->127.0.0.1:56078 (ESTABLISHED)
stores.te 18704 inanc    6u  IPv4 0xab6d9f84604d404f  0t0  TCP 127.0.0.1:56078->127.0.0.1:27017 (ESTABLISHED)
  • Tidak perlu menggunakan grepdll, cukup gunakan lsofargumennya.

  • Juga lihat koneksi di CLI MongoDb, lihat jawaban @ milan ( yang baru saja saya edit ).

Inanc Gumus
sumber
7

Anda bisa menggunakan

db.serverStatus().connections

Selain itu, fungsi ini dapat membantu Anda menemukan alamat IP yang terhubung ke Mongo DB Anda

db.currentOp(true).inprog.forEach(function(x) { print(x.client) })
nixsix6
sumber
1
Benar-benar cantik - terima kasih! Persis apa yang saya cari.
ProsperousHeart
4

Juga beberapa detail lebih lanjut tentang koneksi dengan: db.currentOp(true)

Diambil dari: https://jira.mongodb.org/browse/SERVER-5085

mitsos1os
sumber
Saya telah membaca pikiran semua jawaban dan tiba-tiba - ini adalah salah satu yang paling membantu. Kueri memberikan banyak detail internal seperti yang seharusnya, termasuk waktu koneksi, tabel saat ini, versi dan platform driver, dan bahkan appName jika ditentukan
Dmitry Gusarov
2

Hubungkan ke MongoDB menggunakan mongo-shell dan jalankan perintah berikut.

db.serverStatus().connections

misalnya:

mongo> db.serverStatus().connections
{ "current" : 3, "available" : 816, "totalCreated" : NumberLong(1270) }
Thushan
sumber
2

db.runCommand ({"connPoolStats": 1})

{
    "numClientConnections" : 0,
    "numAScopedConnections" : 0,
    "totalInUse" : 0,
    "totalAvailable" : 0,
    "totalCreated" : 0,
    "hosts" : {

    },
    "replicaSets" : {

    },
    "ok" : 1
}
arnav
sumber
Sangat menarik, saya juga menerima nilai NOL untuk permintaan itu, bukan itu yang saya inginkan :) MongoMonitoringController : { "numClientConnections" : 0 , "numAScopedConnections" : 0 , "totalInUse" : 0 , "totalAvailable" : 0 , "totalCreated" : 0 , "totalRefreshing" : 0 , "pools" : { } , "hosts" : { } , "replicaSets" : { } , "ok" : 1.0}
Alex Efimov
2

Maaf karena ini adalah posting lama dan saat ini ada lebih banyak pilihan daripada sebelumnya.

db.getSiblingDB("admin").aggregate( [
   { $currentOp: { allUsers: true, idleConnections: true, idleSessions: true } }
  ,{$project:{
            "_id":0
           ,client:{$arrayElemAt:[ {$split:["$client",":"]}, 0 ] }
           ,curr_active:{$cond:[{$eq:["$active",true]},1,0]}
           ,curr_inactive:{$cond:[{$eq:["$active",false]},1,0]}
           }
   }
  ,{$match:{client:{$ne: null}}}
  ,{$group:{_id:"$client",curr_active:{$sum:"$curr_active"},curr_inactive:{$sum:"$curr_inactive"},total:{$sum:1}}}
  ,{$sort:{total:-1}}
] )

Contoh keluaran:

{ "_id" : "xxx.xxx.xxx.78", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.76", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.73", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.77", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.74", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.75", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.58", "curr_active" : 0, "curr_inactive" : 510, "total" : 510 }
{ "_id" : "xxx.xxx.xxx.57", "curr_active" : 0, "curr_inactive" : 459, "total" : 459 }
{ "_id" : "xxx.xxx.xxx.55", "curr_active" : 0, "curr_inactive" : 459, "total" : 459 }
{ "_id" : "xxx.xxx.xxx.56", "curr_active" : 0, "curr_inactive" : 408, "total" : 408 }
{ "_id" : "xxx.xxx.xxx.47", "curr_active" : 1, "curr_inactive" : 11, "total" : 12 }
{ "_id" : "xxx.xxx.xxx.48", "curr_active" : 1, "curr_inactive" : 7, "total" : 8 }
{ "_id" : "xxx.xxx.xxx.51", "curr_active" : 0, "curr_inactive" : 8, "total" : 8 }
{ "_id" : "xxx.xxx.xxx.46", "curr_active" : 0, "curr_inactive" : 8, "total" : 8 }
{ "_id" : "xxx.xxx.xxx.52", "curr_active" : 0, "curr_inactive" : 6, "total" : 6 }
{ "_id" : "127.0.0.1", "curr_active" : 1, "curr_inactive" : 0, "total" : 1 }
{ "_id" : "xxx.xxx.xxx.3", "curr_active" : 0, "curr_inactive" : 1, "total" : 1 }
JuanM
sumber
1

Hubungkan dengan instance mongodb Anda dari sistem lokal

  1. sudo mongo "mongodb: // MONGO_HOST_IP: 27017" --authenticationDatabase admin

Ini akan memberi tahu Anda semua klien yang terhubung dan detailnya

  1. db.currentOp (benar)

Shree Prakash
sumber
0

Atau Anda dapat memeriksa status koneksi dengan masuk ke Mongo Atlas dan kemudian menavigasi ke cluster Anda.

masukkan deskripsi gambar di sini

localhost
sumber