这是编辑RLIMIT_NPROC值的更好方法

我的应用程序创建每个连接线程应用程序在非零用户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

解决方法:

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

你可以在多路复用系统调用(如poll(2))周围有一些event loop.然后一个线程可以处理数千个连接.阅读有关C10K problemepoll.请考虑使用一些事件库,如libeventlibev等…

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

阅读Advanced Linux Programming ……

您还可以将应用程序包装在一个微小的setuid C程序中,该程序使用setrlimit(2)增加限制,使用setreuid更改用户,最后使用execve(2)实际程序.

上一篇:陶瓷气体放电管GDT参数详解,如何选型?


下一篇:Linux系统调用--getrlimit()与setrlimit()函数详解