diff --git a/src/proto/grpc/testing/control.proto b/src/proto/grpc/testing/control.proto
index acee86678db2e34ac3612105b9da22ba5f30988c..cb35032c6d551b0feaff2365bab0551afcc22010 100644
--- a/src/proto/grpc/testing/control.proto
+++ b/src/proto/grpc/testing/control.proto
@@ -158,6 +158,8 @@ message ServerConfig {
 
   // Buffer pool size (no buffer pool specified if unset)
   int32 resource_quota_size = 1001;
+
+  repeated ChannelArg channel_args = 1002;
 }
 
 message ServerArgs {
diff --git a/test/cpp/qps/server.h b/test/cpp/qps/server.h
index 8fbf37a0957869868fec4b68c75c0823f21e1b39..d411d356e17c6b0ba8a850ee0e5c83ff183d7ad7 100644
--- a/test/cpp/qps/server.h
+++ b/test/cpp/qps/server.h
@@ -34,8 +34,11 @@
 #ifndef TEST_QPS_SERVER_H
 #define TEST_QPS_SERVER_H
 
+#include <grpc++/resource_quota.h>
 #include <grpc++/security/server_credentials.h>
+#include <grpc++/server_builder.h>
 #include <grpc/support/cpu.h>
+#include <grpc/support/log.h>
 #include <vector>
 
 #include "src/proto/grpc/testing/control.pb.h"
@@ -106,6 +109,28 @@ class Server {
     }
   }
 
+  static void ApplyServerConfig(const ServerConfig& config,
+                                ServerBuilder* builder) {
+    if (config.resource_quota_size() > 0) {
+      builder->SetResourceQuota(
+          ResourceQuota("QpsServerTest").Resize(config.resource_quota_size()));
+    }
+
+    for (auto arg : config.channel_args()) {
+      switch (arg.value_case()) {
+        case ChannelArg::kStrValue:
+          builder->AddChannelArgument(arg.name(), arg.str_value());
+          break;
+        case ChannelArg::kIntValue:
+          builder->AddChannelArgument(arg.name(), arg.int_value());
+          break;
+        default:
+          gpr_log(GPR_ERROR, "Channel arg '%s' ignored due to unknown type",
+                  arg.name().c_str());
+      }
+    }
+  }
+
  private:
   int port_;
   int cores_;
diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc
index b499b82091e55d48d618a61677fbb7bd4ab5eb04..3ddc5707cbb961fdd002ea99d79163960ee4a0d6 100644
--- a/test/cpp/qps/server_async.cc
+++ b/test/cpp/qps/server_async.cc
@@ -96,10 +96,7 @@ class AsyncQpsServerTest final : public grpc::testing::Server {
       srv_cqs_.emplace_back(builder.AddCompletionQueue());
     }
 
-    if (config.resource_quota_size() > 0) {
-      builder.SetResourceQuota(ResourceQuota("AsyncQpsServerTest")
-                                   .Resize(config.resource_quota_size()));
-    }
+    ApplyServerConfig(config, &builder);
 
     server_ = builder.BuildAndStart();
 
diff --git a/test/cpp/qps/server_sync.cc b/test/cpp/qps/server_sync.cc
index f79284d2254b04f952aed145a088f135e7d9e142..9fe26e85ae1f1d605ddf58e2262cbc859bee2c64 100644
--- a/test/cpp/qps/server_sync.cc
+++ b/test/cpp/qps/server_sync.cc
@@ -94,10 +94,7 @@ class SynchronousServer final : public grpc::testing::Server {
                              Server::CreateServerCredentials(config));
     gpr_free(server_address);
 
-    if (config.resource_quota_size() > 0) {
-      builder.SetResourceQuota(ResourceQuota("AsyncQpsServerTest")
-                                   .Resize(config.resource_quota_size()));
-    }
+    ApplyServerConfig(config, &builder);
 
     builder.RegisterService(&service_);