Linux: Which directory has the most files?

An inode is used for every file in the filesystem. If the system is running out of inodes that means there are some directories with a lot of files in them.

The following command will find the directories with most files.

find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

The following command list free inodes on all filesystems

df -hi

 

MongoDB current operations and profiling

Current operations

db.currentOp()

Operations running for over 5 seconds…

db.currentOp().inprog.forEach(function(op) {
    if (op.secs_running > 5) printjson(op);
})

Write operations waiting for a lock

db.currentOp(
  {
    "waitingForLock" : true,
    $or: [
      { "op" : { "$in" : [ "insert", "update", "remove" ] } },
      { "query.findandmodify": { $exists: true } }
    ]
  }
)

Operations that have never yielded

db.currentOp(
   {
     "active" : true,
     "numYields" : 0,
     "waitingForLock" : false
   }
)

Index creation operations

db.currentOp(
    {
      $or: [
        { op: "query", "query.createIndexes": { $exists: true } },
        { op: "insert", ns: /\.system\.indexes\b/ }
      ]
    }
)

Profiling Levels

  • 0 – the profiler is off, does not collect any data.
  • 1 – collects profiling data for slow operations only.
  • 2 – collects profiling data for all database operations.

Checking profiling level

db.getProfilingStatus()

Turn on profiling for operations taking more than 1 second (1000 milliseconds)

db.setProfilingLevel(1,1000)

Turn profiling off

db.setProfilingLevel(0)

5 most recent operations logged in the system.profile table

db.system.profile.find().limit(5).sort( { ts : -1 } ).pretty()

Recent operations that took longer than 5 seconds

db.system.profile.find( { millis : { $gt : 5000 } } ).pretty()

Ten recent operations that took over 15 seconds. Print only important fields.

db.system.profile.find({
 millis: {
 $gt: 15000
 }
}, {
 ns: 1,
 query: 1,
 numYield: 1,
 millis: 1
}).limit(10).pretty();

More examples:

db.system.profile.find({
 millis: {
 $gt: 5000
 },
 ts: {
 $gt: new Date(ISODate().getTime() - 1000 * 60 * 10)
 }
}).limit(5).pretty();

db.system.profile.find({
 millis: {
 $gt: 5000
 },
 ts: {
 $gt: new Date(ISODate().getTime() - 1000 * 60 * 10)
 }
}, {
 op: 1,
 ns: 1,
 query: 1,
 numYield: 1,
 millis: 1,
 ts: 1
}).limit(5).pretty();

To change the size of the system.profile collection, you must:

  1. Disable profiling.
  2. Drop the system.profile collection.
  3. Create a new system.profile collection.
  4. Re-enable profiling.

To create a new system.profile collections that’s 4000000 bytes, use the following sequence of operations

db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)

Running MongoDB 2 and 3 on the same computer

Manually install (untar) MongoDB 2 and 3 into two different folders, for example

.../mongodb2
.../mongodb3

Create log and data folders for each version

.../mongodb2/log
.../mongodb2/data 
.../mongodb3/log
.../mongodb3/data

Create a conf file for each version.

.../mongodb2/data/mongod.conf
.../mongodb3/data/mongod.conf

Contents of these files can be something like

logpath=.../mongodb2/log/mongod.log
port=27017
dbpath=.../mongodb2/data
pidfilepath=.../mongodb2/mongod.pid

logpath=.../mongodb3/log/mongod.log
port=37017
dbpath=.../mongodb3/data
pidfilepath=.../mongodb3/mongod.pid

As you can see here, MongoDB 2 will be running on port 27017 and MongoDB 3 will be running on port 37017

No start each server with the following commands

.../mongodb2/bin/mongod  --config .../mongodb2/mongod.conf
.../mongodb3/bin/mongod  --config .../mongodb3/mongod.conf

That’s it 🙂

Two different command line clients can be run as follows

.../mongodb2/bin/mongo --port 27017
.../mongodb3/bin/mongo --port 37017