diff --git a/internal/rlimit/rlimit_unix.go b/internal/rlimit/rlimit_unix.go new file mode 100644 index 00000000..ff15096d --- /dev/null +++ b/internal/rlimit/rlimit_unix.go @@ -0,0 +1,29 @@ +// +build !windows + +package rlimit + +import ( + "syscall" +) + +// Raise raises the number of file descriptors that can be opened. +func Raise() error { + var rlim syscall.Rlimit + err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim) + if err != nil { + return err + } + + rlim.Cur = 999999 + err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim) + if err != nil { + return err + } + + err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim) + if err != nil { + return err + } + + return nil +} diff --git a/internal/rlimit/rlimit_win.go b/internal/rlimit/rlimit_win.go new file mode 100644 index 00000000..cecdabe3 --- /dev/null +++ b/internal/rlimit/rlimit_win.go @@ -0,0 +1,7 @@ +// +build windows + +package rlimit + +func Raise() error { + return nil +} diff --git a/main.go b/main.go index de73902e..7eb8867c 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ import ( "github.com/aler9/rtsp-simple-server/internal/metrics" "github.com/aler9/rtsp-simple-server/internal/pathman" "github.com/aler9/rtsp-simple-server/internal/pprof" + "github.com/aler9/rtsp-simple-server/internal/rlimit" "github.com/aler9/rtsp-simple-server/internal/serverrtmp" "github.com/aler9/rtsp-simple-server/internal/serverrtsp" "github.com/aler9/rtsp-simple-server/internal/stats" @@ -56,6 +57,11 @@ func newProgram(args []string) (*program, bool) { os.Exit(0) } + // on Linux, try to raise the number of file descriptors that can be opened + // to allow the maximum possible number of clients + // do not check for errors + rlimit.Raise() + p := &program{ confPath: *argConfPath, terminate: make(chan struct{}),