Golang—资源限制

1,746 阅读1分钟

每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值;Go语言中可以通过syscall.Setrlimit()/syscall.Getrlimit()函数针对相关资源进行限制。

限制文件句柄数

const rLimit = 1024

func setRLimit() {
	var rlim syscall.Rlimit
	syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim)
	if int(rlim.Cur) < rLimit {
		rlim.Cur = rLimit
		rlim.Max = rLimit
		syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
		syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim)
	}
	syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim)
}

可以限制的资源

syscall库中定义相关资源的常量

资源说明
RLIMIT_AS进程的最大虚内存空间
RLIMIT_CORE内核转存文件的最大长度
RLIMIT_CPU最大允许的CPU使用时间
RLIMIT_DATA进程数据段的最大值
RLIMIT_FSIZE进程可建立的文件的最大长度
RLIMIT_LOCKS进程可建立的锁的最大值
RLIMIT_MEMLOCK进程可锁定在内存中的最大数据量
RLIMIT_MSGQUEUE进程可为POSIX消息队列分配的最大字节数
RLIMIT_NPROC用户可拥有的最大进程数
RLIMIT_SIGPENDING用户可拥有的最大挂起信号数
RLIMIT_STACK最大的进程堆栈
...

参考

Linux系统调用--getrlimit()与setrlimit()函数详解 - Neo E. Cai - 博客园 (cnblogs.com)