Class: Raptor::Stats
- Inherits:
-
Object
- Object
- Raptor::Stats
- Defined in:
- lib/raptor/stats.rb
Overview
Shared memory store for per-worker process statistics.
Stats uses an anonymous mmap (MAP_ANON | MAP_SHARED) created before forking so that worker processes can write their stats and the master process can read them without any pipes or signals. Each worker is assigned a fixed-size slot in the shared region.
Binary layout per slot (native byte order):
pid uint32 4 bytes
index uint32 4 bytes
phase uint32 4 bytes
requests uint64 8 bytes
backlog uint32 4 bytes
busy_threads uint32 4 bytes
thread_capacity uint32 4 bytes
started_at float64 8 bytes
last_checkin float64 8 bytes
booted uint8 1 byte
49 bytes total
Constant Summary collapse
- SLOT_FORMAT =
"LLLQLLLddC"- SLOT_SIZE =
[0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0].pack(SLOT_FORMAT).bytesize
Instance Method Summary collapse
-
#all ⇒ Array<Hash>
Returns stats for all worker slots.
-
#initialize(num_workers) ⇒ void
constructor
Allocates the shared mmap region.
-
#unmap ⇒ void
Releases the shared memory mapping.
-
#write(index, pid:, phase:, requests:, backlog:, busy_threads:, thread_capacity:, started_at:, last_checkin:, booted:) ⇒ void
Writes stats for a worker slot into shared memory.
Constructor Details
#initialize(num_workers) ⇒ void
Allocates the shared mmap region. Must be called before forking workers so the mapping is inherited by every child process.
41 42 43 44 |
# File 'lib/raptor/stats.rb', line 41 def initialize(num_workers) @num_workers = num_workers @mmap = Mmap.new(nil, length: num_workers * SLOT_SIZE, initialize: "\0") end |
Instance Method Details
#all ⇒ Array<Hash>
Returns stats for all worker slots.
71 72 73 |
# File 'lib/raptor/stats.rb', line 71 def all (0...@num_workers).map { |index| read(index) } end |
#unmap ⇒ void
This method returns an undefined value.
Releases the shared memory mapping.
80 81 82 |
# File 'lib/raptor/stats.rb', line 80 def unmap @mmap.unmap end |
#write(index, pid:, phase:, requests:, backlog:, busy_threads:, thread_capacity:, started_at:, last_checkin:, booted:) ⇒ void
This method returns an undefined value.
Writes stats for a worker slot into shared memory.
61 62 63 64 |
# File 'lib/raptor/stats.rb', line 61 def write(index, pid:, phase:, requests:, backlog:, busy_threads:, thread_capacity:, started_at:, last_checkin:, booted:) data = [pid, index, phase, requests, backlog, busy_threads, thread_capacity, started_at, last_checkin, booted ? 1 : 0].pack(SLOT_FORMAT) @mmap.semlock { @mmap[index * SLOT_SIZE, SLOT_SIZE] = data } end |