diff --git a/test/cpp/qps/client.cc b/test/cpp/qps/client.cc
index affc4926bf3b89c5ad33e72e44401b86253c9af3..d2c83aad3df75d3c30a441c16e3f50c5e30c9e23 100644
--- a/test/cpp/qps/client.cc
+++ b/test/cpp/qps/client.cc
@@ -44,6 +44,7 @@
 #include <google/gflags.h>
 #include <grpc++/client_context.h>
 #include <grpc++/status.h>
+#include "test/core/util/grpc_profiler.h"
 #include "test/cpp/util/create_test_channel.h"
 #include "test/cpp/qps/qpstest.pb.h"
 
@@ -129,6 +130,8 @@ void RunTest(const int client_threads, const int client_channels,
   grpc::Status status_beg = stub_stats->CollectServerStats(
       &context_stats_begin, stats_request, &server_stats_begin);
 
+  grpc_profiler_start("qps_client.prof");
+
   for (int i = 0; i < client_threads; i++) {
     gpr_histogram *hist = gpr_histogram_create(0.01, 60e9);
     GPR_ASSERT(hist != NULL);
@@ -172,6 +175,9 @@ void RunTest(const int client_threads, const int client_channels,
   for (auto &t : threads) {
     t.join();
   }
+
+  grpc_profiler_stop();
+
   for (int i = 0; i < client_threads; i++) {
     gpr_histogram *h = thread_stats[i];
     gpr_log(GPR_INFO, "latency at thread %d (50/90/95/99/99.9): %f/%f/%f/%f/%f",
diff --git a/test/cpp/qps/server.cc b/test/cpp/qps/server.cc
index eb810b8d5594f684d382b0484fefeb64ee8633d5..c35d9ebdd87c4bcaabc7c8c64ed2369dbbac3487 100644
--- a/test/cpp/qps/server.cc
+++ b/test/cpp/qps/server.cc
@@ -33,6 +33,7 @@
 
 #include <sys/time.h>
 #include <sys/resource.h>
+#include <sys/signal.h>
 #include <thread>
 
 #include <google/gflags.h>
@@ -43,6 +44,7 @@
 #include <grpc++/server_builder.h>
 #include <grpc++/server_context.h>
 #include <grpc++/status.h>
+#include "test/core/util/grpc_profiler.h"
 #include "test/cpp/qps/qpstest.pb.h"
 
 #include <grpc/grpc.h>
@@ -63,11 +65,15 @@ using grpc::testing::StatsRequest;
 using grpc::testing::TestService;
 using grpc::Status;
 
+static bool got_sigint = false;
+
+static void sigint_handler(int x) { got_sigint = 1; }
+
 static double time_double(struct timeval* tv) {
   return tv->tv_sec + 1e-6 * tv->tv_usec;
 }
 
-bool SetPayload(PayloadType type, int size, Payload* payload) {
+static bool SetPayload(PayloadType type, int size, Payload* payload) {
   PayloadType response_type = type;
   // TODO(yangg): Support UNCOMPRESSABLE payload.
   if (type != PayloadType::COMPRESSABLE) {
@@ -79,7 +85,9 @@ bool SetPayload(PayloadType type, int size, Payload* payload) {
   return true;
 }
 
-class TestServiceImpl : public TestService::Service {
+namespace {
+
+class TestServiceImpl final : public TestService::Service {
  public:
   Status CollectServerStats(ServerContext* context, const StatsRequest*,
                             ServerStats* response) {
@@ -104,7 +112,9 @@ class TestServiceImpl : public TestService::Service {
   }
 };
 
-void RunServer() {
+}  // namespace
+
+static void RunServer() {
   char* server_address = NULL;
   gpr_join_host_port(&server_address, "::", FLAGS_port);
 
@@ -118,10 +128,15 @@ void RunServer() {
   builder.RegisterService(service.service());
   std::unique_ptr<Server> server(builder.BuildAndStart());
   gpr_log(GPR_INFO, "Server listening on %s\n", server_address);
-  while (true) {
+
+  grpc_profiler_start("qps_server.prof");
+
+  while (!got_sigint) {
     std::this_thread::sleep_for(std::chrono::seconds(5));
   }
 
+  grpc_profiler_stop();
+
   gpr_free(server_address);
 }
 
@@ -129,6 +144,8 @@ int main(int argc, char** argv) {
   grpc_init();
   google::ParseCommandLineFlags(&argc, &argv, true);
 
+  signal(SIGINT, sigint_handler);
+  
   GPR_ASSERT(FLAGS_port != 0);
   GPR_ASSERT(!FLAGS_enable_ssl);
   RunServer();
@@ -136,3 +153,4 @@ int main(int argc, char** argv) {
   grpc_shutdown();
   return 0;
 }
+