我的应用程序创建每个连接线程。应用程序在非零用户 ID 下运行,有时线程数超过默认值 1024。我想编辑这个号码,所以我没有什么选择
以 root 身份运行 [非常糟糕的主意并且还必须与安全妥协,所以放弃它]
在弱势用户下运行使用 setcap 并赋予能力 CAP_SYS_RESOURCE 。然后我可以在我的程序中添加代码
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 的内存
最佳答案
首先,我认为您拥有近千个线程是错误的。线程的成本很高,拥有这么多线程通常是不合理的。我建议最多有几十个线程(除非您在非常昂贵的 super 计算机上运行)。
你可以有一些 event loop围绕像 poll(2) 这样的多路复用系统调用.然后单个线程可以处理数千个连接。了解 C10K problem和 epoll .考虑使用一些事件库,如 libevent或 libev等等……
您可以以 root 身份启动您的应用程序(可能通过使用 setuid 技术),设置所需的资源(特别是打开特权 TCP/IP 端口),并使用 setreuid(2) 更改用户
阅读Advanced Linux Programming ...
您还可以将您的应用程序包装在一个微型 setuid C 程序中,该程序使用 setrlimit(2) 增加限制。 ,用setreuid
改变用户,最后execve(2)你真正的程序。
关于c - 这是编辑 RLIMIT_NPROC 值的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21701040/