rippled
Loading...
Searching...
No Matches
LoadMonitor.cpp
1#include <xrpl/basics/Log.h>
2#include <xrpl/basics/UptimeClock.h>
3#include <xrpl/core/LoadMonitor.h>
4
5namespace xrpl {
6
7/*
8
9TODO
10----
11
12- Use Journal for logging
13
14*/
15
16//------------------------------------------------------------------------------
17
18LoadMonitor::Stats::Stats() : count(0), latencyAvg(0), latencyPeak(0), isOverloaded(false)
19{
20}
21
22//------------------------------------------------------------------------------
23
35
36// VFALCO NOTE WHY do we need "the mutex?" This dependence on
37// a hidden global, especially a synchronization primitive,
38// is a flawed design.
39// It's not clear exactly which data needs to be protected.
40//
41// call with the mutex
42void
44{
45 using namespace std::chrono_literals;
46 auto now = UptimeClock::now();
47 if (now == mLastUpdate) // current
48 return;
49
50 // VFALCO TODO Why 8?
51 if ((now < mLastUpdate) || (now > (mLastUpdate + 8s)))
52 {
53 // way out of date
54 mCounts = 0;
56 mLatencyMSAvg = 0ms;
57 mLatencyMSPeak = 0ms;
58 mLastUpdate = now;
59 return;
60 }
61
62 // do exponential decay
63 /*
64 David:
65
66 "Imagine if you add 10 to something every second. And you
67 also reduce it by 1/4 every second. It will "idle" at 40,
68 corresponding to 10 counts per second."
69 */
70 do
71 {
72 mLastUpdate += 1s;
73 mCounts -= ((mCounts + 3) / 4);
74 mLatencyEvents -= ((mLatencyEvents + 3) / 4);
77 } while (mLastUpdate < now);
78}
79
80void
82{
83 using namespace std::chrono;
84
85 auto const total = s.runTime() + s.waitTime();
86 // Don't include "jitter" as part of the latency
87 auto const latency = total < 2ms ? 0ms : round<milliseconds>(total);
88
89 if (latency > 500ms)
90 {
91 auto mj = (latency > 1s) ? j_.warn() : j_.info();
92 JLOG(mj) << "Job: " << s.name() << " run: " << round<milliseconds>(s.runTime()).count() << "ms"
93 << " wait: " << round<milliseconds>(s.waitTime()).count() << "ms";
94 }
95
96 addSamples(1, latency);
97}
98
99/* Add multiple samples
100 @param count The number of samples to add
101 @param latencyMS The total number of milliseconds
102*/
103void
105{
107
108 update();
109 mCounts += count;
110 mLatencyEvents += count;
111 mLatencyMSAvg += latency;
112 mLatencyMSPeak += latency;
113
114 auto const latencyPeak = mLatencyEvents * latency * 4 / count;
115
116 if (mLatencyMSPeak < latencyPeak)
117 mLatencyMSPeak = latencyPeak;
118}
119
120void
126
127bool
129{
130 using namespace std::chrono_literals;
131 return (mTargetLatencyPk > 0ms && (peak > mTargetLatencyPk)) ||
132 (mTargetLatencyAvg > 0ms && (avg > mTargetLatencyAvg));
133}
134
135bool
137{
139
140 update();
141
142 if (mLatencyEvents == 0)
143 return 0;
144
146}
147
150{
151 using namespace std::chrono_literals;
152 Stats stats;
153
155
156 update();
157
158 stats.count = mCounts / 4;
159
160 if (mLatencyEvents == 0)
161 {
162 stats.latencyAvg = 0ms;
163 stats.latencyPeak = 0ms;
164 }
165 else
166 {
169 }
170
171 stats.isOverloaded = isOverTarget(stats.latencyAvg, stats.latencyPeak);
172
173 return stats;
174}
175
176} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:41
Stream info() const
Definition Journal.h:307
Stream warn() const
Definition Journal.h:313
std::chrono::steady_clock::duration waitTime() const
Definition LoadEvent.cpp:30
std::chrono::steady_clock::duration runTime() const
Definition LoadEvent.cpp:36
std::string const & name() const
Definition LoadEvent.cpp:24
void addLoadSample(LoadEvent const &sample)
void setTargetLatency(std::chrono::milliseconds avg, std::chrono::milliseconds pk)
UptimeClock::time_point mLastUpdate
Definition LoadMonitor.h:64
std::chrono::milliseconds mLatencyMSPeak
Definition LoadMonitor.h:61
bool isOverTarget(std::chrono::milliseconds avg, std::chrono::milliseconds peak)
std::uint64_t mCounts
Definition LoadMonitor.h:58
void addSamples(int count, std::chrono::milliseconds latency)
std::mutex mutex_
Definition LoadMonitor.h:56
std::chrono::milliseconds mTargetLatencyAvg
Definition LoadMonitor.h:62
LoadMonitor(beast::Journal j)
std::chrono::milliseconds mLatencyMSAvg
Definition LoadMonitor.h:60
beast::Journal const j_
Definition LoadMonitor.h:65
std::chrono::milliseconds mTargetLatencyPk
Definition LoadMonitor.h:63
Tracks program uptime to seconds precision.
Definition UptimeClock.h:19
static time_point now()
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
std::chrono::milliseconds latencyPeak
Definition LoadMonitor.h:42
std::chrono::milliseconds latencyAvg
Definition LoadMonitor.h:41