mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 20:02:24 -05:00 
			
		
		
		
	[feature] Inherit resource limits from cgroups (#1336)
When GTS is running in a container runtime which has configured CPU or memory limits or under an init system that uses cgroups to impose CPU and memory limits the values the Go runtime sees for GOMAXPROCS and GOMEMLIMIT are still based on the host resources, not the cgroup. At least for the throttling middlewares which use GOMAXPROCS to configure their queue size, this can result in GTS running with values too big compared to the resources that will actuall be available to it. This introduces 2 dependencies which can pick up resource contraints from the current cgroup and tune the Go runtime accordingly. This should result in the different queues being appropriately sized and in general more predictable performance. These dependencies are a no-op on non-Linux systems or if running in a cgroup that doesn't set a limit on CPU or memory. The automatic tuning of GOMEMLIMIT can be disabled by either explicitly setting GOMEMLIMIT yourself or by setting AUTOMEMLIMIT=off. The automatic tuning of GOMAXPROCS can similarly be counteracted by setting GOMAXPROCS yourself.
This commit is contained in:
		
					parent
					
						
							
								627b8eeae6
							
						
					
				
			
			
				commit
				
					
						acc333c40b
					
				
			
		
					 254 changed files with 63515 additions and 0 deletions
				
			
		
							
								
								
									
										170
									
								
								vendor/github.com/cilium/ebpf/internal/unix/types_linux.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								vendor/github.com/cilium/ebpf/internal/unix/types_linux.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,170 @@ | |||
| // +build linux | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"syscall" | ||||
| 
 | ||||
| 	linux "golang.org/x/sys/unix" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	ENOENT  = linux.ENOENT | ||||
| 	EEXIST  = linux.EEXIST | ||||
| 	EAGAIN  = linux.EAGAIN | ||||
| 	ENOSPC  = linux.ENOSPC | ||||
| 	EINVAL  = linux.EINVAL | ||||
| 	EPOLLIN = linux.EPOLLIN | ||||
| 	EINTR   = linux.EINTR | ||||
| 	EPERM   = linux.EPERM | ||||
| 	ESRCH   = linux.ESRCH | ||||
| 	ENODEV  = linux.ENODEV | ||||
| 	// ENOTSUPP is not the same as ENOTSUP or EOPNOTSUP | ||||
| 	ENOTSUPP = syscall.Errno(0x20c) | ||||
| 
 | ||||
| 	EBADF                    = linux.EBADF | ||||
| 	BPF_F_NO_PREALLOC        = linux.BPF_F_NO_PREALLOC | ||||
| 	BPF_F_NUMA_NODE          = linux.BPF_F_NUMA_NODE | ||||
| 	BPF_F_RDONLY_PROG        = linux.BPF_F_RDONLY_PROG | ||||
| 	BPF_F_WRONLY_PROG        = linux.BPF_F_WRONLY_PROG | ||||
| 	BPF_OBJ_NAME_LEN         = linux.BPF_OBJ_NAME_LEN | ||||
| 	BPF_TAG_SIZE             = linux.BPF_TAG_SIZE | ||||
| 	SYS_BPF                  = linux.SYS_BPF | ||||
| 	F_DUPFD_CLOEXEC          = linux.F_DUPFD_CLOEXEC | ||||
| 	EPOLL_CTL_ADD            = linux.EPOLL_CTL_ADD | ||||
| 	EPOLL_CLOEXEC            = linux.EPOLL_CLOEXEC | ||||
| 	O_CLOEXEC                = linux.O_CLOEXEC | ||||
| 	O_NONBLOCK               = linux.O_NONBLOCK | ||||
| 	PROT_READ                = linux.PROT_READ | ||||
| 	PROT_WRITE               = linux.PROT_WRITE | ||||
| 	MAP_SHARED               = linux.MAP_SHARED | ||||
| 	PERF_TYPE_SOFTWARE       = linux.PERF_TYPE_SOFTWARE | ||||
| 	PERF_COUNT_SW_BPF_OUTPUT = linux.PERF_COUNT_SW_BPF_OUTPUT | ||||
| 	PerfBitWatermark         = linux.PerfBitWatermark | ||||
| 	PERF_SAMPLE_RAW          = linux.PERF_SAMPLE_RAW | ||||
| 	PERF_FLAG_FD_CLOEXEC     = linux.PERF_FLAG_FD_CLOEXEC | ||||
| 	RLIM_INFINITY            = linux.RLIM_INFINITY | ||||
| 	RLIMIT_MEMLOCK           = linux.RLIMIT_MEMLOCK | ||||
| 	BPF_STATS_RUN_TIME       = linux.BPF_STATS_RUN_TIME | ||||
| ) | ||||
| 
 | ||||
