这是系统资源限制,通常单进程不能超过 1024,我使用cgo来设置,代码如下:
package main /* #include <stdio.h> #include <sys/time.h> #include <sys/resource.h> int rlimit_init() { printf("setting rlimit "); struct rlimit limit; if (getrlimit(RLIMIT_NOFILE, &limit) == -1) { printf("getrlimit error "); return 1; } limit.rlim_cur = limit.rlim_max = 50000; if (setrlimit(RLIMIT_NOFILE, &limit) == -1) { printf("setrlimit error "); return 1; } printf("set limit ok "); return 0; } */ import "C" func main() { C.rlimit_init() }
或者使用 syscall 包
var rlim syscall.Rlimit err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim) if err != nil { fmt.Println("get rlimit error: " + err.Error()) os.Exit(1) } rlim.Cur = 50000 rlim.Max = 50000 err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim) if err != nil { fmt.Println("set rlimit error: " + err.Error()) os.Exit(1) }
使用 go build 编译后,需要以 root 权限运行。