Here is a sample code to cleanup MongoDB tasks.

#!/usr/bin/env bash

function do_cleanup() {
  mongo 127.0.0.1:27017/admin \
        --username 'my-username' \
        --password 'my-password' --eval '
  db.currentOp().inprog.forEach(
    function(op) {
      if(op.secs_running > 10 && 
            op.client != null && 
            op.client.startsWith("127.0.0.1:") ) {
        db.killOp(op.opid)
      }
    }
  )
  '
}

while sleep 8
do
  echo "do cleanup"$(date)
  do_cleanup
done;

What Am I Doing Here?

  • I will run "do_cleanup" every 8 seconds
  • I will login to 127.0.0.1:27017, check my current operation
  • I will filter each operation, kill the operations request from 127.0.0.1 and run more than 10 seconds

What Does The "db.currentOp()" Seems Like?

local:PRIMARY> db.currentOp()
{
  "inprog" : [
    {
      "desc" : "conn1379280",
      "threadId" : "139962306003704",
      "connectionId" : 1379280,
      "client" : "127.0.0.1:12345",
      "active" : true,
      "opid" : 1070507339,
      "secs_running" : 0,
      "microsecs_running" : NumberLong(11),
      "op" : "command",
      "ns" : "admin.$cmd",
      "query" : {
        "currentOp" : 1
      },
      "numYields" : 0,
      "locks" : {

      },
      "waitingForLock" : false,
      "lockStats" : {
        "Global" : {
          "acquireCount" : {
            "r" : NumberLong(20),
            "w" : NumberLong(3),
            "R" : NumberLong(1),
            "W" : NumberLong(2)
          }
        },
        "Database" : {
          "acquireCount" : {
            "r" : NumberLong(7),
            "w" : NumberLong(2),
            "W" : NumberLong(1)
          }
        },
        "Collection" : {
          "acquireCount" : {
            "r" : NumberLong(6)
          }
        },
        "Metadata" : {
          "acquireCount" : {
            "w" : NumberLong(1)
          }
        },
        "oplog" : {
          "acquireCount" : {
            "r" : NumberLong(1),
            "w" : NumberLong(2)
          }
        }
      }
    }
  ]
}

We just need to read secs_running in each object listed in inprog, and kill them by id, which is appeared as opid in each object.

Categories: Code

Yu

Ideals are like the stars: we never reach them, but like the mariners of the sea, we chart our course by them.

2 Comments

xqiushi · August 8, 2017 at 21:27

Google Chrome 60.0.3112.90 Google Chrome 60.0.3112.90 Mac OS X  10.13.0 Mac OS X 10.13.0

8秒一次,CPU受得了吗?

    yu · August 9, 2017 at 03:32

    Google Chrome 59.0.3071.115 Google Chrome 59.0.3071.115 Mac OS X  10.12.6 Mac OS X 10.12.6

    @xqiushi 列出任务并删除的执行速度是 ms 级别.

    因此只要花费千分之一的时间来处理它

Leave a Reply

Your email address will not be published.