这是编辑RLIMIT_NPROC值的更好方法

时间:2014-02-11 11:50:40

标签: 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足够了。因为我不愿意在chaning源代码中继续使用最后一个选项。我更加好奇地知道什么是更强大和更标准的方法。

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

PS:如果单个进程的线程超过1k,将会发生什么。 ofcource我有32GB的Ram也

1 个答案:

答案 0 :(得分:3)

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

您可以在event loop之类的多路复用系统中使用poll(2)。然后单个线程可以处理数千个连接。阅读C10K problemepoll。考虑使用一些事件库,如libeventlibev等......

您可以以root身份启动应用程序(可能使用setuid技术),设置所需资源(特别是打开特权TCP / IP端口),并使用setreuid(2)更改用户

阅读Advanced Linux Programming ...

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