4

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

4

1 回答 1

3

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

您可以围绕像poll(2)这样的多路复用系统调用进行一些事件循环。然后一个线程可以处理数千个连接。阅读有关C10K 问题epoll的信息。考虑使用一些事件库,如libeventlibev等...

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

阅读高级 Linux 编程...

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

于 2014-02-11T12:14:00.543 回答