| // Statfs_t is a wrapper | ||||
| type Statfs_t = linux.Statfs_t | ||||
| 
 | ||||
| // Rlimit is a wrapper | ||||
| type Rlimit = linux.Rlimit | ||||
| 
 | ||||
| // Setrlimit is a wrapper | ||||
| func Setrlimit(resource int, rlim *Rlimit) (err error) { | ||||
| 	return linux.Setrlimit(resource, rlim) | ||||
| } | ||||
| 
 | ||||
| // Syscall is a wrapper | ||||
| func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { | ||||
| 	return linux.Syscall(trap, a1, a2, a3) | ||||
| } | ||||
| 
 | ||||
| // FcntlInt is a wrapper | ||||
| func FcntlInt(fd uintptr, cmd, arg int) (int, error) { | ||||
| 	return linux.FcntlInt(fd, cmd, arg) | ||||
| } | ||||
| 
 | ||||
| // Statfs is a wrapper | ||||
| func Statfs(path string, buf *Statfs_t) (err error) { | ||||
| 	return linux.Statfs(path, buf) | ||||
| } | ||||
| 
 | ||||
| // Close is a wrapper | ||||
| func Close(fd int) (err error) { | ||||
| 	return linux.Close(fd) | ||||
| } | ||||
| 
 | ||||
| // EpollEvent is a wrapper | ||||
| type EpollEvent = linux.EpollEvent | ||||
| 
 | ||||
| // EpollWait is a wrapper | ||||
| func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { | ||||
| 	return linux.EpollWait(epfd, events, msec) | ||||
| } | ||||
| 
 | ||||
| // EpollCtl is a wrapper | ||||
| func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { | ||||
| 	return linux.EpollCtl(epfd, op, fd, event) | ||||
| } | ||||
| 
 | ||||
| // Eventfd is a wrapper | ||||
| func Eventfd(initval uint, flags int) (fd int, err error) { | ||||
| 	return linux.Eventfd(initval, flags) | ||||
| } | ||||
| 
 | ||||
| // Write is a wrapper | ||||
| func Write(fd int, p []byte) (n int, err error) { | ||||
| 	return linux.Write(fd, p) | ||||
| } | ||||
| 
 | ||||
| // EpollCreate1 is a wrapper | ||||
| func EpollCreate1(flag int) (fd int, err error) { | ||||
| 	return linux.EpollCreate1(flag) | ||||
| } | ||||
| 
 | ||||
| // PerfEventMmapPage is a wrapper | ||||
| type PerfEventMmapPage linux.PerfEventMmapPage | ||||
| 
 | ||||
| // SetNonblock is a wrapper | ||||
| func SetNonblock(fd int, nonblocking bool) (err error) { | ||||
| 	return linux.SetNonblock(fd, nonblocking) | ||||
| } | ||||
| 
 | ||||
| // Mmap is a wrapper | ||||
| func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { | ||||
| 	return linux.Mmap(fd, offset, length, prot, flags) | ||||
| } | ||||
| 
 | ||||
| // Munmap is a wrapper | ||||
| func Munmap(b []byte) (err error) { | ||||
| 	return linux.Munmap(b) | ||||
| } | ||||
| 
 | ||||
| // PerfEventAttr is a wrapper | ||||
| type PerfEventAttr = linux.PerfEventAttr | ||||
| 
 | ||||
| // PerfEventOpen is a wrapper | ||||
| func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { | ||||
| 	return linux.PerfEventOpen(attr, pid, cpu, groupFd, flags) | ||||
| } | ||||
| 
 | ||||
| // Utsname is a wrapper | ||||
| type Utsname = linux.Utsname | ||||
| 
 | ||||
| // Uname is a wrapper | ||||
| func Uname(buf *Utsname) (err error) { | ||||
| 	return linux.Uname(buf) | ||||
| } | ||||
| 
 | ||||
| // Getpid is a wrapper | ||||
| func Getpid() int { | ||||
| 	return linux.Getpid() | ||||
| } | ||||
| 
 | ||||
| // Gettid is a wrapper | ||||
| func Gettid() int { | ||||
| 	return linux.Gettid() | ||||
| } | ||||
| 
 | ||||
| // Tgkill is a wrapper | ||||
| func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { | ||||
| 	return linux.Tgkill(tgid, tid, sig) | ||||
| } | ||||
| 
 | ||||
