web-dev-qa-db-ja.com

noTimeoutカーソルの原点をトレースする

現在、複数のアプリケーションが使用しているMongoDBインスタンスを管理しています。 noTimeoutカーソルが蓄積されており、カーソルが圧倒され始めた場合は簡単にカリングできますが、メモリの浪費であるため、原因のプロセスを追跡したいと思います。

NoTimeoutカーソルの原点を表示する方法はありますか?元のクエリ、それが含まれているコレクション、または残っているデータであるかどうかにかかわらず、あらゆる情報が非常に役立ちます。

これらのドキュメント によると、カーソルで取得できる情報はdb.serverStatus().metrics.cursorのみであり、カーソルの数のみが含まれ、個々のカーソルに関するデータは含まれていないようです。

追加情報を取得する方法はありますか?

これがDBAに適していない場合は、お詫び申し上げます。SOの質問としては適切ではなく、ServerFaultの開発に重点を置いているようです。これが問題であるかどうかをお知らせください。 。

2
Mike Precup

私はこのコマンドを使用することになりました:

_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_に保存します。

2
Mike Precup