Skip to content

Commit 916f916

Browse files
Introduce #private_size.
1 parent ebac4b4 commit 916f916

3 files changed

Lines changed: 40 additions & 2 deletions

File tree

lib/process/metrics/memory.rb

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,30 @@ def total_size
2323
self.resident_size + self.swap_size
2424
end
2525

26-
# The unique set size, the size of completely private (unshared) data.
27-
def unique_size
26+
# The private set size, the size of completely private (unshared) data.
27+
# This is the sum of Private_Clean and Private_Dirty pages.
28+
# @returns [Integer] Total private memory in bytes.
29+
def private_size
2830
self.private_clean_size + self.private_dirty_size
2931
end
3032

33+
# The private set size is also known as the unique set size.
34+
alias unique_size private_size
35+
36+
# The total size of shared (potentially shared with other processes) memory.
37+
# This is the sum of Shared_Clean and Shared_Dirty pages.
38+
#
39+
# When tracking Copy-on-Write (CoW) activity in forked processes:
40+
# - Initially, most memory is shared between parent and child.
41+
# - As the child writes to memory, CoW triggers and shared pages become private.
42+
# - Tracking shared_size decrease vs unique_size increase can indicate CoW activity.
43+
# - If shared_size decreases by X and unique_size increases by ~X, it's likely CoW.
44+
#
45+
# @returns [Integer] Total shared memory in bytes.
46+
def shared_size
47+
self.shared_clean_size + self.shared_dirty_size
48+
end
49+
3150
# Create a zero-initialized Memory instance.
3251
# @returns [Memory] A new Memory object with all fields set to zero.
3352
def self.zero

releases.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Releases
22

3+
## Unreleased
4+
5+
- Add `Process::Metrics::Memory#private_size` for the sum of private (unshared) pages (Private_Clean + Private_Dirty); `#unique_size` is now an alias for `#private_size`.
6+
37
## v0.10.1
48

59
- Consistent use of `_size` suffix.

test/process/memory.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,20 @@
5555
"map_count", "resident_size", "proportional_size", "shared_clean_size", "shared_dirty_size", "private_clean_size", "private_dirty_size", "referenced_size", "anonymous_size", "swap_size", "proportional_swap_size", "minor_faults", "major_faults"
5656
)
5757
end
58+
59+
it "can calculate shared_size and unique_size" do
60+
unless memory = capture[pid].memory
61+
skip "Detailed memory information is not available on this platform!"
62+
end
63+
64+
shared_size = memory.shared_size
65+
unique_size = memory.unique_size
66+
67+
expect(shared_size).to be >= 0
68+
expect(unique_size).to be >= 0
69+
expect(shared_size).to be == (memory.shared_clean_size + memory.shared_dirty_size)
70+
expect(unique_size).to be == (memory.private_clean_size + memory.private_dirty_size)
71+
expect(memory.private_size).to be == unique_size
72+
end
5873
end
5974
end

0 commit comments

Comments
 (0)