Feature #20782
openIntroduction of Happy Eyeballs Version 2 (RFC8305) in TCPSocket.new
Description
This is an implementation of Happy Eyeballs version 2 (RFC 8305) in TCPSocket.new
.
See https://github.com/ruby/ruby/pull/11653
Background¶
Prior to this implementation, I implemented Happy Eyeballs Version 2 (HEv2) for Socket.tcp
in https://github.com/ruby/ruby/pull/9374.
HEv2 is an algorithm defined in RFC 8305, aimed at improving network connectivity.
For more details on the specific cases that HEv2 helps, please refer to https://bugs.ruby-lang.org/issues/20108.
Proposal & Outcome¶
This proposal implements the same HEv2 algorithm in TCPSocket.new
.
Since TCPSocket.new
is used more widely than Socket.tcp
, this change is expected to broaden the impact of HEv2's benefits.
Like Socket.tcp
, I have also added fast_fallback
keyword argument to TCPSocket.new
.
This option is set to true by default, enabling the HEv2 functionality.
However, users can explicitly set it to false to disable HEv2 and use the previous behavior of TCPSocket.new
.
It should be noted that HEv2 is enabled only in environments where pthreads are available.
This specification follows the approach taken in https://bugs.ruby-lang.org/issues/19965, where name resolution can be interrupted.
(In environments where pthreads are not available, the fast_fallback
option is ignored.)
Performance¶
Below is the benchmark of 100 requests to www.ruby-lang.org
with the fast_fallback option set to true and false, respectively.
While there is a slight performance degradation when HEv2 is enabled, the degradation is smaller compared to that seen in Socket.tcp
.
require 'socket'
require 'benchmark'
hostname = "www.ruby-lang.org"
port = 80
n = 100
Benchmark.bmbm do |x|
x.report("fast_fallback: true") do
n.times { TCPSocket.new(hostname, port).close }
end
x.report("fast_fallback: false") do
n.times { TCPSocket.new(hostname, port, fast_fallback: false).close }
end
end
~/s/build ❯❯❯ ../install/bin/ruby ../ruby/test.rb
Rehearsal --------------------------------------------------------
fast_fallback: true 0.017588 0.097045 0.114633 ( 1.460664)
fast_fallback: false 0.014033 0.078984 0.093017 ( 1.413951)
----------------------------------------------- total: 0.207650sec
user system total real
fast_fallback: true 0.020891 0.124054 0.144945 ( 1.473816)
fast_fallback: false 0.018392 0.110852 0.129244 ( 1.466014)
Updated by hsbt (Hiroshi SHIBATA) about 1 month ago
- Status changed from Open to Assigned
- Assignee set to naruse (Yui NARUSE)
Updated by hsbt (Hiroshi SHIBATA) 20 days ago
@matz (Yukihiro Matsumoto) I propose @shioimm (Misaki Shioi) as a Ruby committer. She is best person to maintain HEv2 and Socket related feature. It's good time to commit https://github.com/ruby/ruby/pull/11653 by herself.
I'll support and mentor her.
Updated by tenderlovemaking (Aaron Patterson) 19 days ago
hsbt (Hiroshi SHIBATA) wrote in #note-2:
@matz (Yukihiro Matsumoto) I propose @shioimm (Misaki Shioi) as a Ruby committer. She is best person to maintain HEv2 and Socket related feature. It's good time to commit https://github.com/ruby/ruby/pull/11653 by herself.
I'll support and mentor her.
+1
Updated by matz (Yukihiro Matsumoto) 14 days ago
Accepted.
Matz.
Updated by shioimm (Misaki Shioi) 14 days ago
Thank you it's honor to be a Ruby committer...!
Updated by hsbt (Hiroshi SHIBATA) 13 days ago
@shioimm (Misaki Shioi) Can you provide required/optional information at https://github.com/ruby/ruby/wiki/Committer-How-To#how-to-register-you-as-a-committer to cvs-admin@ruby-lang.org? After that, I will prepare your account for Ruby committer.
Updated by shioimm (Misaki Shioi) 13 days ago
@hsbt (Hiroshi SHIBATA)
I sent them to cvs-admin, thank you.
Updated by hsbt (Hiroshi SHIBATA) 13 days ago
Thanks. I've finished your accounts.
You can merge https://github.com/ruby/ruby/pull/11653 by yourself.