mirror of
https://github.com/discourse/discourse.git
synced 2025-05-02 01:14:41 +08:00

What does this change do? This change adds a hidden `track_gc_stat_per_request` site setting which when enabled will track the time spent in GC, major GC count and minor GC count during a request. Why is this change needed? We have plans to tune our GC in production but without any instrumentation, we will not be able to know if our tuning is effective or not. This commit takes the first step at instrumenting some basic GC stats in core during a request which can then be consumed by the discourse-prometheus plugin.
61 lines
1.4 KiB
Ruby
61 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe MethodProfiler do
|
|
class Sneetch
|
|
def beach
|
|
end
|
|
|
|
def recurse(count = 5)
|
|
recurse(count - 1) if count > 0
|
|
end
|
|
end
|
|
|
|
it "can bypass recursion on demand" do
|
|
MethodProfiler.patch(Sneetch, [:recurse], :recurse, no_recurse: true)
|
|
|
|
MethodProfiler.start
|
|
Sneetch.new.recurse
|
|
result = MethodProfiler.stop
|
|
|
|
expect(result[:recurse][:calls]).to eq(1)
|
|
end
|
|
|
|
it "can transfer data between threads" do
|
|
MethodProfiler.patch(Sneetch, [:beach], :at_beach)
|
|
|
|
MethodProfiler.start
|
|
Sneetch.new.beach
|
|
data = MethodProfiler.transfer
|
|
result = nil
|
|
Thread
|
|
.new do
|
|
MethodProfiler.start(data)
|
|
Sneetch.new.beach
|
|
result = MethodProfiler.stop
|
|
end
|
|
.join
|
|
|
|
expect(result[:at_beach][:calls]).to eq(2)
|
|
end
|
|
|
|
it "profiles GC stat information when `track_gc_stat_per_request` site setting has been enabled" do
|
|
MethodProfiler.start
|
|
GC.start(full_mark: false) # Minor GC
|
|
result = MethodProfiler.stop
|
|
|
|
expect(result[:gc]).not_to be_present
|
|
|
|
SiteSetting.track_gc_stat_per_request = true
|
|
|
|
MethodProfiler.start
|
|
GC.start(full_mark: true) # Major GC
|
|
GC.start(full_mark: false) # Minor GC
|
|
result = MethodProfiler.stop
|
|
|
|
expect(result[:gc]).to be_present
|
|
expect(result[:gc][:time]).to be >= 0.0
|
|
expect(result[:gc][:major_count]).to eq(1)
|
|
expect(result[:gc][:minor_count]).to eq(1)
|
|
end
|
|
end
|