← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~cjwatson/launchpad:loggerhead-max-requests into launchpad:master

 

Colin Watson has proposed merging ~cjwatson/launchpad:loggerhead-max-requests into launchpad:master.

Commit message:
loggerhead: Set Gunicorn max_requests to 2000

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/454760

We've found with Launchpad itself that the application server leaks memory over time.  This is surely a bug somewhere, but it's proven extremely difficult to track down, and a cheap and very effective workaround has been to set `max_requests` in Gunicorn.  (See the "Memory leaks" section of https://www.chiark.greenend.org.uk/~cjwatson/blog/lp-python3.html for some background.)

Judging by memory graphs, Loggerhead is behaving in very much the same way, so install the same workaround there.
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:loggerhead-max-requests into launchpad:master.
diff --git a/lib/launchpad_loggerhead/wsgi.py b/lib/launchpad_loggerhead/wsgi.py
index 00defe8..23322d2 100644
--- a/lib/launchpad_loggerhead/wsgi.py
+++ b/lib/launchpad_loggerhead/wsgi.py
@@ -113,6 +113,8 @@ def _on_starting_hook(arbiter):
     )
 
 
+# XXX cjwatson 2023-10-29: Refactor this so that the charm can supply the
+# gunicorn configuration.
 class LoggerheadApplication(Application):
     def __init__(self, **kwargs):
         self.options = kwargs
@@ -140,6 +142,9 @@ class LoggerheadApplication(Application):
             "forwarded_allow_ips": "*",
             "logger_class": "launchpad_loggerhead.wsgi.LoggerheadLogger",
             "loglevel": "debug",
+            # This is set relatively low to work around memory leaks on
+            # Python 3.
+            "max_requests": 2000,
             "on_starting": _on_starting_hook,
             "pidfile": pidfile_path("codebrowse"),
             "preload_app": True,