diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 37a030b5f5e4e1536c44227672be05ffcff88537..38f7a3f1c36bccd290a76dab00a33fc4a2fdbe27 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -837,7 +837,7 @@ WalSndLoop(void)
 
 			if (pq_is_send_pending())
 				wakeEvents |= WL_SOCKET_WRITEABLE;
-			else
+			else if (MyWalSnd->sendKeepalive)
 			{
 				WalSndKeepalive(output_message);
 				/* Try to flush pending output to the client */
diff --git a/src/include/replication/walsender_private.h b/src/include/replication/walsender_private.h
index 66234cd8b5925d81b535522983fdc75da1d40c75..45cd7444cdfc8558bf86e7afe275d721ee95b245 100644
--- a/src/include/replication/walsender_private.h
+++ b/src/include/replication/walsender_private.h
@@ -37,6 +37,7 @@ typedef struct WalSnd
 	XLogRecPtr	sentPtr;		/* WAL has been sent up to this point */
 	bool		needreload;		/* does currently-open file need to be
 								 * reloaded? */
+	bool		sendKeepalive;	/* do we send keepalives on this connection? */
 
 	/*
 	 * The xlog locations that have been written, flushed, and applied by