about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-03-19 03:32:55 -0500
committerEric Wong <e@yhbt.net>2020-03-20 18:24:21 +0000
commit31ec75b69e02df6330bc16dd2bd48d354726f4c1 (patch)
treef4d5d763e6b8b65bf3a19abc10ffa13eb5f54adb /lib
parenta7c58d0ce022671c9170401054a1131b9ec15bfa (diff)
downloadpublic-inbox-31ec75b69e02df6330bc16dd2bd48d354726f4c1.tar.gz
Doing immortal allocations late can cause those allocations
to end up in places where it fragments the heap.  So do more
things up front for long-lived daemons.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/NNTPD.pm4
-rw-r--r--lib/PublicInbox/WWW.pm21
2 files changed, 21 insertions, 4 deletions
diff --git a/lib/PublicInbox/NNTPD.pm b/lib/PublicInbox/NNTPD.pm
index 7a917169..451f4d41 100644
--- a/lib/PublicInbox/NNTPD.pm
+++ b/lib/PublicInbox/NNTPD.pm
@@ -45,6 +45,10 @@ sub refresh_groups () {
                         # Only valid if msgmap and search works
                         $new->{$ngname} = $ng;
                         push @list, $ng;
+
+                        # preload to avoid fragmentation:
+                        $ng->description;
+                        $ng->base_url;
                 }
         });
         @list =        sort { $a->{newsgroup} cmp $b->{newsgroup} } @list;
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index 534ee028..2434f2f5 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -132,7 +132,9 @@ sub call {
         }
 }
 
-# for CoW-friendliness, MOOOOO!
+# for CoW-friendliness, MOOOOO!  Even for single-process setups,
+# we want to get all immortal allocations done early to avoid heap
+# fragmentation since common allocators favor a large contiguous heap.
 sub preload {
         my ($self) = @_;
         require PublicInbox::ExtMsg;
@@ -148,18 +150,29 @@ sub preload {
                 require PublicInbox::Search;
                 PublicInbox::Search::load_xapian();
         };
-        foreach (qw(PublicInbox::SearchView
-                        PublicInbox::MboxGz
-                        PublicInbox::NewsWWW)) {
+        foreach (qw(PublicInbox::SearchView PublicInbox::MboxGz)) {
                 eval "require $_;";
         }
         if (ref($self)) {
+                my $pi_config = $self->{pi_config};
+                if (defined($pi_config->{'publicinbox.cgitrc'})) {
+                        $pi_config->limiter('-cgit');
+                }
                 $self->cgit;
                 $self->stylesheets_prepare($_) for ('', '../', '../../');
                 $self->www_listing;
+                $self->news_www;
+                $pi_config->each_inbox(\&preload_inbox);
         }
 }
 
+sub preload_inbox {
+        my $ibx = shift;
+        $ibx->cloneurl;
+        $ibx->description;
+        $ibx->base_url;
+}
+
 # private functions below
 
 sub r404 {