这是编辑RLIMIT_NPROC值的更好方法

我的应用程序创build每连接线程。 应用程序在非零用户标识下破坏,有时线程数超过默认值1024。 我想编辑这个号码,所以我有几个选项

以root身份运行[非常糟糕的想法,也必须妥协与安全,所以放弃]

低级用户下使用setcap运行,并赋予CAP_SYS_RESOURCEfunction。 那么我可以在我的程序中添加代码

struct rlimit rlp; /* will initilize this later with values of nprocs(maximum number of desired threads)*/ setrlimit(RLIMIT_NPROC, &rlp); /*RLIMIT_NPROC *The maximum number of processes (or, more precisely on Linux, threads) that can * created for the real user ID of the *calling process. Upon encountering this limit, fork(2) fails with the error *EAGAIN. */ 

其他的事情是编辑/etc/securitylimits.conf其中只是我可以让开发用户的条目,可以把行如

  @devuser hard nproc 20000 @devuser soft nproc 10000 

10K就足够了。因此,我应该继续使用最后一个选项。 而我更加了解什么是更强大和标准的方法。

寻求你的意见,并提前感谢你:)

PS:如果一个进程的线程超过1k,将会发生什么情况。 我也有32GB的RAM

首先,我相信你有近一千个线程是错误的。 线程是非常昂贵的,通常是不合理的。 我建议最多有几十个线程(除非你在一个非常昂贵的超级计算机上运行)。

你可能会有一些事件循环绕过一个多路复用系统调用,如poll(2) 。 然后一个线程可以处理成千上万的连接。 阅读有关C10K问题和epoll 。 考虑使用一些像libevent或libev等事件库…

你可以以root身份启动你的应用程序(也许通过使用setuid技术),设置所需的资源(特别是打开特权的TCP / IP端口),并用setreuid(2)

阅读高级Linux编程 …

你也可以把你的应用程序包装在一个小的setuid C程序中,使用setrlimit(2)来增加限制,用setreuid更改用户,最后execve(2)你的真实程序。