about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-01-05 21:52:57 +0000
committerEric Wong <e@80x24.org>2019-01-05 23:17:39 +0000
commit9427c808130255911dd3e4eee99b6f2c1cc42066 (patch)
tree4d3045140408eb6f475551613c07007f08b030a8
parent789ac5b0119d8d878380bbe8b3de4c7630460148 (diff)
downloadpublic-inbox-9427c808130255911dd3e4eee99b6f2c1cc42066.tar.gz
I've hit /proc/sys/fs/pipe-user-pages-* limits on some systems.
So stop hogging resources on pipes which don't benefit from
giant sizes.

Some of these can use eventfd in the future to further reduce
resource use.
-rw-r--r--lib/PublicInbox/Daemon.pm5
-rw-r--r--lib/PublicInbox/EvCleanup.pm4
-rw-r--r--lib/PublicInbox/Git.pm4
-rw-r--r--lib/PublicInbox/V2Writable.pm3
4 files changed, 16 insertions, 0 deletions
diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm
index 4629aadb..6d2ae81b 100644
--- a/lib/PublicInbox/Daemon.pm
+++ b/lib/PublicInbox/Daemon.pm
@@ -356,6 +356,11 @@ sub unlink_pid_file_safe_ish ($$) {
 sub master_loop {
         pipe(my ($p0, $p1)) or die "failed to create parent-pipe: $!";
         pipe(my ($r, $w)) or die "failed to create self-pipe: $!";
+
+        if ($^O eq 'linux') { # 1031: F_SETPIPE_SZ = 1031
+                fcntl($_, 1031, 4096) for ($w, $p1);
+        }
+
         IO::Handle::blocking($w, 0);
         my $set_workers = $worker_processes;
         my @caught;
diff --git a/lib/PublicInbox/EvCleanup.pm b/lib/PublicInbox/EvCleanup.pm
index 1a3a3d5e..1a2bdb29 100644
--- a/lib/PublicInbox/EvCleanup.pm
+++ b/lib/PublicInbox/EvCleanup.pm
@@ -19,7 +19,11 @@ my $laterq = [ [], undef ];
 sub once_init () {
         my $self = fields::new('PublicInbox::EvCleanup');
         my ($r, $w);
+
+        # This is a dummy pipe which is always writable so it can always
+        # fires in the next event loop iteration.
         pipe($r, $w) or die "pipe: $!";
+        fcntl($w, 1031, 4096) if $^O eq 'linux'; # 1031: F_SETPIPE_SZ
         $self->SUPER::new($w);
         $self->{rd} = $r; # never read, since we never write..
         $self;
diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index 95df52ed..16117277 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -37,6 +37,10 @@ sub _bidi_pipe {
 
         pipe($in_r, $in_w) or fail($self, "pipe failed: $!");
         pipe($out_r, $out_w) or fail($self, "pipe failed: $!");
+        if ($^O eq 'linux') { # 1031: F_SETPIPE_SZ
+                fcntl($out_w, 1031, 4096);
+                fcntl($in_w, 1031, 4096) if $batch eq '--batch-check';
+        }
 
         my @cmd = ('git', "--git-dir=$self->{git_dir}", qw(cat-file), $batch);
         my $redir = { 0 => fileno($out_r), 1 => fileno($in_w) };
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index 0a304aae..fbab8f70 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -243,6 +243,9 @@ sub idx_init {
 
         if ($self->{parallel}) {
                 pipe(my ($r, $w)) or die "pipe failed: $!";
+                # pipe for barrier notifications doesn't need to be big,
+                # 1031: F_SETPIPE_SZ
+                fcntl($w, 1031, 4096) if $^O eq 'linux';
                 $self->{bnote} = [ $r, $w ];
                 $w->autoflush(1);
         }