bench.c (dd84cfff3cc3b79c9d616f85bd1178df135cbd1a) | bench.c (2b4b2621fd6401865b31b9f403e4b936b7439e94) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2020 Facebook */ 3#define _GNU_SOURCE 4#include <argp.h> 5#include <linux/compiler.h> 6#include <sys/time.h> 7#include <sched.h> 8#include <fcntl.h> --- 65 unchanged lines hidden (view full) --- 74 75 printf("Iter %3d (%7.3lfus): ", 76 iter, (delta_ns - 1000000000) / 1000.0); 77 78 printf("hits %8.3lfM/s (%7.3lfM/prod), drops %8.3lfM/s, total operations %8.3lfM/s\n", 79 hits_per_sec, hits_per_prod, drops_per_sec, hits_per_sec + drops_per_sec); 80} 81 | 1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2020 Facebook */ 3#define _GNU_SOURCE 4#include <argp.h> 5#include <linux/compiler.h> 6#include <sys/time.h> 7#include <sched.h> 8#include <fcntl.h> --- 65 unchanged lines hidden (view full) --- 74 75 printf("Iter %3d (%7.3lfus): ", 76 iter, (delta_ns - 1000000000) / 1000.0); 77 78 printf("hits %8.3lfM/s (%7.3lfM/prod), drops %8.3lfM/s, total operations %8.3lfM/s\n", 79 hits_per_sec, hits_per_prod, drops_per_sec, hits_per_sec + drops_per_sec); 80} 81 |
82void 83grace_period_latency_basic_stats(struct bench_res res[], int res_cnt, struct basic_stats *gp_stat) 84{ 85 int i; 86 87 memset(gp_stat, 0, sizeof(struct basic_stats)); 88 89 for (i = 0; i < res_cnt; i++) 90 gp_stat->mean += res[i].gp_ns / 1000.0 / (double)res[i].gp_ct / (0.0 + res_cnt); 91 92#define IT_MEAN_DIFF (res[i].gp_ns / 1000.0 / (double)res[i].gp_ct - gp_stat->mean) 93 if (res_cnt > 1) { 94 for (i = 0; i < res_cnt; i++) 95 gp_stat->stddev += (IT_MEAN_DIFF * IT_MEAN_DIFF) / (res_cnt - 1.0); 96 } 97 gp_stat->stddev = sqrt(gp_stat->stddev); 98#undef IT_MEAN_DIFF 99} 100 101void 102grace_period_ticks_basic_stats(struct bench_res res[], int res_cnt, struct basic_stats *gp_stat) 103{ 104 int i; 105 106 memset(gp_stat, 0, sizeof(struct basic_stats)); 107 for (i = 0; i < res_cnt; i++) 108 gp_stat->mean += res[i].stime / (double)res[i].gp_ct / (0.0 + res_cnt); 109 110#define IT_MEAN_DIFF (res[i].stime / (double)res[i].gp_ct - gp_stat->mean) 111 if (res_cnt > 1) { 112 for (i = 0; i < res_cnt; i++) 113 gp_stat->stddev += (IT_MEAN_DIFF * IT_MEAN_DIFF) / (res_cnt - 1.0); 114 } 115 gp_stat->stddev = sqrt(gp_stat->stddev); 116#undef IT_MEAN_DIFF 117} 118 |
|
82void hits_drops_report_final(struct bench_res res[], int res_cnt) 83{ 84 int i; 85 double hits_mean = 0.0, drops_mean = 0.0, total_ops_mean = 0.0; 86 double hits_stddev = 0.0, drops_stddev = 0.0, total_ops_stddev = 0.0; 87 double total_ops; 88 89 for (i = 0; i < res_cnt; i++) { --- 55 unchanged lines hidden (view full) --- 145 146 hits_stddev = sqrt(hits_stddev); 147 } 148 printf("Summary: throughput %8.3lf \u00B1 %5.3lf M ops/s (%7.3lfM ops/prod), ", 149 hits_mean, hits_stddev, hits_mean / env.producer_cnt); 150 printf("latency %8.3lf ns/op\n", 1000.0 / hits_mean * env.producer_cnt); 151} 152 | 119void hits_drops_report_final(struct bench_res res[], int res_cnt) 120{ 121 int i; 122 double hits_mean = 0.0, drops_mean = 0.0, total_ops_mean = 0.0; 123 double hits_stddev = 0.0, drops_stddev = 0.0, total_ops_stddev = 0.0; 124 double total_ops; 125 126 for (i = 0; i < res_cnt; i++) { --- 55 unchanged lines hidden (view full) --- 182 183 hits_stddev = sqrt(hits_stddev); 184 } 185 printf("Summary: throughput %8.3lf \u00B1 %5.3lf M ops/s (%7.3lfM ops/prod), ", 186 hits_mean, hits_stddev, hits_mean / env.producer_cnt); 187 printf("latency %8.3lf ns/op\n", 1000.0 / hits_mean * env.producer_cnt); 188} 189 |
190void local_storage_report_progress(int iter, struct bench_res *res, 191 long delta_ns) 192{ 193 double important_hits_per_sec, hits_per_sec; 194 double delta_sec = delta_ns / 1000000000.0; 195 196 hits_per_sec = res->hits / 1000000.0 / delta_sec; 197 important_hits_per_sec = res->important_hits / 1000000.0 / delta_sec; 198 199 printf("Iter %3d (%7.3lfus): ", iter, (delta_ns - 1000000000) / 1000.0); 200 201 printf("hits %8.3lfM/s ", hits_per_sec); 202 printf("important_hits %8.3lfM/s\n", important_hits_per_sec); 203} 204 205void local_storage_report_final(struct bench_res res[], int res_cnt) 206{ 207 double important_hits_mean = 0.0, important_hits_stddev = 0.0; 208 double hits_mean = 0.0, hits_stddev = 0.0; 209 int i; 210 211 for (i = 0; i < res_cnt; i++) { 212 hits_mean += res[i].hits / 1000000.0 / (0.0 + res_cnt); 213 important_hits_mean += res[i].important_hits / 1000000.0 / (0.0 + res_cnt); 214 } 215 216 if (res_cnt > 1) { 217 for (i = 0; i < res_cnt; i++) { 218 hits_stddev += (hits_mean - res[i].hits / 1000000.0) * 219 (hits_mean - res[i].hits / 1000000.0) / 220 (res_cnt - 1.0); 221 important_hits_stddev += 222 (important_hits_mean - res[i].important_hits / 1000000.0) * 223 (important_hits_mean - res[i].important_hits / 1000000.0) / 224 (res_cnt - 1.0); 225 } 226 227 hits_stddev = sqrt(hits_stddev); 228 important_hits_stddev = sqrt(important_hits_stddev); 229 } 230 printf("Summary: hits throughput %8.3lf \u00B1 %5.3lf M ops/s, ", 231 hits_mean, hits_stddev); 232 printf("hits latency %8.3lf ns/op, ", 1000.0 / hits_mean); 233 printf("important_hits throughput %8.3lf \u00B1 %5.3lf M ops/s\n", 234 important_hits_mean, important_hits_stddev); 235} 236 |
|
153const char *argp_program_version = "benchmark"; 154const char *argp_program_bug_address = "<bpf@vger.kernel.org>"; 155const char argp_program_doc[] = 156"benchmark Generic benchmarking framework.\n" 157"\n" 158"This tool runs benchmarks.\n" 159"\n" 160"USAGE: benchmark <bench-name>\n" --- 22 unchanged lines hidden (view full) --- 183 { "cons-affinity", ARG_CONS_AFFINITY_SET, "CPUSET", 0, 184 "Set of CPUs for consumer threads; implies --affinity"}, 185 {}, 186}; 187 188extern struct argp bench_ringbufs_argp; 189extern struct argp bench_bloom_map_argp; 190extern struct argp bench_bpf_loop_argp; | 237const char *argp_program_version = "benchmark"; 238const char *argp_program_bug_address = "<bpf@vger.kernel.org>"; 239const char argp_program_doc[] = 240"benchmark Generic benchmarking framework.\n" 241"\n" 242"This tool runs benchmarks.\n" 243"\n" 244"USAGE: benchmark <bench-name>\n" --- 22 unchanged lines hidden (view full) --- 267 { "cons-affinity", ARG_CONS_AFFINITY_SET, "CPUSET", 0, 268 "Set of CPUs for consumer threads; implies --affinity"}, 269 {}, 270}; 271 272extern struct argp bench_ringbufs_argp; 273extern struct argp bench_bloom_map_argp; 274extern struct argp bench_bpf_loop_argp; |
275extern struct argp bench_local_storage_argp; 276extern struct argp bench_local_storage_rcu_tasks_trace_argp; |
|
191extern struct argp bench_strncmp_argp; 192 193static const struct argp_child bench_parsers[] = { 194 { &bench_ringbufs_argp, 0, "Ring buffers benchmark", 0 }, 195 { &bench_bloom_map_argp, 0, "Bloom filter map benchmark", 0 }, 196 { &bench_bpf_loop_argp, 0, "bpf_loop helper benchmark", 0 }, | 277extern struct argp bench_strncmp_argp; 278 279static const struct argp_child bench_parsers[] = { 280 { &bench_ringbufs_argp, 0, "Ring buffers benchmark", 0 }, 281 { &bench_bloom_map_argp, 0, "Bloom filter map benchmark", 0 }, 282 { &bench_bpf_loop_argp, 0, "bpf_loop helper benchmark", 0 }, |
283 { &bench_local_storage_argp, 0, "local_storage benchmark", 0 }, |
|
197 { &bench_strncmp_argp, 0, "bpf_strncmp helper benchmark", 0 }, | 284 { &bench_strncmp_argp, 0, "bpf_strncmp helper benchmark", 0 }, |
285 { &bench_local_storage_rcu_tasks_trace_argp, 0, 286 "local_storage RCU Tasks Trace slowdown benchmark", 0 }, |
|
198 {}, 199}; 200 201static error_t parse_arg(int key, char *arg, struct argp_state *state) 202{ 203 static int pos_args; 204 205 switch (key) { --- 185 unchanged lines hidden (view full) --- 391extern const struct bench bench_bloom_lookup; 392extern const struct bench bench_bloom_update; 393extern const struct bench bench_bloom_false_positive; 394extern const struct bench bench_hashmap_without_bloom; 395extern const struct bench bench_hashmap_with_bloom; 396extern const struct bench bench_bpf_loop; 397extern const struct bench bench_strncmp_no_helper; 398extern const struct bench bench_strncmp_helper; | 287 {}, 288}; 289 290static error_t parse_arg(int key, char *arg, struct argp_state *state) 291{ 292 static int pos_args; 293 294 switch (key) { --- 185 unchanged lines hidden (view full) --- 480extern const struct bench bench_bloom_lookup; 481extern const struct bench bench_bloom_update; 482extern const struct bench bench_bloom_false_positive; 483extern const struct bench bench_hashmap_without_bloom; 484extern const struct bench bench_hashmap_with_bloom; 485extern const struct bench bench_bpf_loop; 486extern const struct bench bench_strncmp_no_helper; 487extern const struct bench bench_strncmp_helper; |
488extern const struct bench bench_bpf_hashmap_full_update; 489extern const struct bench bench_local_storage_cache_seq_get; 490extern const struct bench bench_local_storage_cache_interleaved_get; 491extern const struct bench bench_local_storage_cache_hashmap_control; 492extern const struct bench bench_local_storage_tasks_trace; |
|
399 400static const struct bench *benchs[] = { 401 &bench_count_global, 402 &bench_count_local, 403 &bench_rename_base, 404 &bench_rename_kprobe, 405 &bench_rename_kretprobe, 406 &bench_rename_rawtp, --- 18 unchanged lines hidden (view full) --- 425 &bench_bloom_lookup, 426 &bench_bloom_update, 427 &bench_bloom_false_positive, 428 &bench_hashmap_without_bloom, 429 &bench_hashmap_with_bloom, 430 &bench_bpf_loop, 431 &bench_strncmp_no_helper, 432 &bench_strncmp_helper, | 493 494static const struct bench *benchs[] = { 495 &bench_count_global, 496 &bench_count_local, 497 &bench_rename_base, 498 &bench_rename_kprobe, 499 &bench_rename_kretprobe, 500 &bench_rename_rawtp, --- 18 unchanged lines hidden (view full) --- 519 &bench_bloom_lookup, 520 &bench_bloom_update, 521 &bench_bloom_false_positive, 522 &bench_hashmap_without_bloom, 523 &bench_hashmap_with_bloom, 524 &bench_bpf_loop, 525 &bench_strncmp_no_helper, 526 &bench_strncmp_helper, |
527 &bench_bpf_hashmap_full_update, 528 &bench_local_storage_cache_seq_get, 529 &bench_local_storage_cache_interleaved_get, 530 &bench_local_storage_cache_hashmap_control, 531 &bench_local_storage_tasks_trace, |
|
433}; 434 435static void setup_benchmark() 436{ 437 int i, err; 438 439 if (!env.bench_name) { 440 fprintf(stderr, "benchmark name is not specified\n"); --- 111 unchanged lines hidden --- | 532}; 533 534static void setup_benchmark() 535{ 536 int i, err; 537 538 if (!env.bench_name) { 539 fprintf(stderr, "benchmark name is not specified\n"); --- 111 unchanged lines hidden --- |