Bug #21119
Updated by genya0407 (Yusuke Sangenya) 10 months ago
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
```ruby
# 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 Executiong the above code in Ruby 3.4.1 takes **119.43s**.
```shell
$ 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**.
```shell
$ ~/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**.
```shell
$ 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.
* https://bugs.ruby-lang.org/issues/20587
* https://github.com/ruby/ruby/pull/11147
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.