编辑RLIMIT_NPROC值的更好方法是什么
我的应用程序创建每个连接线程。应用程序在非零用户id下崩溃,有时线程数超过默认值1024。我想编辑这个号码,所以我没有多少选择 以root身份运行[非常糟糕的主意,而且必须与securty妥协,所以放弃它] 在弱势用户使用下运行设置CAP,并提供能力CAP\u系统资源。然后我可以在我的程序中添加代码编辑RLIMIT_NPROC值的更好方法是什么,c,linux,limits,linux-capabilities,setrlimit,C,Linux,Limits,Linux Capabilities,Setrlimit,我的应用程序创建每个连接线程。应用程序在非零用户id下崩溃,有时线程数超过默认值1024。我想编辑这个号码,所以我没有多少选择 以root身份运行[非常糟糕的主意,而且必须与securty妥协,所以放弃它] 在弱势用户使用下运行设置CAP,并提供能力CAP\u系统资源。然后我可以在我的程序中添加代码 struct rlimit rlp; /* will initilize this later with values of nprocs(maximum number of desir
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。首先,我相信你有将近一千个线程是错误的。线程是相当昂贵的,而且拥有这么多线程通常是不合理的。我建议最多有几十个线程(除非你在一台非常昂贵的超级计算机上运行) 你可以在多路复用系统调用中使用一些,比如。然后,单个线程可以处理数千个连接。阅读有关和的信息。考虑使用一些类似或类似的事件库… 您可以以root用户身份启动应用程序(可能通过使用技术),设置所需的资源(特别是打开特权TCP/IP端口),并使用 读
你也可以用一个小小的setuid C程序来包装你的应用程序,它增加了使用限制,用
setreuid
更改用户,最后更改你的真实程序。谢谢@Basile,实际上当前的设计是这样的,在下一版本中我们将对其进行更改。但在那之前我们想让它继续运行。。是的,没有在超级计算机上运行,但它有足够的资源。setuid然后setruid是一个很好的选择。但由于目前不愿意更改代码,我编辑了/etc/security/limit.conf文件。。