From 9427c808130255911dd3e4eee99b6f2c1cc42066 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 5 Jan 2019 21:52:57 +0000 Subject: shrink low-bandwidth pipes under Linux 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. --- lib/PublicInbox/Daemon.pm | 5 +++++ lib/PublicInbox/EvCleanup.pm | 4 ++++ lib/PublicInbox/Git.pm | 4 ++++ lib/PublicInbox/V2Writable.pm | 3 +++ 4 files changed, 16 insertions(+) (limited to 'lib') 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); } -- cgit v1.2.3-24-ge0c7