本文共 2304 字,大约阅读时间需要 7 分钟。
本文打算探讨两种设置方法,一种是在程序中动态设置,一种是在程序启动前的静态设置。
先说静态设置(具体设置见:):
1,在/etc/security/limits.conf中修改或者添加进程可打开文件数的软硬设置,
* soft nofile 10240
* hard nofile 10240
2,在/etc/pam.d/login中添加
session required /lib/security/pam_limits.so
3,查看linux系统最在打开文件数限制,cat /proc/sys/fs/file-max,根据需要,修改此设置:
echo 222222 > /proc/sys/fs/file-max
echo 222222 > /proc/sys/nr_open
# /proc/sys/fs/file-max 系统所有进程可打开的最大文件数目
# /proc/sys/nr_open 是单个进程可分配的最大文件数
# ulimit -f 网上有说是设置可创建(不是打开)的文件大小数目,
# man 一下看到的是本shell及其子shell可以打开的文件数目
以上步骤设置好后,可以用 ulimit -n 查看效果
4,修改系统可使用端口范围,/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000
#net.ipv4.ip_conntrack_max = 10240,好像不存在本配置
修改后,使生效,sysctl -p
动态设置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <sys/capability.h> #include <sys/prctl.h> #include <sys/resource.h> #include <iostream> #include <errno.h> using namespace std; int main( int argc, char *argv[]) { int ret = prctl(PR_CAPBSET_READ,CAP_SYS_RESOURCE,0,0); if (ret == 1) cout<< "CAP_SYS_RESOURCE enabled" <<endl; else cout<< "CAP_SYS_RESOURCE disabled" <<endl; struct rlimit rt,rt_new; ret = getrlimit(RLIMIT_NOFILE,&rt); if (ret != 0) { cout<< "getrlimit error" <<endl; return 0; } cout<< "old soft limit:" <<rt.rlim_cur<< "\told hard limit:" <<rt.rlim_max<<endl; rt.rlim_cur = rt.rlim_max = 40960000; ret = setrlimit(RLIMIT_NOFILE,&rt); if (ret != 0) { cout<< "setrlimt error:" << errno <<endl; cap_t caps = cap_init(); cap_value_t caplist[2] = {CAP_SYS_RESOURCE,CAP_SETPCAP}; unsigned int num_caps = 2; cap_set_flag(caps,CAP_EFFECTIVE,num_caps,caplist,CAP_SET); cap_set_flag(caps,CAP_INHERITABLE,num_caps,caplist,CAP_SET); cap_set_flag(caps,CAP_PERMITTED,num_caps,caplist,CAP_SET); if (cap_set_proc(caps)) { cout<< "cap_set_proc failed" <<endl; return 0; } ret = setrlimit(RLIMIT_NOFILE,&rt); if (ret != 0) { cout<< "setrlimit error:" << errno <<endl; return 0; } } ret = getrlimit(RLIMIT_NOFILE,&rt_new); if (ret != 0) { cout<< "getrlimit error:" << errno <<endl; return 0; } cout<< "new soft limit:" <<rt_new.rlim_cur<< "\tnew hard limit:" <<rt_new.rlim_max<<endl; return 0; } |
编译前需要安装:libcap-devel
编译:g++ file.cpp -lcap
运行结果,设置不成功。