in providers/darwin/host_darwin.go [68:138]
func (h *host) Memory() (*types.HostMemoryInfo, error) {
var mem types.HostMemoryInfo
// Total physical memory.
total, err := MemTotal()
if err != nil {
return nil, fmt.Errorf("failed to get total physical memory: %w", err)
}
mem.Total = total
// Page size for computing byte totals.
pageSizeBytes, err := getPageSize()
if err != nil {
return nil, fmt.Errorf("failed to get page size: %w", err)
}
// Swap
swap, err := getSwapUsage()
if err != nil {
return nil, fmt.Errorf("failed to get swap usage: %w", err)
}
mem.VirtualTotal = swap.Total
mem.VirtualUsed = swap.Used
mem.VirtualFree = swap.Available
// Virtual Memory Statistics
vmStat, err := getHostVMInfo64()
if errors.Is(err, types.ErrNotImplemented) {
return &mem, nil
}
if err != nil {
return nil, fmt.Errorf("failed to get virtual memory statistics: %w", err)
}
inactiveBytes := uint64(vmStat.Inactive_count) * pageSizeBytes
purgeableBytes := uint64(vmStat.Purgeable_count) * pageSizeBytes
mem.Metrics = map[string]uint64{
"active_bytes": uint64(vmStat.Active_count) * pageSizeBytes,
"compressed_bytes": uint64(vmStat.Compressor_page_count) * pageSizeBytes,
"compressions_bytes": uint64(vmStat.Compressions) * pageSizeBytes, // Cumulative compressions.
"copy_on_write_faults": vmStat.Cow_faults,
"decompressions_bytes": uint64(vmStat.Decompressions) * pageSizeBytes, // Cumulative decompressions.
"external_bytes": uint64(vmStat.External_page_count) * pageSizeBytes, // File Cache / File-backed pages
"inactive_bytes": inactiveBytes,
"internal_bytes": uint64(vmStat.Internal_page_count) * pageSizeBytes, // App Memory / Anonymous
"page_ins_bytes": uint64(vmStat.Pageins) * pageSizeBytes,
"page_outs_bytes": uint64(vmStat.Pageouts) * pageSizeBytes,
"purgeable_bytes": purgeableBytes,
"purged_bytes": uint64(vmStat.Purges) * pageSizeBytes,
"reactivated_bytes": uint64(vmStat.Reactivations) * pageSizeBytes,
"speculative_bytes": uint64(vmStat.Speculative_count) * pageSizeBytes,
"swap_ins_bytes": uint64(vmStat.Swapins) * pageSizeBytes,
"swap_outs_bytes": uint64(vmStat.Swapouts) * pageSizeBytes,
"throttled_bytes": uint64(vmStat.Throttled_count) * pageSizeBytes,
"translation_faults": vmStat.Faults,
"uncompressed_bytes": uint64(vmStat.Total_uncompressed_pages_in_compressor) * pageSizeBytes,
"wired_bytes": uint64(vmStat.Wire_count) * pageSizeBytes,
"zero_filled_bytes": uint64(vmStat.Zero_fill_count) * pageSizeBytes,
}
// From Activity Monitor: Memory Used = App Memory (internal) + Wired + Compressed
// https://support.apple.com/en-us/HT201538
mem.Used = uint64(vmStat.Internal_page_count+vmStat.Wire_count+vmStat.Compressor_page_count) * pageSizeBytes
mem.Free = uint64(vmStat.Free_count) * pageSizeBytes
mem.Available = mem.Free + inactiveBytes + purgeableBytes
return &mem, nil
}