Skip to content

Commit 9c0238a

Browse files
Fixed last second metric rolling. Fixed totals json section missing the latency quantiles (#251)
1 parent b2a4041 commit 9c0238a

File tree

6 files changed

+108
-23
lines changed

6 files changed

+108
-23
lines changed

client.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,6 @@ void client::handle_response(unsigned int conn_id, struct timeval timestamp,
441441
m_connections[conn_id]->get_readable_id(),
442442
response->get_status());
443443
}
444-
445444
switch (request->m_type) {
446445
case rt_get:
447446
m_stats.update_get_op(&timestamp,

run_stats.cpp

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -150,23 +150,30 @@ void run_stats::set_end_time(struct timeval* end_time)
150150
end_time = &tv;
151151
}
152152
m_end_time = *end_time;
153+
summarize_current_second();
153154
m_stats.push_back(m_cur_stats);
154155
}
155156

157+
void run_stats::summarize_current_second(){
158+
m_cur_stats.m_get_cmd.summarize_quantiles(inst_m_get_latency_histogram,quantiles_list);
159+
m_cur_stats.m_set_cmd.summarize_quantiles(inst_m_set_latency_histogram,quantiles_list);
160+
m_cur_stats.m_wait_cmd.summarize_quantiles(inst_m_wait_latency_histogram,quantiles_list);
161+
m_cur_stats.m_total_cmd.summarize_quantiles(inst_m_totals_latency_histogram,quantiles_list);
162+
for (unsigned int i=0; i<m_cur_stats.m_ar_commands.size(); i++) {
163+
m_cur_stats.m_ar_commands[i].summarize_quantiles(inst_m_ar_commands_latency_histograms[i],quantiles_list);
164+
hdr_reset(inst_m_ar_commands_latency_histograms[i]);
165+
}
166+
hdr_reset(inst_m_get_latency_histogram);
167+
hdr_reset(inst_m_set_latency_histogram);
168+
hdr_reset(inst_m_wait_latency_histogram);
169+
hdr_reset(inst_m_totals_latency_histogram);
170+
}
171+
156172
void run_stats::roll_cur_stats(struct timeval* ts)
157173
{
158174
const unsigned int sec = ts_diff(m_start_time, *ts) / 1000000;
159175
if (sec > m_cur_stats.m_second) {
160-
m_cur_stats.m_get_cmd.summarize_quantiles(inst_m_get_latency_histogram,quantiles_list);
161-
m_cur_stats.m_set_cmd.summarize_quantiles(inst_m_set_latency_histogram,quantiles_list);
162-
m_cur_stats.m_wait_cmd.summarize_quantiles(inst_m_wait_latency_histogram,quantiles_list);
163-
for (unsigned int i=0; i<m_cur_stats.m_ar_commands.size(); i++) {
164-
m_cur_stats.m_ar_commands[i].summarize_quantiles(inst_m_ar_commands_latency_histograms[i],quantiles_list);
165-
hdr_reset(inst_m_ar_commands_latency_histograms[i]);
166-
}
167-
hdr_reset(inst_m_get_latency_histogram);
168-
hdr_reset(inst_m_set_latency_histogram);
169-
hdr_reset(inst_m_wait_latency_histogram);
176+
summarize_current_second();
170177
m_stats.push_back(m_cur_stats);
171178
m_cur_stats.reset(sec);
172179
}
@@ -176,104 +183,134 @@ void run_stats::update_get_op(struct timeval* ts, unsigned int bytes_rx, unsigne
176183
{
177184
roll_cur_stats(ts);
178185
m_cur_stats.m_get_cmd.update_op(bytes_rx, bytes_tx, latency, hits, misses);
186+
m_cur_stats.m_total_cmd.update_op(bytes_rx, bytes_tx, latency, hits, misses);
179187
m_totals.update_op(bytes_rx, bytes_tx, latency);
180188
hdr_record_value(m_get_latency_histogram,latency);
181189
hdr_record_value(inst_m_get_latency_histogram,latency);
190+
hdr_record_value(m_totals_latency_histogram,latency);
191+
hdr_record_value(inst_m_totals_latency_histogram,latency);
182192
}
183193

184194
void run_stats::update_set_op(struct timeval* ts, unsigned int bytes_rx, unsigned int bytes_tx, unsigned int latency)
185195
{
186196
roll_cur_stats(ts);
187197

188198
m_cur_stats.m_set_cmd.update_op(bytes_rx, bytes_tx, latency);
199+
m_cur_stats.m_total_cmd.update_op(bytes_rx, bytes_tx, latency);
189200
m_totals.update_op(bytes_rx, bytes_tx, latency);
190201
hdr_record_value(m_set_latency_histogram,latency);
191202
hdr_record_value(inst_m_set_latency_histogram,latency);
203+
hdr_record_value(m_totals_latency_histogram,latency);
204+
hdr_record_value(inst_m_totals_latency_histogram,latency);
192205
}
193206

194207
void run_stats::update_moved_get_op(struct timeval* ts, unsigned int bytes_rx, unsigned int bytes_tx, unsigned int latency)
195208
{
196209
roll_cur_stats(ts);
197210

198211
m_cur_stats.m_get_cmd.update_moved_op(bytes_rx, bytes_tx, latency);
212+
m_cur_stats.m_total_cmd.update_op(bytes_rx, bytes_tx, latency);
199213
m_totals.update_op(bytes_rx, bytes_tx, latency);
200214
hdr_record_value(m_get_latency_histogram,latency);
201215
hdr_record_value(inst_m_get_latency_histogram,latency);
216+
hdr_record_value(m_totals_latency_histogram,latency);
217+
hdr_record_value(inst_m_totals_latency_histogram,latency);
202218
}
203219

204220
void run_stats::update_moved_set_op(struct timeval* ts, unsigned int bytes_rx, unsigned int bytes_tx, unsigned int latency)
205221
{
206222
roll_cur_stats(ts);
207223

208224
m_cur_stats.m_set_cmd.update_moved_op(bytes_rx, bytes_tx, latency);
225+
m_cur_stats.m_total_cmd.update_moved_op(bytes_rx, bytes_tx, latency);
209226
m_totals.update_op(bytes_rx, bytes_tx, latency);
210227
hdr_record_value(m_set_latency_histogram,latency);
211228
hdr_record_value(inst_m_set_latency_histogram,latency);
229+
hdr_record_value(m_totals_latency_histogram,latency);
230+
hdr_record_value(inst_m_totals_latency_histogram,latency);
212231
}
213232

214233
void run_stats::update_moved_arbitrary_op(struct timeval *ts, unsigned int bytes_rx, unsigned int bytes_tx,
215234
unsigned int latency, size_t request_index) {
216235
roll_cur_stats(ts);
217236

218237
m_cur_stats.m_ar_commands.at(request_index).update_moved_op(bytes_rx, bytes_tx, latency);
238+
m_cur_stats.m_total_cmd.update_op(bytes_rx, bytes_tx, latency);
219239
m_totals.update_op(bytes_rx, bytes_tx, latency);
220240

221241
struct hdr_histogram* hist = m_ar_commands_latency_histograms.at(request_index);
222242
hdr_record_value(hist,latency);
243+
hdr_record_value(m_totals_latency_histogram,latency);
244+
hdr_record_value(inst_m_totals_latency_histogram,latency);
223245
}
224246

225247
void run_stats::update_ask_get_op(struct timeval* ts, unsigned int bytes_rx, unsigned int bytes_tx, unsigned int latency)
226248
{
227249
roll_cur_stats(ts);
228250

229251
m_cur_stats.m_get_cmd.update_ask_op(bytes_rx, bytes_tx, latency);
252+
m_cur_stats.m_total_cmd.update_ask_op(bytes_rx, bytes_tx, latency);
230253
m_totals.update_op(bytes_rx, bytes_tx, latency);
231254
hdr_record_value(m_get_latency_histogram,latency);
232255
hdr_record_value(inst_m_get_latency_histogram,latency);
256+
hdr_record_value(m_totals_latency_histogram,latency);
257+
hdr_record_value(inst_m_totals_latency_histogram,latency);
233258
}
234259

235260
void run_stats::update_ask_set_op(struct timeval* ts, unsigned int bytes_rx, unsigned int bytes_tx, unsigned int latency)
236261
{
237262
roll_cur_stats(ts);
238263

239264
m_cur_stats.m_set_cmd.update_ask_op(bytes_rx, bytes_tx, latency);
265+
m_cur_stats.m_total_cmd.update_ask_op(bytes_rx, bytes_tx, latency);
240266
m_totals.update_op(bytes_rx, bytes_tx, latency);
241267
hdr_record_value(m_set_latency_histogram,latency);
242268
hdr_record_value(inst_m_set_latency_histogram,latency);
269+
hdr_record_value(m_totals_latency_histogram,latency);
270+
hdr_record_value(inst_m_totals_latency_histogram,latency);
243271
}
244272

245273
void run_stats::update_ask_arbitrary_op(struct timeval *ts, unsigned int bytes_rx, unsigned int bytes_tx,
246274
unsigned int latency, size_t request_index) {
247275
roll_cur_stats(ts);
248276

249277
m_cur_stats.m_ar_commands.at(request_index).update_ask_op(bytes_rx, bytes_tx, latency);
278+
m_cur_stats.m_total_cmd.update_ask_op(bytes_rx, bytes_tx, latency);
250279
m_totals.update_op(bytes_rx, bytes_tx, latency);
251280

252281
struct hdr_histogram* hist = m_ar_commands_latency_histograms.at(request_index);
253282
hdr_record_value(hist,latency);
283+
hdr_record_value(m_totals_latency_histogram,latency);
284+
hdr_record_value(inst_m_totals_latency_histogram,latency);
254285
}
255286

256287
void run_stats::update_wait_op(struct timeval *ts, unsigned int latency)
257288
{
258289
roll_cur_stats(ts);
259290

260291
m_cur_stats.m_wait_cmd.update_op(0,0, latency);
292+
m_cur_stats.m_total_cmd.update_op(0,0, latency);
261293
m_totals.update_op(0,0, latency);
262294
hdr_record_value(m_wait_latency_histogram,latency);
263295
hdr_record_value(inst_m_wait_latency_histogram,latency);
296+
hdr_record_value(m_totals_latency_histogram,latency);
297+
hdr_record_value(inst_m_totals_latency_histogram,latency);
264298
}
265299

266300
void run_stats::update_arbitrary_op(struct timeval *ts, unsigned int bytes_rx, unsigned int bytes_tx,
267301
unsigned int latency, size_t request_index) {
268302
roll_cur_stats(ts);
269303

270304
m_cur_stats.m_ar_commands.at(request_index).update_op(bytes_rx, bytes_tx, latency);
305+
m_cur_stats.m_total_cmd.update_op(bytes_rx, bytes_tx, latency);
271306
m_totals.update_op(bytes_rx, bytes_tx, latency);
272307

273308
struct hdr_histogram* hist = m_ar_commands_latency_histograms.at(request_index);
274309
struct hdr_histogram* inst_hist = inst_m_ar_commands_latency_histograms.at(request_index);
275310
hdr_record_value(hist,latency);
276311
hdr_record_value(inst_hist,latency);
312+
hdr_record_value(m_totals_latency_histogram,latency);
313+
hdr_record_value(inst_m_totals_latency_histogram,latency);
277314
}
278315

279316
unsigned int run_stats::get_duration(void)
@@ -384,17 +421,9 @@ std::vector<one_sec_cmd_stats> run_stats::get_one_sec_cmd_stats_wait() {
384421
std::vector<one_sec_cmd_stats> run_stats::get_one_sec_cmd_stats_totals() {
385422
std::vector<one_sec_cmd_stats> result;
386423
result.reserve(m_stats.size());
387-
for (std::list<one_second_stats>::iterator i = m_stats.begin(); i != m_stats.end(); ++i)
388-
{
389-
one_second_stats current_second_stats = *i;
390-
one_sec_cmd_stats total_stat = one_sec_cmd_stats(current_second_stats.m_get_cmd);
391-
total_stat.merge(current_second_stats.m_set_cmd);
392-
total_stat.merge(current_second_stats.m_wait_cmd);
393-
for (size_t j = 0; j < current_second_stats.m_ar_commands.size(); j++)
394-
{
395-
total_stat.merge(current_second_stats.m_ar_commands.at(j));
396-
}
397-
result.push_back(total_stat);
424+
for (std::list<one_second_stats>::iterator i = m_stats.begin();
425+
i != m_stats.end(); i++) {
426+
result.push_back(i->m_total_cmd);
398427
}
399428
return result;
400429
}
@@ -734,6 +763,7 @@ void run_stats::aggregate_average(const std::vector<run_stats>& all_stats)
734763
hdr_add(m_get_latency_histogram,i->m_get_latency_histogram);
735764
hdr_add(m_set_latency_histogram,i->m_set_latency_histogram);
736765
hdr_add(m_wait_latency_histogram,i->m_wait_latency_histogram);
766+
hdr_add(m_totals_latency_histogram,i->m_totals_latency_histogram);
737767

738768
for (unsigned int j=0; j < i->m_ar_commands_latency_histograms.size(); j++) {
739769
hdr_add(m_ar_commands_latency_histograms.at(j),i->m_ar_commands_latency_histograms.at(j));
@@ -743,6 +773,7 @@ void run_stats::aggregate_average(const std::vector<run_stats>& all_stats)
743773
m_totals.m_set_cmd.aggregate_average(all_stats.size());
744774
m_totals.m_get_cmd.aggregate_average(all_stats.size());
745775
m_totals.m_wait_cmd.aggregate_average(all_stats.size());
776+
m_totals.m_total_cmd.aggregate_average(all_stats.size());
746777
m_totals.m_ar_commands.aggregate_average(all_stats.size());
747778
m_totals.m_ops_sec /= all_stats.size();
748779
m_totals.m_hits_sec /= all_stats.size();
@@ -790,7 +821,7 @@ void run_stats::merge(const run_stats& other, int iteration)
790821
m_totals.add(other.m_totals);
791822

792823
// aggregate latency data
793-
// hdr_add(m_totals.latency_histogram,other.m_totals.latency_histogram);
824+
hdr_add(m_totals_latency_histogram,other.m_totals.latency_histogram);
794825
hdr_add(m_get_latency_histogram,other.m_get_latency_histogram);
795826
hdr_add(m_set_latency_histogram,other.m_set_latency_histogram);
796827
hdr_add(m_wait_latency_histogram,other.m_wait_latency_histogram);

run_stats.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,14 @@ class run_stats {
106106
safe_hdr_histogram m_set_latency_histogram;
107107
safe_hdr_histogram m_wait_latency_histogram;
108108
std::vector<safe_hdr_histogram> m_ar_commands_latency_histograms;
109+
safe_hdr_histogram m_totals_latency_histogram;
109110

110111
// instantaneous command stats ( used in the per second latencies )
111112
safe_hdr_histogram inst_m_get_latency_histogram;
112113
safe_hdr_histogram inst_m_set_latency_histogram;
113114
safe_hdr_histogram inst_m_wait_latency_histogram;
114115
std::vector<safe_hdr_histogram> inst_m_ar_commands_latency_histograms;
116+
safe_hdr_histogram inst_m_totals_latency_histogram;
115117

116118
void roll_cur_stats(struct timeval* ts);
117119

@@ -140,6 +142,7 @@ class run_stats {
140142

141143
void aggregate_average(const std::vector<run_stats>& all_stats);
142144
void summarize(totals& result) const;
145+
void summarize_current_second();
143146
void merge(const run_stats& other, int iteration);
144147
std::vector<one_sec_cmd_stats> get_one_sec_cmd_stats_get();
145148
std::vector<one_sec_cmd_stats> get_one_sec_cmd_stats_set();

run_stats_types.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ one_second_stats::one_second_stats(unsigned int second) :
163163
m_set_cmd(),
164164
m_get_cmd(),
165165
m_wait_cmd(),
166+
m_total_cmd(),
166167
m_ar_commands()
167168
{
168169
reset(second);
@@ -177,13 +178,15 @@ void one_second_stats::reset(unsigned int second) {
177178
m_get_cmd.reset();
178179
m_set_cmd.reset();
179180
m_wait_cmd.reset();
181+
m_total_cmd.reset();
180182
m_ar_commands.reset();
181183
}
182184

183185
void one_second_stats::merge(const one_second_stats& other) {
184186
m_get_cmd.merge(other.m_get_cmd);
185187
m_set_cmd.merge(other.m_set_cmd);
186188
m_wait_cmd.merge(other.m_wait_cmd);
189+
m_total_cmd.merge(other.m_total_cmd);
187190
m_ar_commands.merge(other.m_ar_commands);
188191
}
189192

@@ -269,6 +272,7 @@ totals::totals() :
269272
m_set_cmd(),
270273
m_get_cmd(),
271274
m_wait_cmd(),
275+
m_total_cmd(),
272276
m_ar_commands(),
273277
m_ops_sec(0),
274278
m_bytes_sec(0),
@@ -290,6 +294,7 @@ void totals::add(const totals& other) {
290294
m_set_cmd.add(other.m_set_cmd);
291295
m_get_cmd.add(other.m_get_cmd);
292296
m_wait_cmd.add(other.m_wait_cmd);
297+
m_total_cmd.add(other.m_total_cmd);
293298
m_ar_commands.add(other.m_ar_commands);
294299

295300
m_ops_sec += other.m_ops_sec;

run_stats_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,12 @@ class one_second_stats {
125125
one_sec_cmd_stats m_set_cmd;
126126
one_sec_cmd_stats m_get_cmd;
127127
one_sec_cmd_stats m_wait_cmd;
128+
one_sec_cmd_stats m_total_cmd;
128129
ar_one_sec_cmd_stats m_ar_commands;
129130
one_second_stats(unsigned int second);
130131
void setup_arbitrary_commands(size_t n_arbitrary_commands);
131132
void reset(unsigned int second);
133+
void summarize();
132134
void merge(const one_second_stats& other);
133135
};
134136

@@ -172,6 +174,7 @@ class totals {
172174
totals_cmd m_set_cmd;
173175
totals_cmd m_get_cmd;
174176
totals_cmd m_wait_cmd;
177+
totals_cmd m_total_cmd;
175178
ar_totals_cmd m_ar_commands;
176179
safe_hdr_histogram latency_histogram;
177180
double m_ops_sec;

tests/tests_oss_simple_flow.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,16 +249,29 @@ def test_default_set_get(env):
249249
count = second_data["Count"]
250250
# if we had commands on that second the BW needs to be > 0
251251
if count > 0:
252+
p50 = second_data["p50.00"]
253+
p99 = second_data["p99.00"]
254+
p999 = second_data["p99.90"]
252255
env.assertTrue(bytes_rx > 0)
253256
env.assertTrue(bytes_tx > 0)
257+
env.assertTrue(p50 > 0.0)
258+
env.assertTrue(p99 > 0.0)
259+
env.assertTrue(p999 > 0.0)
254260

255261
for second_data in get_metrics_ts.values():
256262
bytes_rx = second_data["Bytes RX"]
257263
bytes_tx = second_data["Bytes TX"]
264+
count = second_data["Count"]
258265
# if we had commands on that second the BW needs to be > 0
259266
if count > 0:
267+
p50 = second_data["p50.00"]
268+
p99 = second_data["p99.00"]
269+
p999 = second_data["p99.90"]
260270
env.assertTrue(bytes_rx > 0)
261271
env.assertTrue(bytes_tx > 0)
272+
env.assertTrue(p50 > 0.0)
273+
env.assertTrue(p99 > 0.0)
274+
env.assertTrue(p999 > 0.0)
262275

263276
def test_default_set_get_with_print_percentiles(env):
264277
p_str = '0,10,20,30,40,50,60,70,80,90,95,100'
@@ -408,6 +421,37 @@ def test_default_arbitrary_command_keyless(env):
408421
if not benchmark.run():
409422
debugPrintMemtierOnError(config, env)
410423

424+
json_filename = '{0}/mb.json'.format(config.results_dir)
425+
## Assert that all BW metrics are properly stored and calculated
426+
with open(json_filename) as results_json:
427+
results_dict = json.load(results_json)
428+
metrics = results_dict['ALL STATS']['Pings']
429+
metrics_ts = results_dict['ALL STATS']['Pings']["Time-Serie"]
430+
totals_metrics_ts = results_dict['ALL STATS']['Totals']["Time-Serie"]
431+
for metric_name in ["KB/sec RX/TX","KB/sec RX","KB/sec TX","KB/sec"]:
432+
# assert the metric exists
433+
env.assertTrue(metric_name in metrics)
434+
# assert the metric value is non zero given we've had write and read
435+
metric_value_kbs = metrics[metric_name]
436+
env.assertTrue(metric_value_kbs > 0)
437+
438+
totals_metrics_ts_v = list(totals_metrics_ts.values())
439+
for pos, second_data in enumerate(metrics_ts.values()):
440+
bytes_rx = second_data["Bytes RX"]
441+
bytes_tx = second_data["Bytes TX"]
442+
count = second_data["Count"]
443+
second_data_total = totals_metrics_ts_v[pos]
444+
for metric_name in ["p50.00","p99.00","p99.90"]:
445+
if count > 0:
446+
metric_value_second_data = second_data[metric_name]
447+
metric_value_totals_second_data = second_data_total[metric_name]
448+
env.assertTrue(metric_value_totals_second_data == metric_value_second_data)
449+
env.assertTrue(metric_value_second_data > 0.0)
450+
# if we had commands on that second the BW needs to be > 0
451+
if count > 0:
452+
env.assertTrue(bytes_rx > 0)
453+
env.assertTrue(bytes_tx > 0)
454+
411455

412456
def test_default_arbitrary_command_set(env):
413457
benchmark_specs = {"name": env.testName, "args": []}

0 commit comments

Comments
 (0)