From 878a7c2a09d01baec4df8eb99ba9cbe1dc9af7e3 Mon Sep 17 00:00:00 2001
From: Craig Tiller <ctiller@google.com>
Date: Thu, 23 Mar 2017 15:14:48 -0700
Subject: [PATCH] Memory usage tweaks

- Improve estimation to give a more reliable slop space in the arena
- Improve measurement by issuing sufficient throw-away calls on a channel to allow call size estimation to settle
---
 src/core/lib/surface/channel.c  | 15 ++++++++++++---
 test/core/memory_usage/client.c |  5 +++++
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/core/lib/surface/channel.c b/src/core/lib/surface/channel.c
index d6c7aee40d..a80f24e740 100644
--- a/src/core/lib/surface/channel.c
+++ b/src/core/lib/surface/channel.c
@@ -194,13 +194,22 @@ 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
-  return ((size_t)gpr_atm_no_barrier_load(&channel->call_size_estimate) +
-          ROUND_UP_SIZE) &
-         ~(size_t)(ROUND_UP_SIZE - 1);
+  /* 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 */
+  size_t est = ((size_t)gpr_atm_no_barrier_load(&channel->call_size_estimate) +
+                2 * ROUND_UP_SIZE) &
+               ~(size_t)(ROUND_UP_SIZE - 1);
+  gpr_log(GPR_DEBUG, "est: %d", (int)est);
+  return est;
 }
 
 void grpc_channel_update_call_size_estimate(grpc_channel *channel,
                                             size_t size) {
+  gpr_log(GPR_DEBUG, "used: %d", (int)size);
   size_t cur = (size_t)gpr_atm_no_barrier_load(&channel->call_size_estimate);
   if (cur < size) {
     /* size grew: update estimate */
diff --git a/test/core/memory_usage/client.c b/test/core/memory_usage/client.c
index 107abbc1b3..51ea51bc12 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);
   }
-- 
GitLab