Это может быть немного сложно, но тот факт, что оболочка MongoDB является в основном интерпретатором Javascript, дает нам достойные варианты с точки зрения фильтрации. Вот функция, которую я использую для достижения этой цели:
// kills long running ops in MongoDB (taking seconds as an arg to define "long")
// attempts to be a bit safer than killing all by excluding replication related operations
// and only targeting queries as opposed to commands etc.
killLongRunningOps = function(maxSecsRunning) {
currOp = db.currentOp();
for (oper in currOp.inprog) {
op = currOp.inprog[oper-0];
if (op.secs_running > maxSecsRunning && op.op == "query" && !op.ns.startsWith("local")) {
print("Killing opId: " + op.opid
+ " running over for secs: "
+ op.secs_running);
db.killOp(op.opid);
}
}
};
Это убьет только запросы, превышающие maxSecsRunning
пороговое значение, и не коснется ничего, работающего с local
базой данных, которая находится там, где oplog
живет (и, следовательно, является базой данных, которая участвует в длительных операциях репликации. Относительно легко добавить критерии к внутреннему if
условному условию). более точно нацеливать операции по мере необходимости на основе конкретных потребностей.
Код также доступен в виде суть (где я буду помнить, чтобы обновить его на постоянной основе).
db.currentOp()
в нашей защищенной базе данных возвращает операции в «» пространстве имен (aka ns: »), которые очень долго выполняются с деск« repl writer worker n »(где n - целое число). Я хотел бы предложить занести в белый список пространства имен для ваших реальных баз данных с запросами, которые вы, возможно, захотите убить. Нечто подобное&& (['users', 'analytics'].indexOf(op.ns) != -1)
вместо!op.ns.startsWith
состояния.