[improv] 改进Linux可用内存采集,改变系统内核的悲观预测。MemAvailable是系统内核预测的可用内存,过低则认为不能安全分配给新进程,可能过于悲观;MemFree是完全空闲的内存,未被使用的物理内存页,但内核不敢用;

This commit is contained in:
智能大石头 2025-07-29 20:29:29 +08:00
parent ab6eacceab
commit da2fa56053
1 changed files with 11 additions and 7 deletions

View File

@ -691,13 +691,17 @@ public class MachineInfo : IExtend
if (dic.TryGetValue("MemTotal", out var str) && !str.IsNullOrEmpty())
Memory = (UInt64)str.TrimEnd(" kB").ToInt() * 1024;
if (dic.TryGetValue("MemAvailable", out str) && !str.IsNullOrEmpty())
AvailableMemory = (UInt64)str.TrimEnd(" kB").ToInt() * 1024;
else if (dic.TryGetValue("MemFree", out str) && !str.IsNullOrEmpty())
AvailableMemory =
(UInt64)(str.TrimEnd(" kB").ToInt() +
dic["Buffers"]?.TrimEnd(" kB").ToInt() ?? 0 +
dic["Cached"]?.TrimEnd(" kB").ToInt() ?? 0) * 1024;
// MemAvailable是系统内核预测的可用内存过低则认为不能安全分配给新进程可能过于悲观
// MemFree是完全空闲的内存未被使用的物理内存页但内核不敢用
var ma = (UInt64)(dic["MemAvailable"]?.TrimEnd(" kB").ToInt() ?? 0) * 1024;
var mf = (UInt64)(dic["MemFree"]?.TrimEnd(" kB").ToInt() ?? 0) * 1024;
var mc = (UInt64)(dic["Cached"]?.TrimEnd(" kB").ToInt() ?? 0) * 1024;
// 空闲内存 100% 可用,缓存内存 40% 可快速回收(保守估计)
mf += (UInt64)(mc * 0.4);
if (mf > 5ul * 1024 * 1024 * 1024) mf = 5ul * 1024 * 1024 * 1024;
AvailableMemory = ma > mf ? ma : mf;
}
// A2/A4温度获取BuildrootCPU温度和主板温度