Project

General

Profile

Actions

Feature #20782

open

Introduction of Happy Eyeballs Version 2 (RFC8305) in TCPSocket.new

Added by shioimm (Misaki Shioi) about 1 month ago. Updated 3 days ago.

Status:
Assigned
Target version:
-
[ruby-core:119442]

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) 28 days ago

  • Status changed from Open to Assigned
  • Assignee set to naruse (Yui NARUSE)

Updated by hsbt (Hiroshi SHIBATA) 4 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) 3 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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0