From 9128716268a0cf040fe5f2a277df3597b5782697 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 26 Jan 2017 14:44:25 -0800 Subject: [PATCH] Track writes/RPC in microbenchmark --- test/core/end2end/fuzzers/api_fuzzer.c | 2 +- test/core/util/passthru_endpoint.c | 10 +++++++++- test/core/util/passthru_endpoint.h | 5 ++++- test/cpp/microbenchmarks/bm_fullstack.cc | 19 ++++++++++++++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 690c1a4582d..310b6b5edd5 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -403,7 +403,7 @@ static void do_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { } else if (g_server != NULL) { grpc_endpoint *client; grpc_endpoint *server; - grpc_passthru_endpoint_create(&client, &server, g_resource_quota); + grpc_passthru_endpoint_create(&client, &server, g_resource_quota, NULL); *fc->ep = client; grpc_transport *transport = diff --git a/test/core/util/passthru_endpoint.c b/test/core/util/passthru_endpoint.c index d42ec7f9e8c..96f541abe93 100644 --- a/test/core/util/passthru_endpoint.c +++ b/test/core/util/passthru_endpoint.c @@ -34,6 +34,7 @@ #include "test/core/util/passthru_endpoint.h" #include +#include #include #include @@ -55,6 +56,9 @@ typedef struct { struct passthru_endpoint { gpr_mu mu; int halves; + grpc_passthru_endpoint_stats *stats; + grpc_passthru_endpoint_stats + dummy_stats; // used if constructor stats == NULL bool shutdown; half client; half server; @@ -86,6 +90,7 @@ static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, half *m = other_half((half *)ep); gpr_mu_lock(&m->parent->mu); grpc_error *error = GRPC_ERROR_NONE; + m->parent->stats->num_writes++; if (m->parent->shutdown) { error = GRPC_ERROR_CREATE("Endpoint already shutdown"); } else if (m->on_read != NULL) { @@ -184,10 +189,13 @@ static void half_init(half *m, passthru_endpoint *parent, void grpc_passthru_endpoint_create(grpc_endpoint **client, grpc_endpoint **server, - grpc_resource_quota *resource_quota) { + grpc_resource_quota *resource_quota, + grpc_passthru_endpoint_stats *stats) { passthru_endpoint *m = gpr_malloc(sizeof(*m)); m->halves = 2; m->shutdown = 0; + m->stats = stats == NULL ? &m->dummy_stats : stats; + memset(m->stats, 0, sizeof(*m->stats)); half_init(&m->client, m, resource_quota, "client"); half_init(&m->server, m, resource_quota, "server"); gpr_mu_init(&m->mu); diff --git a/test/core/util/passthru_endpoint.h b/test/core/util/passthru_endpoint.h index b81ac5571c2..9199925aa01 100644 --- a/test/core/util/passthru_endpoint.h +++ b/test/core/util/passthru_endpoint.h @@ -36,8 +36,11 @@ #include "src/core/lib/iomgr/endpoint.h" +typedef struct { int num_writes; } grpc_passthru_endpoint_stats; + void grpc_passthru_endpoint_create(grpc_endpoint **client, grpc_endpoint **server, - grpc_resource_quota *resource_quota); + grpc_resource_quota *resource_quota, + grpc_passthru_endpoint_stats *stats); #endif diff --git a/test/cpp/microbenchmarks/bm_fullstack.cc b/test/cpp/microbenchmarks/bm_fullstack.cc index e56c8538a72..fa0d2f1fb9e 100644 --- a/test/cpp/microbenchmarks/bm_fullstack.cc +++ b/test/cpp/microbenchmarks/bm_fullstack.cc @@ -130,6 +130,8 @@ class TCP : public FullstackFixture { public: TCP(Service* service) : FullstackFixture(service, MakeAddress()) {} + void Finish(benchmark::State& state) {} + private: static grpc::string MakeAddress() { int port = grpc_pick_unused_port_or_die(); @@ -143,6 +145,8 @@ class UDS : public FullstackFixture { public: UDS(Service* service) : FullstackFixture(service, MakeAddress()) {} + void Finish(benchmark::State& state) {} + private: static grpc::string MakeAddress() { int port = grpc_pick_unused_port_or_die(); // just for a unique id - not a @@ -228,6 +232,8 @@ class SockPair : public EndpointPairFixture { : EndpointPairFixture(service, grpc_iomgr_create_endpoint_pair( "test", initialize_stuff.rq(), 8192)) { } + + void Finish(benchmark::State& state) {} }; class InProcessCHTTP2 : public EndpointPairFixture { @@ -235,10 +241,20 @@ class InProcessCHTTP2 : public EndpointPairFixture { InProcessCHTTP2(Service* service) : EndpointPairFixture(service, MakeEndpoints()) {} + void Finish(benchmark::State& state) { + std::ostringstream out; + out << "writes/iteration:" + << ((double)stats_.num_writes / (double)state.iterations()); + state.SetLabel(out.str()); + } + private: + grpc_passthru_endpoint_stats stats_; + grpc_endpoint_pair MakeEndpoints() { grpc_endpoint_pair p; - grpc_passthru_endpoint_create(&p.client, &p.server, initialize_stuff.rq()); + grpc_passthru_endpoint_create(&p.client, &p.server, initialize_stuff.rq(), + &stats_); return p; } }; @@ -415,6 +431,7 @@ static void BM_UnaryPingPong(benchmark::State& state) { service.RequestEcho(&senv->ctx, &senv->recv_request, &senv->response_writer, fixture->cq(), fixture->cq(), tag(slot)); } + fixture->Finish(state); fixture.reset(); server_env[0]->~ServerEnv(); server_env[1]->~ServerEnv();