diff --git a/outpostspawner/api_flavors_update.py b/outpostspawner/api_flavors_update.py
index da84c168bf399c1371c1aad63ede7176991175ef..f696a889d1931c0fd1bf2f5f453690b998d3cf70 100644
--- a/outpostspawner/api_flavors_update.py
+++ b/outpostspawner/api_flavors_update.py
@@ -52,6 +52,16 @@ async def async_get_flavors(log, user=None):
                 urls_tokens = list(
                     zip(initial_system_urls_list, initial_system_tokens_list)
                 )
+                # use pycurl by default, if available:
+                try:
+                    AsyncHTTPClient.configure(
+                        "tornado.curl_httpclient.CurlAsyncHTTPClient"
+                    )
+                except ImportError as e:
+                    log.debug(
+                        "Could not load pycurl: %s\npycurl is recommended if you have a large number of users.",
+                        e,
+                    )
                 http_client = AsyncHTTPClient(
                     force_instance=True, defaults=dict(validate_cert=False)
                 )
diff --git a/outpostspawner/outpostspawner.py b/outpostspawner/outpostspawner.py
index a47e59751d0166a54cc4a800c8b44d1f23dd5ecb..f8650a2ce24bdeb37599c9d17f00c289b420339f 100644
--- a/outpostspawner/outpostspawner.py
+++ b/outpostspawner/outpostspawner.py
@@ -614,6 +614,15 @@ class OutpostSpawner(ForwardBaseSpawner):
 
     @default("http_client")
     def _default_http_client(self):
+        """Configure tornado to use pycurl by default, if available"""
+        # use pycurl by default, if available:
+        try:
+            AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
+        except ImportError as e:
+            self.log.debug(
+                "Could not load pycurl: %s\npycurl is recommended if you have a large number of users.",
+                e,
+            )
         return AsyncHTTPClient(force_instance=True, defaults=dict(validate_cert=False))
 
     async def fetch(self, req, action):