00001 // snapshots.h 00002 00019 #pragma once 00020 #include "../../pch.h" 00021 #include "../jsobj.h" 00022 #include "top.h" 00023 #include "../../util/background.h" 00024 00028 namespace mongo { 00029 00030 class SnapshotThread; 00031 00036 class SnapshotData { 00037 void takeSnapshot(); 00038 00039 unsigned long long _created; 00040 Top::CollectionData _globalUsage; 00041 unsigned long long _totalWriteLockedTime; // micros of total time locked 00042 Top::UsageMap _usage; 00043 00044 friend class SnapshotThread; 00045 friend class SnapshotDelta; 00046 friend class Snapshots; 00047 }; 00048 00052 class SnapshotDelta { 00053 public: 00054 SnapshotDelta( const SnapshotData& older , const SnapshotData& newer ); 00055 00056 unsigned long long start() const { 00057 return _older._created; 00058 } 00059 00060 unsigned long long elapsed() const { 00061 return _elapsed; 00062 } 00063 00064 unsigned long long timeInWriteLock() const { 00065 return _newer._totalWriteLockedTime - _older._totalWriteLockedTime; 00066 } 00067 double percentWriteLocked() const { 00068 double e = (double) elapsed(); 00069 double w = (double) timeInWriteLock(); 00070 return w/e; 00071 } 00072 00073 Top::CollectionData globalUsageDiff(); 00074 Top::UsageMap collectionUsageDiff(); 00075 00076 private: 00077 const SnapshotData& _older; 00078 const SnapshotData& _newer; 00079 00080 unsigned long long _elapsed; 00081 }; 00082 00083 class Snapshots { 00084 public: 00085 Snapshots(int n=100); 00086 00087 const SnapshotData* takeSnapshot(); 00088 00089 int numDeltas() const { return _stored-1; } 00090 00091 const SnapshotData& getPrev( int numBack = 0 ); 00092 auto_ptr<SnapshotDelta> computeDelta( int numBack = 0 ); 00093 00094 00095 void outputLockInfoHTML( stringstream& ss ); 00096 private: 00097 mongo::mutex _lock; 00098 int _n; 00099 boost::scoped_array<SnapshotData> _snapshots; 00100 int _loc; 00101 int _stored; 00102 }; 00103 00104 class SnapshotThread : public BackgroundJob { 00105 public: 00106 virtual string name() const { return "snapshot"; } 00107 void run(); 00108 }; 00109 00110 extern Snapshots statsSnapshots; 00111 extern SnapshotThread snapshotThread; 00112 00113 00114 }