Feature #17679
open
Ractor incoming channel can consume unlimited resources
Added by marcotc (Marco Costa) over 3 years ago.
Updated about 1 year ago.
Description
Background¶
In the ddtrace gem, we want to move telemetry trace sending to a separate background Ractor. We’re concerned that if something goes wrong/gets delayed in this background Ractor, more and more data will accumulate in the send/receive channel until the Ruby VM crashes because it runs out of memory.
How to reproduce (Ruby version & script)¶
receiver_ractor = Ractor.new do
loop do
message = Ractor.receive
sleep 1
puts "Processed #{message}"
end
end
counter = 0
while true
counter += 1
receiver_ractor.send(counter)
end
Expectation and result¶
The result is that the Ruby VM crashes due to out of memory.
We expect the Ruby VM to not crash.
Suggested solutions¶
Some ideas on how this can be improved:
- Having a way for the sender of data to detect if the receiver Ractor is falling behind (approximate size of queue, timestamp of last processed item, or similar?).
- Having a way to limit the Ractor message receive buffer.
Related issues
1 (1 open — 0 closed)
- Tags set to ractor
- Status changed from Open to Assigned
- Assignee set to ko1 (Koichi Sasada)
It's not clear to me that this should be implemented at the Ractor level.
Both suggested approaches can be handled in Ruby, for example using an intermediary Ractor...
DONE = Object.new.freeze
MIDDLEMAN = Ractor.new do
on_queue = 0
loop do
message = Ractor.receive
if message == DONE
on_queue -= 1
else
if (on_queue > 32_000)
puts "Too many requests, skipping #{message}"
next
end
on_queue += 1
DOER.send(message)
end
end
end
DOER = Ractor.new do
loop do
message = Ractor.receive
sleep 0.01
puts "Processed #{message}"
MIDDLEMAN.send(DONE)
end
end
counter = 0
while true
counter += 1
MIDDLEMAN.send(counter)
end
If/when a non-blocking receive
will be available, the receiving ractor could also handle it's waiting queue internally
- Related to Feature #18814: Ractor: add method to query incoming message queue size added
- Tracker changed from Bug to Feature
- ruby -v deleted (
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux])
- Backport deleted (
2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN)
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0