每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值;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)