diff --git a/lib/conncache.h b/lib/conncache.h
index 691f061..96a0be0 100644
--- a/lib/conncache.h
+++ b/lib/conncache.h
@@ -26,6 +26,7 @@ struct conncache {
   struct curl_hash *hash;
   size_t num_connections;
   size_t next_connection_id;
+  struct timeval last_cleanup;
 };
 
 struct conncache *Curl_conncache_init(int size);
diff --git a/lib/url.c b/lib/url.c
index 3630ac6..8fdcf29 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -2962,11 +2962,18 @@ static int RemoveConnectionIfDeadWrapper(struct connectdata *check,
 /*
  * This function scans the connection cache for half-open/dead connections,
  * closes and removes them.
+ * The cleanup is done at most once per second.
  */
 static void CleanupDeadConnections(struct SessionHandle *data) {
 
-  Curl_conncache_foreach(data->state.conn_cache, data,
-                          RemoveConnectionIfDeadWrapper);
+  struct timeval now = Curl_tvnow();
+  long elapsed = Curl_tvdiff(now, data->state.conn_cache->last_cleanup);
+
+  if(elapsed >= 1000L) {
+    Curl_conncache_foreach(data->state.conn_cache, data,
+                            RemoveConnectionIfDeadWrapper);
+    data->state.conn_cache->last_cleanup = now;
+  }
 }
 
 /*

