Mongodb

追踪 noTimeout 游標的起源

  • August 7, 2015

我目前正在管理一個有多個應用程序使用它的 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中。

引用自:https://dba.stackexchange.com/questions/74029