diff --git a/src/core/lib/surface/channel.c b/src/core/lib/surface/channel.c index d6c7aee40d8..b4bfb92042d 100644 --- a/src/core/lib/surface/channel.c +++ b/src/core/lib/surface/channel.c @@ -194,8 +194,14 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, size_t grpc_channel_get_call_size_estimate(grpc_channel *channel) { #define ROUND_UP_SIZE 256 + /* We round up our current estimate to the NEXT value of ROUND_UP_SIZE. + This ensures: + 1. a consistent size allocation when our estimate is drifting slowly + (which is common) - which tends to help most allocators reuse memory + 2. a small amount of allowed growth over the estimate without hitting + the arena size doubling case, reducing overall memory usage */ return ((size_t)gpr_atm_no_barrier_load(&channel->call_size_estimate) + - ROUND_UP_SIZE) & + 2 * ROUND_UP_SIZE) & ~(size_t)(ROUND_UP_SIZE - 1); } diff --git a/test/core/memory_usage/client.c b/test/core/memory_usage/client.c index 107abbc1b3d..51ea51bc12f 100644 --- a/test/core/memory_usage/client.c +++ b/test/core/memory_usage/client.c @@ -237,6 +237,11 @@ int main(int argc, char **argv) { 0, grpc_slice_from_static_string("Reflector/GetAfterSvrCreation")); // warmup period + for (int i = 0; i < warmup_iterations; i++) { + send_snapshot_request( + 0, grpc_slice_from_static_string("Reflector/SimpleSnapshot")); + } + for (call_idx = 0; call_idx < warmup_iterations; ++call_idx) { init_ping_pong_request(call_idx + 1); }