我的应用程序创建每个连接线程应用程序在非零用户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,将会发生什么。 ofcource我也有32GB的Ram
首先,我认为你有近千个线程是错误的。线程非常昂贵,拥有这么多线程通常是不合理的。我建议最多使用几十个线程(除非你在非常昂贵的超级计算机上运行)。
你可以在像event loop这样的多路复用系统中使用一些poll(2)。然后单个线程可以处理数千个连接。阅读有关C10K problem和epoll的信息。考虑使用一些事件库,如libevent或libev等...
您可以以root身份启动应用程序(可能使用setuid技术),设置所需的资源(特别是打开特权TCP / IP端口),并使用setreuid(2)更改用户
阅读Advanced Linux Programming ......
您还可以围绕一个微小的setuid C程序包装你的应用程序,使用setrlimit(2)增加限制,用setreuid
更改用户,最后execve(2)你真正的程序。