Class: Gitlab::Chaos
- Inherits:
-
Object
- Object
- Gitlab::Chaos
- Defined in:
- lib/gitlab/chaos.rb
Overview
Chaos methods for GitLab. See docs.gitlab.com/ee/development/chaos_endpoints.html for more details.
Class Method Summary collapse
-
.cpu_spin(duration_s) ⇒ Object
cpu_spin will consume all CPU on a single core for the specified duration.
-
.db_spin(duration_s, interval_s) ⇒ Object
db_spin will query the database in a tight loop for the specified duration.
-
.kill(signal) ⇒ Object
Kill will send the given signal to the current process.
-
.leak_mem(memory_mb, duration_s) ⇒ Object
leak_mem will retain the specified amount of memory and sleep.
- .run_gc ⇒ Object
-
.sleep(duration_s) ⇒ Object
sleep will sleep for the specified duration.
Class Method Details
.cpu_spin(duration_s) ⇒ Object
cpu_spin will consume all CPU on a single core for the specified duration
21 22 23 24 25 26 27 |
# File 'lib/gitlab/chaos.rb', line 21 def self.cpu_spin(duration_s) return unless Gitlab::Metrics::System.thread_cpu_time expected_end_time = Gitlab::Metrics::System.thread_cpu_time + duration_s rand while Gitlab::Metrics::System.thread_cpu_time < expected_end_time end |
.db_spin(duration_s, interval_s) ⇒ Object
db_spin will query the database in a tight loop for the specified duration
30 31 32 33 34 35 36 37 38 39 |
# File 'lib/gitlab/chaos.rb', line 30 def self.db_spin(duration_s, interval_s) expected_end_time = Time.now + duration_s while Time.now < expected_end_time ApplicationRecord.connection.execute("SELECT 1") end_interval_time = Time.now + [duration_s, interval_s].min rand while Time.now < end_interval_time end end |
.kill(signal) ⇒ Object
Kill will send the given signal to the current process.
47 48 49 |
# File 'lib/gitlab/chaos.rb', line 47 def self.kill(signal) Process.kill(signal, Process.pid) end |
.leak_mem(memory_mb, duration_s) ⇒ Object
leak_mem will retain the specified amount of memory and sleep. On return, the memory will be released.
9 10 11 12 13 14 15 16 17 18 |
# File 'lib/gitlab/chaos.rb', line 9 def self.leak_mem(memory_mb, duration_s) start_time = Time.now retainer = [] # Add `n` 1mb chunks of memory to the retainer array memory_mb.times { retainer << ("x" * 1.megabyte) } duration_left = [start_time + duration_s - Time.now, 0].max Kernel.sleep(duration_left) end |
.run_gc ⇒ Object
51 52 53 54 55 56 57 |
# File 'lib/gitlab/chaos.rb', line 51 def self.run_gc # Tenure any live objects from young-gen to old-gen 4.times { GC.start(full_mark: false) } # Run a full mark-and-sweep collection GC.start GC.stat end |
.sleep(duration_s) ⇒ Object
sleep will sleep for the specified duration
42 43 44 |
# File 'lib/gitlab/chaos.rb', line 42 def self.sleep(duration_s) Kernel.sleep(duration_s) end |