diff options
Diffstat (limited to 'db/stats/snapshots.cpp')
-rw-r--r-- | db/stats/snapshots.cpp | 121 |
1 files changed, 62 insertions, 59 deletions
diff --git a/db/stats/snapshots.cpp b/db/stats/snapshots.cpp index 3ce80ca..a81568d 100644 --- a/db/stats/snapshots.cpp +++ b/db/stats/snapshots.cpp @@ -27,28 +27,27 @@ handles snapshotting performance metrics and other such things */ namespace mongo { - void SnapshotData::takeSnapshot(){ - _created = curTimeMicros64(); - _globalUsage = Top::global.getGlobalData(); + void SnapshotData::takeSnapshot() { + _created = curTimeMicros64(); + _globalUsage = Top::global.getGlobalData(); _totalWriteLockedTime = dbMutex.info().getTimeLocked(); Top::global.cloneMap(_usage); } SnapshotDelta::SnapshotDelta( const SnapshotData& older , const SnapshotData& newer ) - : _older( older ) , _newer( newer ) - { + : _older( older ) , _newer( newer ) { assert( _newer._created > _older._created ); _elapsed = _newer._created - _older._created; - + } - - Top::CollectionData SnapshotDelta::globalUsageDiff(){ + + Top::CollectionData SnapshotDelta::globalUsageDiff() { return Top::CollectionData( _older._globalUsage , _newer._globalUsage ); } - Top::UsageMap SnapshotDelta::collectionUsageDiff(){ + Top::UsageMap SnapshotDelta::collectionUsageDiff() { Top::UsageMap u; - - for ( Top::UsageMap::const_iterator i=_newer._usage.begin(); i != _newer._usage.end(); i++ ){ + + for ( Top::UsageMap::const_iterator i=_newer._usage.begin(); i != _newer._usage.end(); i++ ) { Top::UsageMap::const_iterator j = _older._usage.find(i->first); if (j != _older._usage.end()) u[i->first] = Top::CollectionData( j->second , i->second ); @@ -62,8 +61,8 @@ namespace mongo { , _loc(0) , _stored(0) {} - - const SnapshotData* Snapshots::takeSnapshot(){ + + const SnapshotData* Snapshots::takeSnapshot() { scoped_lock lk(_lock); _loc = ( _loc + 1 ) % _n; _snapshots[_loc].takeSnapshot(); @@ -72,7 +71,7 @@ namespace mongo { return &_snapshots[_loc]; } - auto_ptr<SnapshotDelta> Snapshots::computeDelta( int numBack ){ + auto_ptr<SnapshotDelta> Snapshots::computeDelta( int numBack ) { scoped_lock lk(_lock); auto_ptr<SnapshotDelta> p; if ( numBack < numDeltas() ) @@ -80,43 +79,43 @@ namespace mongo { return p; } - const SnapshotData& Snapshots::getPrev( int numBack ){ + const SnapshotData& Snapshots::getPrev( int numBack ) { int x = _loc - numBack; if ( x < 0 ) x += _n; return _snapshots[x]; } - void Snapshots::outputLockInfoHTML( stringstream& ss ){ + void Snapshots::outputLockInfoHTML( stringstream& ss ) { scoped_lock lk(_lock); ss << "\n<div>"; - for ( int i=0; i<numDeltas(); i++ ){ + for ( int i=0; i<numDeltas(); i++ ) { SnapshotDelta d( getPrev(i+1) , getPrev(i) ); unsigned e = (unsigned) d.elapsed() / 1000; ss << (unsigned)(100*d.percentWriteLocked()); - if( e < 3900 || e > 4100 ) + if( e < 3900 || e > 4100 ) ss << '(' << e / 1000.0 << "s)"; ss << ' '; } ss << "</div>\n"; } - void SnapshotThread::run(){ + void SnapshotThread::run() { Client::initThread("snapshotthread"); Client& client = cc(); long long numLoops = 0; - + const SnapshotData* prev = 0; - while ( ! inShutdown() ){ + while ( ! inShutdown() ) { try { const SnapshotData* s = statsSnapshots.takeSnapshot(); - - if ( prev ){ + + if ( prev ) { unsigned long long elapsed = s->_created - prev->_created; - if ( cmdLine.cpu ){ + if ( cmdLine.cpu ) { SnapshotDelta d( *prev , *s ); log() << "cpu: elapsed:" << (elapsed/1000) <<" writelock: " << (int)(100*d.percentWriteLocked()) << "%" << endl; } @@ -125,14 +124,14 @@ namespace mongo { prev = s; } - catch ( std::exception& e ){ + catch ( std::exception& e ) { log() << "ERROR in SnapshotThread: " << e.what() << endl; } - + numLoops++; sleepsecs(4); } - + client.shutdown(); } @@ -140,15 +139,15 @@ namespace mongo { class WriteLockStatus : public WebStatusPlugin { public: - WriteLockStatus() : WebStatusPlugin( "write lock" , 51 , "% time in write lock, by 4 sec periods" ){} - virtual void init(){} + WriteLockStatus() : WebStatusPlugin( "write lock" , 51 , "% time in write lock, by 4 sec periods" ) {} + virtual void init() {} - virtual void run( stringstream& ss ){ + virtual void run( stringstream& ss ) { statsSnapshots.outputLockInfoHTML( ss ); ss << "<a " - "href=\"http://www.mongodb.org/pages/viewpage.action?pageId=7209296\" " - "title=\"snapshot: was the db in the write lock when this page was generated?\">"; + "href=\"http://www.mongodb.org/pages/viewpage.action?pageId=7209296\" " + "title=\"snapshot: was the db in the write lock when this page was generated?\">"; ss << "write locked now:</a> " << (dbMutex.info().isLocked() ? "true" : "false") << "\n"; } @@ -156,22 +155,26 @@ namespace mongo { class DBTopStatus : public WebStatusPlugin { public: - DBTopStatus() : WebStatusPlugin( "dbtop" , 50 , "(occurences|percent of elapsed)" ){} + DBTopStatus() : WebStatusPlugin( "dbtop" , 50 , "(occurences|percent of elapsed)" ) {} - void display( stringstream& ss , double elapsed , const Top::UsageData& usage ){ + void display( stringstream& ss , double elapsed , const Top::UsageData& usage ) { ss << "<td>"; ss << usage.count; ss << "</td><td>"; double per = 100 * ((double)usage.time)/elapsed; - ss << setprecision(1) << fixed << per << "%"; + if( per == (int) per ) + ss << (int) per; + else + ss << setprecision(1) << fixed << per; + ss << '%'; ss << "</td>"; } - void display( stringstream& ss , double elapsed , const string& ns , const Top::CollectionData& data ){ - if ( ns != "GLOBAL" && data.total.count == 0 ) + void display( stringstream& ss , double elapsed , const string& ns , const Top::CollectionData& data ) { + if ( ns != "TOTAL" && data.total.count == 0 ) return; ss << "<tr><th>" << ns << "</th>"; - + display( ss , elapsed , data.total ); display( ss , elapsed , data.readLock ); @@ -182,43 +185,43 @@ namespace mongo { display( ss , elapsed , data.insert ); display( ss , elapsed , data.update ); display( ss , elapsed , data.remove ); - + ss << "</tr>\n"; } - void run( stringstream& ss ){ + void run( stringstream& ss ) { auto_ptr<SnapshotDelta> delta = statsSnapshots.computeDelta(); if ( ! delta.get() ) return; - + ss << "<table border=1 cellpadding=2 cellspacing=0>"; ss << "<tr align='left'><th>"; - ss << a("http://www.mongodb.org/display/DOCS/Developer+FAQ#DeveloperFAQ-What%27sa%22namespace%22%3F", "namespace") << - "NS</a></th>" - "<th colspan=2>total</th>" - "<th colspan=2>Reads</th>" - "<th colspan=2>Writes</th>" - "<th colspan=2>Queries</th>" - "<th colspan=2>GetMores</th>" - "<th colspan=2>Inserts</th>" - "<th colspan=2>Updates</th>" - "<th colspan=2>Removes</th>"; + ss << a("http://www.mongodb.org/display/DOCS/Developer+FAQ#DeveloperFAQ-What%27sa%22namespace%22%3F", "namespace") << + "NS</a></th>" + "<th colspan=2>total</th>" + "<th colspan=2>Reads</th>" + "<th colspan=2>Writes</th>" + "<th colspan=2>Queries</th>" + "<th colspan=2>GetMores</th>" + "<th colspan=2>Inserts</th>" + "<th colspan=2>Updates</th>" + "<th colspan=2>Removes</th>"; ss << "</tr>\n"; - - display( ss , (double) delta->elapsed() , "GLOBAL" , delta->globalUsageDiff() ); - + + display( ss , (double) delta->elapsed() , "TOTAL" , delta->globalUsageDiff() ); + Top::UsageMap usage = delta->collectionUsageDiff(); - for ( Top::UsageMap::iterator i=usage.begin(); i != usage.end(); i++ ){ + for ( Top::UsageMap::iterator i=usage.begin(); i != usage.end(); i++ ) { display( ss , (double) delta->elapsed() , i->first , i->second ); } - + ss << "</table>"; - + } - virtual void init(){} + virtual void init() {} } dbtopStatus; Snapshots statsSnapshots; - SnapshotThread snapshotThread; + SnapshotThread snapshotThread; } |