| func KernelRelease() (string, error) { | ||||
| 	var uname Utsname | ||||
| 	err := Uname(&uname) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 
 | ||||
| 	end := bytes.IndexByte(uname.Release[:], 0) | ||||
| 	release := string(uname.Release[:end]) | ||||
| 	return release, nil | ||||
| } | ||||
							
								
								
									
										228
									
								
								vendor/github.com/cilium/ebpf/internal/unix/types_other.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										228
									
								
								vendor/github.com/cilium/ebpf/internal/unix/types_other.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,228 @@ | |||
| // +build !linux | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"runtime" | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| var errNonLinux = fmt.Errorf("unsupported platform %s/%s", runtime.GOOS, runtime.GOARCH) | ||||
| 
 | ||||
| const ( | ||||
| 	ENOENT = syscall.ENOENT | ||||
| 	EEXIST = syscall.EEXIST | ||||
| 	EAGAIN = syscall.EAGAIN | ||||
| 	ENOSPC = syscall.ENOSPC | ||||
| 	EINVAL = syscall.EINVAL | ||||
| 	EINTR  = syscall.EINTR | ||||
| 	EPERM  = syscall.EPERM | ||||
| 	ESRCH  = syscall.ESRCH | ||||
| 	ENODEV = syscall.ENODEV | ||||
| 	EBADF  = syscall.Errno(0) | ||||
| 	// ENOTSUPP is not the same as ENOTSUP or EOPNOTSUP | ||||
| 	ENOTSUPP = syscall.Errno(0x20c) | ||||
| 
 | ||||
| 	BPF_F_NO_PREALLOC        = 0 | ||||
| 	BPF_F_NUMA_NODE          = 0 | ||||
| 	BPF_F_RDONLY_PROG        = 0 | ||||
| 	BPF_F_WRONLY_PROG        = 0 | ||||
| 	BPF_OBJ_NAME_LEN         = 0x10 | ||||
| 	BPF_TAG_SIZE             = 0x8 | ||||
| 	SYS_BPF                  = 321 | ||||
| 	F_DUPFD_CLOEXEC          = 0x406 | ||||
| 	EPOLLIN                  = 0x1 | ||||
| 	EPOLL_CTL_ADD            = 0x1 | ||||
| 	EPOLL_CLOEXEC            = 0x80000 | ||||
| 	O_CLOEXEC                = 0x80000 | ||||
| 	O_NONBLOCK               = 0x800 | ||||
| 	PROT_READ                = 0x1 | ||||
| 	PROT_WRITE               = 0x2 | ||||
| 	MAP_SHARED               = 0x1 | ||||
| 	PERF_TYPE_SOFTWARE       = 0x1 | ||||
| 	PERF_COUNT_SW_BPF_OUTPUT = 0xa | ||||
| 	PerfBitWatermark         = 0x4000 | ||||
| 	PERF_SAMPLE_RAW          = 0x400 | ||||
| 	PERF_FLAG_FD_CLOEXEC     = 0x8 | ||||
| 	RLIM_INFINITY            = 0x7fffffffffffffff | ||||
| 	RLIMIT_MEMLOCK           = 8 | ||||
| 	BPF_STATS_RUN_TIME       = 0 | ||||
| ) | ||||
| 
 | ||||
| // Statfs_t is a wrapper | ||||
| type Statfs_t struct { | ||||
| 	Type    int64 | ||||
| 	Bsize   int64 | ||||
| 	Blocks  uint64 | ||||
| 	Bfree   uint64 | ||||
| 	Bavail  uint64 | ||||
| 	Files   uint64 | ||||
| 	Ffree   uint64 | ||||
| 	Fsid    [2]int32 | ||||
| 	Namelen int64 | ||||
| 	Frsize  int64 | ||||
| 	Flags   int64 | ||||
| 	Spare   [4]int64 | ||||
| } | ||||
| 
 | ||||
| // Rlimit is a wrapper | ||||
| type Rlimit struct { | ||||
| 	Cur uint64 | ||||
| 	Max uint64 | ||||
| } | ||||
| 
 | ||||
