Slide 1

Slide 1 text

Diagnostics and Performance Tuning Dan Crosta, 10gen dcrosta@10gen.com @lazlofruvous

Slide 2

Slide 2 text

Agenda •Tools •Performance Indicators

Slide 3

Slide 3 text

Speed MongoDB is a high-performance database, but how do I know that I’m getting the best performance

Slide 4

Slide 4 text

TOOLS

Slide 5

Slide 5 text

1. mongostat

Slide 6

Slide 6 text

2.serverStatus > db.serverStatus(); { ! ! "host" : “MacBook.local", "version" : "2.0.1", "process" : "mongod", "uptime" : 619052, // Lots more stats... }

Slide 7

Slide 7 text

3.Profiler > db.setProfilingLevel(2); { "was" : 0, "slowms" : 100, "ok" : 1 }

Slide 8

Slide 8 text

3.Profiler > db.system.profile.find() { "ts" : ISODate("2011-09-30T02:07:11.370Z"), "op" : "query", "ns" : "docs.spreadsheets", "query" : { "username": "dcrosta" }, "nscanned" : 20001, "nreturned" : 1, "responseLength" : 241, "millis" : 1407, "client" : "127.0.0.1", "user" : "" }

Slide 9

Slide 9 text

4.Monitoring Service • MMS: 10gen.com/try-mms • Nagios • Munin

Slide 10

Slide 10 text

INDICATORS

Slide 11

Slide 11 text

1.Slow Operations Sun May 22 19:01:47 [conn10] query docs.spreadsheets ntoreturn:100 reslen:510436 nscanned:19976 { username: “dcrosta”} nreturned:100 147ms

Slide 12

Slide 12 text

2.Replication Lag PRIMARY> rs.status() { "set" : "replSet", "date" : ISODate("2011-09-30T02:28:21Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "MacBook.local:30001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "optime" : { "t" : 1317349400000, "i" : 1 }, "optimeDate" : ISODate("2011-09-30T02:23:20Z"), "self" : true }, { "_id" : 1, "name" : "MacBook.local:30002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 302, "optime" : { "t" : 1317349400000, "i" : 1 }, "optimeDate" : ISODate("2011-09-28T10:17:47Z"), "lastHeartbeat" : ISODate("2011-09-30T02:28:19Z"),

Slide 13

Slide 13 text

3.Resident Memory > db.serverStatus().mem { "bits" : 64, // Need 64, not 32 "resident" : 7151, // Physical memory "virtual" : 14248, // Files + heap "mapped" : 6942 // Data files

Slide 14

Slide 14 text

3.Resident Memory > db.stats() { "db" : "docs", "collections" : 3, "objects" : 805543, "avgObjSize" : 5107.312096312674, "dataSize" : 4114159508, // ~4GB "storageSize" : 4282908160, // ~4GB "numExtents" : 33, "indexes" : 3, "indexSize" : 126984192, // ~126MB "fileSize" : 8519680000, // ~8.5GB "ok" : 1 }

Slide 15

Slide 15 text

3.Resident Memory ! ! indexSize + dataSize <= RAM

Slide 16

Slide 16 text

4.Page Faults > db.serverStatus().extra_info { ! "note" : "fields vary by platform", ! “heap_usage_bytes” : 210656, ! “page_faults” : 2381 }

Slide 17

Slide 17 text

5.Write Lock Percentage > db.serverStatus().globalLock { "totalTime" : 2809217799, "lockTime" : 13416655, "ratio" : 0.004775939766854653, }

Slide 18

Slide 18 text

Concurrency • One writer or many readers • Global RW Lock • Yields on long-running ops and if we’re likely to go to disk.

Slide 19

Slide 19 text

High Lock Percentage? You’re Probably Paging!

Slide 20

Slide 20 text

6.Reader and Writer Queues > db.serverStatus().globalLock { "totalTime" : 2809217799, "lockTime" : 13416655, "ratio" : 0.004775939766854653, "currentQueue" : { "total" : 1, "readers" : 1, "writers" : 0 }, "activeClients" : { "total" : 2, "readers" : 1, "writers" : 1 }

Slide 21

Slide 21 text

6.Reader and Writer Queues > db.currentOp() { "inprog" : [ { "opid" : 6996, "active" : true, "lockType" : "read", "waitingForLock" : true, "secs_running" : 1, "op" : "query", "ns" : "docs.spreadsheets", "query" : { “username” : “Hackett, Bernie” }, "client" : "10.71.194.111:51015", "desc" : "conn", "threadId" : "0x152693000", "numYields" : 0 },

Slide 22

Slide 22 text

7.Background Flushing > db.serverStatus().backgroundFlushing { "flushes" : 5634, "total_ms" : 83556, "average_ms" : 14.830670926517572, "last_ms" : 4, "last_finished" : ISODate("2011-09-30T03:30:59.052Z") }

Slide 23

Slide 23 text

Disk Considerations • Raid • SSD • SAN?

Slide 24

Slide 24 text

8.Connections > db.serverStatus().connections { "current" : 7, "available" : 19993 }

Slide 25

Slide 25 text

9.Network Speed > db.serverStatus().network { "bytesIn" : 877291, "bytesOut" : 846300, "numRequests" : 9186 }

Slide 26

Slide 26 text

10.Fragmentation db.spreadsheets.stats() { "ns" : "docs.spreadhseets", "size" : 8200046932, // ~8GB "storageSize" : 11807223808, // ~11GB "paddingFactor" : 1.4302, "totalIndexSize" : 345964544, // ~345MB "indexSizes" : { "_id_" : 66772992, “username_1_filename_1” : 146079744, “username_1_updated_at_1” : 133111808 }, "ok" : 1 }

Slide 27

Slide 27 text

10.Fragmentation 2 is the Magic Number

Slide 28

Slide 28 text

storageSize / size > 2 • Might not be reclaiming free space fast enough • Padding factor might not be correctly calibrated db.spreadsheets.runCommand(“compact”)

Slide 29

Slide 29 text

paddingFactor > 2 • You might have the wrong data model • You might be growing documents too much • Should review Schema Design

Slide 30

Slide 30 text

download at mongoDB.org

Slide 31

Slide 31 text

We’re Hiring Engineers, Sales, Evangelist, Marketing, Support, Developers @mongodb_jobs http://linkd.in/joinmongo

Slide 32

Slide 32 text

We’re Always Around For Conferences, Appearances and Meetups 10gen.com/events @mongodb h2p://bit.ly/mongo8