主机内存总量改从 /proc/meminfo 读

os.totalmem() 底层是 sysinfo() 系统调用,LXC 里 lxcfs 只虚拟化 /proc
文件、拦不住系统调用,导致容器里显示的是宿主机的物理内存总量。
从 /proc/meminfo 读 MemTotal 才是容器限额,且与 MemAvailable 同源。
This commit is contained in:
2026-08-12 16:38:19 +08:00
parent 5c924db235
commit b28fc572f7
3 changed files with 33 additions and 4 deletions
+19 -3
View File
@@ -11,6 +11,7 @@ export interface HostInfo {
/** 0-100。第一次请求没有参照快照,是 null */
cpuUsage: number | null
cpuCount: number
/** 内存总量。Linux 用 MemTotal,其余平台退回 totalmem */
memTotal: number
/** 还能用的内存。Linux 用 MemAvailable,其余平台退回 freemem */
memAvailable: number
@@ -37,13 +38,28 @@ export interface ExitProbe {
message?: string
}
/** /proc/meminfo 里的 MemAvailable(内核估算的「还能用多少」),换算成字节。 */
export function parseMemAvailable(meminfo: string): number | null {
const match = /^MemAvailable:\s+(\d+)\s*kB/m.exec(meminfo)
function meminfoBytes(meminfo: string, field: string): number | null {
const match = new RegExp(`^${field}:\\s+(\\d+)\\s*kB`, 'm').exec(meminfo)
if (!match) return null
return Number(match[1]) * 1024
}
/**
* /proc/meminfo 里的 MemTotal,换算成字节。
*
* 不能用 os.totalmem():它底层是 sysinfo() 系统调用,LXC 里的 lxcfs 只虚拟化
* /proc 下的文件、拦不住系统调用,所以 sysinfo() 返回的是宿主机的物理内存总量。
* 从 /proc/meminfo 读才是容器视角,且与 MemAvailable 出自同一份数据。
*/
export function parseMemTotal(meminfo: string): number | null {
return meminfoBytes(meminfo, 'MemTotal')
}
/** /proc/meminfo 里的 MemAvailable(内核估算的「还能用多少」),换算成字节。 */
export function parseMemAvailable(meminfo: string): number | null {
return meminfoBytes(meminfo, 'MemAvailable')
}
/**
* /proc/net/route 里的默认网关。
*