Project

General

Profile

Actions

Bug #21119

open

Programs containing `Dir.glob` with a thread executing a CPU-heavy task run very slowly.

Added by genya0407 (Yusuke Sangenya) 16 days ago. Updated 9 days ago.

Status:
Open
Assignee:
-
Target version:
-
ruby -v:
ruby 3.5.0dev (2025-02-06T14:10:34Z master adbf9c5b36) +PRISM [arm64-darwin24]
[ruby-core:120897]

Description

Executing the following code in Ruby 3.4.1 takes a very long time, especially when there are many files (100~) in the current directory.
This delay does not occur in Ruby 3.3.6.

Reproducible script

# hoge.rb

# Launch a thread to execute CPU-heavy task
Thread.new do
  loop do
    arr = []
    100.times do
     arr << rand(1...100)
    end
  end
end

# Execute a program containing `Dir.glob` in the main thread.
10.times do
  Dir.glob('*')
  puts "aaaa"
end

Execution Results

Executing the above code in Ruby 3.4.1 takes 119.43s.

$ ruby -v
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [arm64-darwin24]

$ time ruby hoge.rb
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
ruby hoge.rb  119.43s user 0.30s system 99% cpu 1:59.89 total

Executing it in Ruby master also takes 118.87s.

$ ~/opt-ruby/bin/ruby -v
ruby 3.5.0dev (2025-02-06T14:10:34Z master adbf9c5b36) +PRISM [arm64-darwin24]

$ time ~/opt-ruby/bin/ruby hoge.rb
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
~/opt-ruby/bin/ruby hoge.rb  118.87s user 0.46s system 99% cpu 2:00.45 total

Executing it in Ruby 3.3.6 takes only 2.22s.

$ ruby -v
ruby 3.3.6 (2024-11-05 revision 75015d4c1f) [arm64-darwin24]

$ time ruby hoge.rb
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
aaaa
ruby hoge.rb  2.22s user 0.03s system 98% cpu 2.286 total

So, there are roughly 50x delays.

Possible Cause

From Ruby 3.4.0, Dir.glob releases the GVL frequently.

Due to this change, when a CPU-heavy thread releases the GVL, Dir.glob also releases the GVL immediately.
As a result, Dir.glob gets significantly delayed because it has to continuously regain the GVL causing a major slowdown in execution.

Note about Execution Results

I measured the execution results under a stress condition, with 100 files in the current directory.
If there are fewer files, the slowdown may be less pronounced.


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #20587: dir.c calls blocking filesystem APIs/system calls while holding the GVLClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0