@@ -102,24 +102,32 @@ def test_get_system_info(snapshotter: Snapshotter, now: datetime) -> None:
102102 max_memory_size = ByteSize .from_gb (12 ),
103103 max_used_memory_ratio = 0.8 ,
104104 created_at = now - timedelta (seconds = 90 ),
105+ system_wide_used_size = None ,
106+ system_wide_memory_size = None ,
105107 ),
106108 MemorySnapshot (
107109 current_size = ByteSize .from_gb (7 ),
108110 max_memory_size = ByteSize .from_gb (8 ),
109111 max_used_memory_ratio = 0.8 ,
110112 created_at = now - timedelta (seconds = 60 ),
113+ system_wide_used_size = None ,
114+ system_wide_memory_size = None ,
111115 ),
112116 MemorySnapshot (
113117 current_size = ByteSize .from_gb (28 ),
114118 max_memory_size = ByteSize .from_gb (30 ),
115119 max_used_memory_ratio = 0.8 ,
116120 created_at = now - timedelta (seconds = 30 ),
121+ system_wide_used_size = None ,
122+ system_wide_memory_size = None ,
117123 ),
118124 MemorySnapshot (
119125 current_size = ByteSize .from_gb (48 ),
120126 max_memory_size = ByteSize .from_gb (60 ),
121127 max_used_memory_ratio = 0.8 ,
122128 created_at = now ,
129+ system_wide_used_size = None ,
130+ system_wide_memory_size = None ,
123131 ),
124132 ]
125133 )
@@ -204,3 +212,42 @@ def test_client_overloaded(
204212
205213 # Ratio of overloaded snapshots is 2/3 (2 minutes out of 3)
206214 assert system_status ._is_client_overloaded ().is_overloaded == is_overloaded
215+
216+
217+ def test_memory_overloaded_system_wide (snapshotter : Snapshotter , now : datetime ) -> None :
218+ """Test that system-wide memory overload is detected when system-wide memory utilization exceeds threshold."""
219+ system_status = SystemStatus (
220+ snapshotter ,
221+ max_snapshot_age = timedelta (minutes = 1 ),
222+ memory_overload_threshold = 0.5 , # Set high threshold so process memory won't trigger overload
223+ )
224+
225+ # Add memory snapshots with system-wide memory usage above threshold (97%)
226+ system_status ._snapshotter ._memory_snapshots = Snapshotter ._get_sorted_list_by_created_at (
227+ [
228+ MemorySnapshot (
229+ current_size = ByteSize .from_gb (1 ), # Process memory is low
230+ max_memory_size = ByteSize .from_gb (8 ), # Max memory is high
231+ max_used_memory_ratio = 0.8 , # Ratio is fine
232+ created_at = now - timedelta (minutes = 1 ),
233+ system_wide_used_size = ByteSize .from_gb (31 ), # System-wide used is high
234+ system_wide_memory_size = ByteSize .from_gb (32 ), # System-wide total (31/32 = 96.875% < 97%)
235+ ),
236+ MemorySnapshot (
237+ current_size = ByteSize .from_gb (1 ), # Process memory is low
238+ max_memory_size = ByteSize .from_gb (8 ), # Max memory is high
239+ max_used_memory_ratio = 0.8 , # Ratio is fine
240+ created_at = now ,
241+ system_wide_used_size = ByteSize .from_gb (31.5 ), # System-wide used is high
242+ system_wide_memory_size = ByteSize .from_gb (32 ), # System-wide total (31.5/32 = 98.4% > 97%)
243+ ),
244+ ]
245+ )
246+
247+ memory_info = system_status ._is_memory_overloaded ()
248+
249+ # Should be overloaded due to system-wide memory usage exceeding 97% threshold
250+ assert memory_info .is_overloaded is True
251+ # The actual ratio should be 1.0 (the entire time period from first to second snapshot is overloaded)
252+ assert memory_info .actual_ratio == 1.0
253+ assert memory_info .limit_ratio == 0.5
0 commit comments