mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-11 21:27:31 +00:00
util/sysresources, magicsock: scale DERP buffer based on system memory
This adds the util/sysresources package, which currently only contains a function to return the total memory size of the current system. Then, we modify magicsock to scale the number of buffered DERP messages based on the system's available memory, ensuring that we never use a value lower than the previous constant of 32. Signed-off-by: Andrew Dunham <andrew@du.nham.ca> Change-Id: Ib763c877de4d0d4ee88869078e7d512f6a3a148d
This commit is contained in:
10
util/sysresources/memory.go
Normal file
10
util/sysresources/memory.go
Normal file
@@ -0,0 +1,10 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package sysresources
|
||||
|
||||
// TotalMemory returns the total accessible system memory, in bytes. If the
|
||||
// value cannot be determined, then 0 will be returned.
|
||||
func TotalMemory() uint64 {
|
||||
return totalMemoryImpl()
|
||||
}
|
16
util/sysresources/memory_bsd.go
Normal file
16
util/sysresources/memory_bsd.go
Normal file
@@ -0,0 +1,16 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build freebsd || openbsd || dragonfly || netbsd
|
||||
|
||||
package sysresources
|
||||
|
||||
import "golang.org/x/sys/unix"
|
||||
|
||||
func totalMemoryImpl() uint64 {
|
||||
val, err := unix.SysctlUint64("hw.physmem")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return val
|
||||
}
|
16
util/sysresources/memory_darwin.go
Normal file
16
util/sysresources/memory_darwin.go
Normal file
@@ -0,0 +1,16 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build darwin
|
||||
|
||||
package sysresources
|
||||
|
||||
import "golang.org/x/sys/unix"
|
||||
|
||||
func totalMemoryImpl() uint64 {
|
||||
val, err := unix.SysctlUint64("hw.memsize")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return val
|
||||
}
|
19
util/sysresources/memory_linux.go
Normal file
19
util/sysresources/memory_linux.go
Normal file
@@ -0,0 +1,19 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build linux
|
||||
|
||||
package sysresources
|
||||
|
||||
import "golang.org/x/sys/unix"
|
||||
|
||||
func totalMemoryImpl() uint64 {
|
||||
var info unix.Sysinfo_t
|
||||
|
||||
if err := unix.Sysinfo(&info); err != nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
// uint64 casts are required since these might be uint32s
|
||||
return uint64(info.Totalram) * uint64(info.Unit)
|
||||
}
|
8
util/sysresources/memory_unsupported.go
Normal file
8
util/sysresources/memory_unsupported.go
Normal file
@@ -0,0 +1,8 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build !(linux || darwin || freebsd || openbsd || dragonfly || netbsd)
|
||||
|
||||
package sysresources
|
||||
|
||||
func totalMemoryImpl() uint64 { return 0 }
|
6
util/sysresources/sysresources.go
Normal file
6
util/sysresources/sysresources.go
Normal file
@@ -0,0 +1,6 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Package sysresources provides OS-independent methods of determining the
|
||||
// resources available to the current system.
|
||||
package sysresources
|
25
util/sysresources/sysresources_test.go
Normal file
25
util/sysresources/sysresources_test.go
Normal file
@@ -0,0 +1,25 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package sysresources
|
||||
|
||||
import (
|
||||
"runtime"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestTotalMemory(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "linux":
|
||||
case "freebsd", "openbsd", "dragonfly", "netbsd":
|
||||
case "darwin":
|
||||
default:
|
||||
t.Skipf("not supported on runtime.GOOS=%q yet", runtime.GOOS)
|
||||
}
|
||||
|
||||
mem := TotalMemory()
|
||||
if mem == 0 {
|
||||
t.Fatal("wanted TotalMemory > 0")
|
||||
}
|
||||
t.Logf("total memory: %v bytes", mem)
|
||||
}
|
Reference in New Issue
Block a user