diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 889737e..cc2d148 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -43,6 +43,7 @@
 #include "utils/fmgroids.h"
 #include "utils/guc.h"
 #include "utils/memutils.h"
+#include "utils/ps_status.h"
 #include "utils/snapmgr.h"
 #include "utils/syscache.h"
 #include "utils/tqual.h"
@@ -214,6 +215,9 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
 
 		VacuumCostActive = (VacuumCostDelay > 0);
 		VacuumCostBalance = 0;
+		VacuumPageHit = 0;
+		VacuumPageMiss = 0;
+		VacuumPageDirty = 0;
 
 		/*
 		 * Loop to process each selected relation.
@@ -1155,11 +1159,17 @@ vacuum_delay_point(void)
 		VacuumCostBalance >= VacuumCostLimit)
 	{
 		int			msec;
+		StringInfoData ps;
 
 		msec = VacuumCostDelay * VacuumCostBalance / VacuumCostLimit;
 		if (msec > VacuumCostDelay * 4)
 			msec = VacuumCostDelay * 4;
 
+		initStringInfo(&ps);
+		appendStringInfo(&ps, "h=%d m=%d d=%d",
+						 VacuumPageHit, VacuumPageMiss, VacuumPageDirty);
+		set_ps_display(ps.data, false);
+
 		pg_usleep(msec * 1000L);
 
 		VacuumCostBalance = 0;
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
index c5bf32e..a6094fe 100644
--- a/src/backend/commands/vacuumlazy.c
+++ b/src/backend/commands/vacuumlazy.c
@@ -226,20 +226,42 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
 		if (Log_autovacuum_min_duration == 0 ||
 			TimestampDifferenceExceeds(starttime, GetCurrentTimestamp(),
 									   Log_autovacuum_min_duration))
-			ereport(LOG,
-					(errmsg("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n"
-							"pages: %d removed, %d remain\n"
-							"tuples: %.0f removed, %.0f remain\n"
-							"system usage: %s",
-							get_database_name(MyDatabaseId),
-							get_namespace_name(RelationGetNamespace(onerel)),
-							RelationGetRelationName(onerel),
-							vacrelstats->num_index_scans,
-							vacrelstats->pages_removed,
-							vacrelstats->rel_pages,
-							vacrelstats->tuples_deleted,
-							vacrelstats->new_rel_tuples,
-							pg_rusage_show(&ru0))));
+		{
+			if (VacuumCostActive)
+				ereport(LOG,
+						(errmsg("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n"
+								"pages: %d removed, %d remain\n"
+								"tuples: %.0f removed, %.0f remain\n"
+								"buffer usage: %d hits, %d misses, %d dirtied\n"
+								"system usage: %s",
+								get_database_name(MyDatabaseId),
+								get_namespace_name(RelationGetNamespace(onerel)),
+								RelationGetRelationName(onerel),
+								vacrelstats->num_index_scans,
+								vacrelstats->pages_removed,
+								vacrelstats->rel_pages,
+								vacrelstats->tuples_deleted,
+								vacrelstats->new_rel_tuples,
+								VacuumPageHit,
+								VacuumPageMiss,
+								VacuumPageDirty,
+								pg_rusage_show(&ru0))));
+			else
+				ereport(LOG,
+						(errmsg("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n"
+								"pages: %d removed, %d remain\n"
+								"tuples: %.0f removed, %.0f remain\n"
+								"system usage: %s",
+								get_database_name(MyDatabaseId),
+								get_namespace_name(RelationGetNamespace(onerel)),
+								RelationGetRelationName(onerel),
+								vacrelstats->num_index_scans,
+								vacrelstats->pages_removed,
+								vacrelstats->rel_pages,
+								vacrelstats->tuples_deleted,
+								vacrelstats->new_rel_tuples,
+								pg_rusage_show(&ru0))));
+		}
 	}
 }
 
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 4c7cfb0..d62adbc 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -341,7 +341,10 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
 			*hit = true;
 
 			if (VacuumCostActive)
+			{
+				VacuumPageHit++;
 				VacuumCostBalance += VacuumCostPageHit;
+			}
 
 			TRACE_POSTGRESQL_BUFFER_READ_DONE(forkNum, blockNum,
 											  smgr->smgr_rnode.node.spcNode,
@@ -471,7 +474,10 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
 	}
 
 	if (VacuumCostActive)
+	{
+		VacuumPageMiss++;
 		VacuumCostBalance += VacuumCostPageMiss;
+	}
 
 	TRACE_POSTGRESQL_BUFFER_READ_DONE(forkNum, blockNum,
 									  smgr->smgr_rnode.node.spcNode,
@@ -974,7 +980,10 @@ MarkBufferDirty(Buffer buffer)
 	 * If the buffer was not dirty already, do vacuum cost accounting.
 	 */
 	if (!(bufHdr->flags & BM_DIRTY) && VacuumCostActive)
+	{
+		VacuumPageDirty++;
 		VacuumCostBalance += VacuumCostPageDirty;
+	}
 
 	bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
 
@@ -2299,7 +2308,10 @@ SetBufferCommitInfoNeedsSave(Buffer buffer)
 		LockBufHdr(bufHdr);
 		Assert(bufHdr->refcount > 0);
 		if (!(bufHdr->flags & BM_DIRTY) && VacuumCostActive)
+		{
+			VacuumPageDirty++;
 			VacuumCostBalance += VacuumCostPageDirty;
+		}
 		bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
 		UnlockBufHdr(bufHdr);
 	}
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
index c4c4154..9ce64e6 100644
--- a/src/backend/utils/init/globals.c
+++ b/src/backend/utils/init/globals.c
@@ -115,6 +115,10 @@ int			VacuumCostPageDirty = 20;
 int			VacuumCostLimit = 200;
 int			VacuumCostDelay = 0;
 
+int			VacuumPageHit = 0;
+int			VacuumPageMiss = 0;
+int			VacuumPageDirty = 0;
+
 int			VacuumCostBalance = 0;		/* working state for vacuum */
 bool		VacuumCostActive = false;
 
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index 9d19417..4ee08fe 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -230,6 +230,10 @@ extern int	VacuumCostPageDirty;
 extern int	VacuumCostLimit;
 extern int	VacuumCostDelay;
 
+extern int	VacuumPageHit;
+extern int	VacuumPageMiss;
+extern int	VacuumPageDirty;
+
 extern int	VacuumCostBalance;
 extern bool VacuumCostActive;
 