| // Setrlimit is a wrapper | ||||
| func Setrlimit(resource int, rlim *Rlimit) (err error) { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Syscall is a wrapper | ||||
| func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { | ||||
| 	return 0, 0, syscall.Errno(1) | ||||
| } | ||||
| 
 | ||||
| // FcntlInt is a wrapper | ||||
| func FcntlInt(fd uintptr, cmd, arg int) (int, error) { | ||||
| 	return -1, errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Statfs is a wrapper | ||||
| func Statfs(path string, buf *Statfs_t) error { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Close is a wrapper | ||||
| func Close(fd int) (err error) { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| // EpollEvent is a wrapper | ||||
| type EpollEvent struct { | ||||
| 	Events uint32 | ||||
| 	Fd     int32 | ||||
| 	Pad    int32 | ||||
| } | ||||
| 
 | ||||
| // EpollWait is a wrapper | ||||
| func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { | ||||
| 	return 0, errNonLinux | ||||
| } | ||||
| 
 | ||||
| // EpollCtl is a wrapper | ||||
| func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Eventfd is a wrapper | ||||
| func Eventfd(initval uint, flags int) (fd int, err error) { | ||||
| 	return 0, errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Write is a wrapper | ||||
| func Write(fd int, p []byte) (n int, err error) { | ||||
| 	return 0, errNonLinux | ||||
| } | ||||
| 
 | ||||
| // EpollCreate1 is a wrapper | ||||
| func EpollCreate1(flag int) (fd int, err error) { | ||||
| 	return 0, errNonLinux | ||||
| } | ||||
| 
 | ||||
| // PerfEventMmapPage is a wrapper | ||||
| type PerfEventMmapPage struct { | ||||
| 	Version        uint32 | ||||
| 	Compat_version uint32 | ||||
| 	Lock           uint32 | ||||
| 	Index          uint32 | ||||
| 	Offset         int64 | ||||
| 	Time_enabled   uint64 | ||||
| 	Time_running   uint64 | ||||
| 	Capabilities   uint64 | ||||
| 	Pmc_width      uint16 | ||||
| 	Time_shift     uint16 | ||||
| 	Time_mult      uint32 | ||||
| 	Time_offset    uint64 | ||||
| 	Time_zero      uint64 | ||||
| 	Size           uint32 | ||||
| 
 | ||||
| 	Data_head   uint64 | ||||
| 	Data_tail   uint64 | ||||
| 	Data_offset uint64 | ||||
| 	Data_size   uint64 | ||||
| 	Aux_head    uint64 | ||||
| 	Aux_tail    uint64 | ||||
| 	Aux_offset  uint64 | ||||
| 	Aux_size    uint64 | ||||
| } | ||||
| 
 | ||||
| // SetNonblock is a wrapper | ||||
| func SetNonblock(fd int, nonblocking bool) (err error) { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Mmap is a wrapper | ||||
| func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { | ||||
| 	return []byte{}, errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Munmap is a wrapper | ||||
| func Munmap(b []byte) (err error) { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| // PerfEventAttr is a wrapper | ||||
| type PerfEventAttr struct { | ||||
| 	Type               uint32 | ||||
| 	Size               uint32 | ||||
| 	Config             uint64 | ||||
| 	Sample             uint64 | ||||
| 	Sample_type        uint64 | ||||
| 	Read_format        uint64 | ||||
| 	Bits               uint64 | ||||
| 	Wakeup             uint32 | ||||
| 	Bp_type            uint32 | ||||
| 	Ext1               uint64 | ||||
| 	Ext2               uint64 | ||||
| 	Branch_sample_type uint64 | ||||
| 	Sample_regs_user   uint64 | ||||
| 	Sample_stack_user  uint32 | ||||
| 	Clockid            int32 | ||||
| 	Sample_regs_intr   uint64 | ||||
| 	Aux_watermark      uint32 | ||||
| 	Sample_max_stack   uint16 | ||||
| } | ||||
| 
 | ||||
| // PerfEventOpen is a wrapper | ||||
| func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { | ||||
| 	return 0, errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Utsname is a wrapper | ||||
| type Utsname struct { | ||||
| 	Release [65]byte | ||||
| } | ||||
| 
 | ||||
| // Uname is a wrapper | ||||
| func Uname(buf *Utsname) (err error) { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| // Getpid is a wrapper | ||||
| func Getpid() int { | ||||
| 	return -1 | ||||
| } | ||||
| 
 | ||||
| // Gettid is a wrapper | ||||
| func Gettid() int { | ||||
| 	return -1 | ||||
| } | ||||
| 
 | ||||
| // Tgkill is a wrapper | ||||
| func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { | ||||
| 	return errNonLinux | ||||
| } | ||||
| 
 | ||||
| func KernelRelease() (string, error) { | ||||
| 	return "", errNonLinux | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue