about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-02-22 17:55:37 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-02-22 18:40:49 +0000
commit15ff4705261ec64b7bbfa3c9a52c20951c78d67d (patch)
tree6c1e2c51b707e1094b22abb81d910d394abefade
parent0586a456f97fd41879a266e14a98dcbc148679ea (diff)
downloadpublic-inbox-15ff4705261ec64b7bbfa3c9a52c20951c78d67d.tar.gz
We want to reduce the time in the main V2Writable process
spends writing to the pipe, as the main process itself is
the primary source of contention.

While we're at it, always flush after writing to ensure
the child sees it at once.  (Grr... Perl doesn't use writev)
-rw-r--r--lib/PublicInbox/SearchIdxPart.pm9
1 files changed, 8 insertions, 1 deletions
diff --git a/lib/PublicInbox/SearchIdxPart.pm b/lib/PublicInbox/SearchIdxPart.pm
index d5a3fd17..5582d672 100644
--- a/lib/PublicInbox/SearchIdxPart.pm
+++ b/lib/PublicInbox/SearchIdxPart.pm
@@ -20,6 +20,11 @@ sub new {
                 }
                 $v2writable = undef;
                 close $w;
+
+                # F_SETPIPE_SZ = 1031 on Linux; increasing the pipe size here
+                # speeds V2Writable batch imports across 8 cores by nearly 20%
+                fcntl($r, 1031, 1048576) if $^O eq 'linux';
+
                 eval { partition_worker_loop($self, $r) };
                 die "worker $part died: $@\n" if $@;
                 die "unexpected MM $self->{mm}" if $self->{mm};
@@ -63,8 +68,10 @@ sub partition_worker_loop ($$) {
 # called by V2Writable
 sub index_raw {
         my ($self, $len, $msgref, $artnum, $object_id) = @_;
-        print { $self->{w} } "$len $artnum $object_id\n", $$msgref or die
+        my $w = $self->{w};
+        print $w "$len $artnum $object_id\n", $$msgref or die
                 "failed to write partition $!\n";
+        $w->flush or die "failed to flush: $!\n";
 }
 
 1;