mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Add maximum memory limit.
PiperOrigin-RevId: 310179277
This commit is contained in:
committed by
gVisor bot
parent
8416da33d2
commit
591ff0e424
@@ -58,12 +58,16 @@ func (d *meminfoData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle)
|
||||
|
||||
var buf bytes.Buffer
|
||||
fmt.Fprintf(&buf, "MemTotal: %8d kB\n", totalSize/1024)
|
||||
memFree := (totalSize - totalUsage) / 1024
|
||||
memFree := totalSize - totalUsage
|
||||
if memFree > totalSize {
|
||||
// Underflow.
|
||||
memFree = 0
|
||||
}
|
||||
// We use MemFree as MemAvailable because we don't swap.
|
||||
// TODO(rahat): When reclaim is implemented the value of MemAvailable
|
||||
// should change.
|
||||
fmt.Fprintf(&buf, "MemFree: %8d kB\n", memFree)
|
||||
fmt.Fprintf(&buf, "MemAvailable: %8d kB\n", memFree)
|
||||
fmt.Fprintf(&buf, "MemFree: %8d kB\n", memFree/1024)
|
||||
fmt.Fprintf(&buf, "MemAvailable: %8d kB\n", memFree/1024)
|
||||
fmt.Fprintf(&buf, "Buffers: 0 kB\n") // memory usage by block devices
|
||||
fmt.Fprintf(&buf, "Cached: %8d kB\n", (file+snapshot.Tmpfs)/1024)
|
||||
// Emulate a system with no swap, which disables inactivation of anon pages.
|
||||
|
||||
@@ -272,12 +272,16 @@ func (*meminfoData) Generate(ctx context.Context, buf *bytes.Buffer) error {
|
||||
inactiveFile := file - activeFile
|
||||
|
||||
fmt.Fprintf(buf, "MemTotal: %8d kB\n", totalSize/1024)
|
||||
memFree := (totalSize - totalUsage) / 1024
|
||||
memFree := totalSize - totalUsage
|
||||
if memFree > totalSize {
|
||||
// Underflow.
|
||||
memFree = 0
|
||||
}
|
||||
// We use MemFree as MemAvailable because we don't swap.
|
||||
// TODO(rahat): When reclaim is implemented the value of MemAvailable
|
||||
// should change.
|
||||
fmt.Fprintf(buf, "MemFree: %8d kB\n", memFree)
|
||||
fmt.Fprintf(buf, "MemAvailable: %8d kB\n", memFree)
|
||||
fmt.Fprintf(buf, "MemFree: %8d kB\n", memFree/1024)
|
||||
fmt.Fprintf(buf, "MemAvailable: %8d kB\n", memFree/1024)
|
||||
fmt.Fprintf(buf, "Buffers: 0 kB\n") // memory usage by block devices
|
||||
fmt.Fprintf(buf, "Cached: %8d kB\n", (file+snapshot.Tmpfs)/1024)
|
||||
// Emulate a system with no swap, which disables inactivation of anon pages.
|
||||
|
||||
@@ -29,13 +29,18 @@ func Sysinfo(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
mf.UpdateUsage()
|
||||
_, totalUsage := usage.MemoryAccounting.Copy()
|
||||
totalSize := usage.TotalMemory(mf.TotalSize(), totalUsage)
|
||||
memFree := totalSize - totalUsage
|
||||
if memFree > totalSize {
|
||||
// Underflow.
|
||||
memFree = 0
|
||||
}
|
||||
|
||||
// Only a subset of the fields in sysinfo_t make sense to return.
|
||||
si := linux.Sysinfo{
|
||||
Procs: uint16(len(t.PIDNamespace().Tasks())),
|
||||
Uptime: t.Kernel().MonotonicClock().Now().Seconds(),
|
||||
TotalRAM: totalSize,
|
||||
FreeRAM: totalSize - totalUsage,
|
||||
FreeRAM: memFree,
|
||||
Unit: 1,
|
||||
}
|
||||
_, err := t.CopyOut(addr, si)
|
||||
|
||||
@@ -252,18 +252,23 @@ func (m *MemoryLocked) Copy() (MemoryStats, uint64) {
|
||||
return ms, m.totalLocked()
|
||||
}
|
||||
|
||||
// MinimumTotalMemoryBytes is the minimum reported total system memory.
|
||||
//
|
||||
// This can be configured through options provided to the Sentry at start.
|
||||
// This number is purely synthetic. This is only set before the application
|
||||
// starts executing, and must not be modified.
|
||||
var MinimumTotalMemoryBytes uint64 = 2 << 30 // 2 GB
|
||||
// These options control how much total memory the is reported to the application.
|
||||
// They may only be set before the application starts executing, and must not
|
||||
// be modified.
|
||||
var (
|
||||
// MinimumTotalMemoryBytes is the minimum reported total system memory.
|
||||
MinimumTotalMemoryBytes uint64 = 2 << 30 // 2 GB
|
||||
|
||||
// MaximumTotalMemoryBytes is the maximum reported total system memory.
|
||||
// The 0 value indicates no maximum.
|
||||
MaximumTotalMemoryBytes uint64
|
||||
)
|
||||
|
||||
// TotalMemory returns the "total usable memory" available.
|
||||
//
|
||||
// This number doesn't really have a true value so it's based on the following
|
||||
// inputs and further bounded to be above some minimum guaranteed value (2GB),
|
||||
// additionally ensuring that total memory reported is always less than used.
|
||||
// inputs and further bounded to be above the MinumumTotalMemoryBytes and below
|
||||
// MaximumTotalMemoryBytes.
|
||||
//
|
||||
// memSize should be the platform.Memory size reported by platform.Memory.TotalSize()
|
||||
// used is the total memory reported by MemoryLocked.Total()
|
||||
@@ -279,5 +284,8 @@ func TotalMemory(memSize, used uint64) uint64 {
|
||||
memSize = uint64(1) << (uint(msb) + 1)
|
||||
}
|
||||
}
|
||||
if MaximumTotalMemoryBytes > 0 && memSize > MaximumTotalMemoryBytes {
|
||||
memSize = MaximumTotalMemoryBytes
|
||||
}
|
||||
return memSize
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user