From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS199847 94.31.53.0/24 X-Spam-Status: No, score=-3.1 required=3.0 tests=AWL,BAYES_00,RDNS_NONE, SPF_FAIL,SPF_HELO_FAIL,TO_EQ_FM_DOM_SPF_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (unknown [94.31.53.203]) by dcvr.yhbt.net (Postfix) with ESMTP id 84AE320A17 for ; Tue, 17 Jan 2017 00:03:55 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH] another benchmark for IO.copy_stream socket writing Date: Tue, 17 Jan 2017 00:03:51 +0000 Message-Id: <20170117000351.4177-1-e@80x24.org> List-Id: Workaround for https://bugs.ruby-lang.org/issues/13085 --- benchmark/bm_io_copy_stream_write_socket.rb | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 benchmark/bm_io_copy_stream_write_socket.rb diff --git a/benchmark/bm_io_copy_stream_write_socket.rb b/benchmark/bm_io_copy_stream_write_socket.rb new file mode 100644 index 0000000000..d2c33b3ec2 --- /dev/null +++ b/benchmark/bm_io_copy_stream_write_socket.rb @@ -0,0 +1,36 @@ +require 'socket' + +# The goal of this is to use a synthetic (non-IO) reader +# to trigger the read/write loop of IO.copy_stream, +# bypassing in-kernel mechanisms like sendfile for zero copy, +# so we wrap the /dev/zero IO object: +class Zero + def initialize + @n = 100000 + @in = File.open('/dev/zero', 'rb') + end + + def read(len, buf) + return if (@n -= 1) == 0 + @in.read(len, buf) + end +end + +begin + src = Zero.new + rd, wr = UNIXSocket.pair + pid = fork do + wr.close + buf = ''.b + while rd.read(16384, buf) + end + end + rd.close + IO.copy_stream(src, wr) +rescue Errno::ENOENT + # not *nix +ensure + wr.close if wr + Process.waitpid(pid) if pid +end if IO.respond_to?(:copy_stream) && RUBY_PLATFORM =~ /linux/ && + Socket.const_defined?(:MSG_DONTWAIT) -- EW