mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-25 13:36:50 +00:00
fix(observability): fallback mimalloc requested memory stats (#5695)
Co-authored-by: heihutu <heihutu@gmail.com>
This commit is contained in:
@@ -259,16 +259,32 @@ fn mimalloc_stat_current(value: &Value, metric: &str) -> Option<u64> {
|
|||||||
mimalloc_stat_field(value, metric, "current")
|
mimalloc_stat_field(value, metric, "current")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(test, not(target_os = "windows")))]
|
||||||
|
fn mimalloc_stat_sum(value: &Value, metrics: &[&str], field: &str) -> Option<u64> {
|
||||||
|
metrics
|
||||||
|
.iter()
|
||||||
|
.map(|metric| mimalloc_stat_field(value, metric, field))
|
||||||
|
.try_fold(0_u64, |sum, value| value.map(|value| sum.saturating_add(value)))
|
||||||
|
.filter(|value| *value > 0)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(any(test, not(target_os = "windows")))]
|
#[cfg(any(test, not(target_os = "windows")))]
|
||||||
fn parse_mimalloc_stats_json(stats_json: &str) -> Option<AllocatorMemoryObservation> {
|
fn parse_mimalloc_stats_json(stats_json: &str) -> Option<AllocatorMemoryObservation> {
|
||||||
let value = serde_json::from_str::<Value>(stats_json).ok()?;
|
let value = serde_json::from_str::<Value>(stats_json).ok()?;
|
||||||
|
let malloc_metrics = ["malloc_normal", "malloc_huge"];
|
||||||
let observation = AllocatorMemoryObservation {
|
let observation = AllocatorMemoryObservation {
|
||||||
reserved_bytes: mimalloc_stat_current(&value, "reserved"),
|
reserved_bytes: mimalloc_stat_current(&value, "reserved"),
|
||||||
committed_bytes: mimalloc_stat_current(&value, "committed"),
|
committed_bytes: mimalloc_stat_current(&value, "committed"),
|
||||||
page_committed_bytes: mimalloc_stat_current(&value, "page_committed"),
|
page_committed_bytes: mimalloc_stat_current(&value, "page_committed"),
|
||||||
malloc_requested_bytes: mimalloc_stat_current(&value, "malloc_requested"),
|
malloc_requested_bytes: mimalloc_stat_current(&value, "malloc_requested")
|
||||||
malloc_requested_peak_bytes: mimalloc_stat_field(&value, "malloc_requested", "peak"),
|
.filter(|value| *value > 0)
|
||||||
malloc_requested_total_bytes: mimalloc_stat_field(&value, "malloc_requested", "total"),
|
.or_else(|| mimalloc_stat_sum(&value, &malloc_metrics, "current")),
|
||||||
|
malloc_requested_peak_bytes: mimalloc_stat_field(&value, "malloc_requested", "peak")
|
||||||
|
.filter(|value| *value > 0)
|
||||||
|
.or_else(|| mimalloc_stat_sum(&value, &malloc_metrics, "peak")),
|
||||||
|
malloc_requested_total_bytes: mimalloc_stat_field(&value, "malloc_requested", "total")
|
||||||
|
.filter(|value| *value > 0)
|
||||||
|
.or_else(|| mimalloc_stat_sum(&value, &malloc_metrics, "total")),
|
||||||
heap_count: mimalloc_stat_current(&value, "heaps").or_else(|| mimalloc_stat_current(&value, "heap_count")),
|
heap_count: mimalloc_stat_current(&value, "heaps").or_else(|| mimalloc_stat_current(&value, "heap_count")),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -504,6 +520,30 @@ mod tests {
|
|||||||
assert_eq!(parsed.heap_count, Some(8));
|
assert_eq!(parsed.heap_count, Some(8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_mimalloc_stats_json_falls_back_to_allocated_bytes_when_requested_is_zero() {
|
||||||
|
let parsed = parse_mimalloc_stats_json(
|
||||||
|
r#"{
|
||||||
|
"stat_version": 1,
|
||||||
|
"mimalloc_version": 300,
|
||||||
|
"reserved": { "total": 1048576, "peak": 1048576, "current": 1048576 },
|
||||||
|
"committed": { "total": 524288, "peak": 524288, "current": 524288 },
|
||||||
|
"malloc_normal": { "total": 7340032, "peak": 262144, "current": 196608 },
|
||||||
|
"malloc_huge": { "total": 3145728, "peak": 131072, "current": 65536 },
|
||||||
|
"malloc_requested": { "total": 0, "peak": 0, "current": 0 },
|
||||||
|
"heaps": { "total": 1, "peak": 1, "current": 1 }
|
||||||
|
}"#,
|
||||||
|
)
|
||||||
|
.expect("mimalloc v3 stats should parse");
|
||||||
|
|
||||||
|
assert_eq!(parsed.reserved_bytes, Some(1_048_576));
|
||||||
|
assert_eq!(parsed.committed_bytes, Some(524_288));
|
||||||
|
assert_eq!(parsed.malloc_requested_bytes, Some(262_144));
|
||||||
|
assert_eq!(parsed.malloc_requested_peak_bytes, Some(393_216));
|
||||||
|
assert_eq!(parsed.malloc_requested_total_bytes, Some(10_485_760));
|
||||||
|
assert_eq!(parsed.heap_count, Some(1));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_mimalloc_stats_json_rejects_unrecognized_payload() {
|
fn parse_mimalloc_stats_json_rejects_unrecognized_payload() {
|
||||||
assert_eq!(parse_mimalloc_stats_json(r#"{ "allocator": "unknown" }"#), None);
|
assert_eq!(parse_mimalloc_stats_json(r#"{ "allocator": "unknown" }"#), None);
|
||||||
|
|||||||
Reference in New Issue
Block a user