]> Sergey Matveev's repositories - public-inbox.git/commitdiff
shrink low-bandwidth pipes under Linux
authorEric Wong <e@80x24.org>
Sat, 5 Jan 2019 21:52:57 +0000 (21:52 +0000)
committerEric Wong <e@80x24.org>
Sat, 5 Jan 2019 23:17:39 +0000 (23:17 +0000)
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
lib/PublicInbox/EvCleanup.pm
lib/PublicInbox/Git.pm
lib/PublicInbox/V2Writable.pm

index 4629aadb45ec070332ef20d93673409301409d3d..6d2ae81bc1694dcc3c9fbf1ae2cbf7b249c3153d 100644 (file)
@@ -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;
index 1a3a3d5e7735b6d8a3f2a12cd6ff4cc2ac7e3500..1a2bdb294a6431a38cb79f7fa69273c6bbf19653 100644 (file)
@@ -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;
index 95df52ed6f2fd9f2b058d404d4358acebf0532c2..16117277079e86b6aecfc4291a3cf90e25928c0a 100644 (file)
@@ -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) };
index 0a304aae241a6b390592b30b3f21ddfeb608de9b..fbab8f70be8a3233f0b4cc2a6d776e7c02c13244 100644 (file)
@@ -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);
        }