Mongodb
追踪 noTimeout 游標的起源
我目前正在管理一個有多個應用程序使用它的 Mongo 數據庫實例。它一直在積累 noTimeout 游標,雖然如果它們開始變得不堪重負,很容易將它們剔除,但這是對記憶體的浪費,我想追查罪魁禍首過程。
有沒有辦法查看 noTimeout 游標的來源?任何資訊,無論是原始查詢、它所在的集合,甚至是剩餘的數據,都將非常有用。
根據這些文件,似乎我可以在游標上獲得的唯一資訊是
db.serverStatus().metrics.cursor
並且僅包括游標的計數,而不是有關單個游標的任何數據。有沒有辦法獲取更多資訊?
如果這不適合 DBA,我深表歉意,對於 SO 來說,這似乎不是正確的問題,而且似乎過於專注於 ServerFault 的開發。如果這是一個問題,請告訴我。
我最終使用了這個命令:
mongo --quiet --eval "var c=new Mongo();var o=[];db.adminCommand('listDatabases').databases.forEach(function(d){o=o.concat(c.getDB(d.name).currentOp(true).inprog.filter(function(d){return d.op=='query';}).map(function(d){return d.query;}));});o" > cursor.json
裡面實際js的展開形式是
var conn = new Mongo(); var cursorInfo = []; db.adminCommand('listDatabases').databases.forEach(function(d) { var database = conn.getDB(d.name) cursorInfo = cursorInfo.concat(database.currentOp(true).inprog.filter(function(d) { return d.op == 'query'; }).map(function(d) { return d.query; })); }); cursorInfo
該命令將從
db.currentOp(true).inprog
每個數據庫的目前查詢游標中獲取資訊並將其保存到文件cursor.json
中。