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)
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0