summaryrefslogtreecommitdiff
path: root/db/stats/snapshots.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'db/stats/snapshots.cpp')
-rw-r--r--db/stats/snapshots.cpp121
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;
}