c - 这是编辑 RLIMIT_NPROC 值的更好方法

标签 c linux limits linux-capabilities setrlimit

我的应用程序创建每个连接线程。应用程序在非零用户 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 problemepoll .考虑使用一些事件库,如 libeventlibev等等……

您可以以 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/

相关文章:

c - STM32F1 USART DMA TX 未完成第二次传输

c - 多边形不会出现在屏幕上

C 选项好风格?

c - 在 C 中创建图形时出错

linux - 指数频率轴的 FFTW

python - 驻留集大小 (RSS) 限制无效

c++ - 如何便携地找出 min(INT_MAX, and(INT_MIN))?

在 Linux 上更改 C 中的实际进程名称

linux - Monodevelop - 尝试在 linux Precise 64 (Ubuntu 12.04 LTS) 上安装

Python、Matplotlib : Normalising multiple plots to fit the same arbitrary axis limits