本文打算探討兩種設置方法,一種是在程序中動態設置,一種是在程序啓動前的靜態設置。
先說靜態設置(具體設置見:參考csdn的一篇文章):
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/fs/nr_open
# /proc/sys/fs/file-max 系統所有進程可打開的最大文件數目
# /proc/sys/fs/nr_open 是單個進程可分配的最大文件數
# ulimit -f 網上有說是設置可創建(不是打開)的文件大小數目,
# man 一下看到的是本shell及其子shell可以打開的文件數目
# 爲了避免重啓後失效,
echo fs.file-max=222222 >> /etc/sysctl.conf
echo fs.nr_open=222222 >> /etc/sysctl.conf
# 立即生效
sysctl -p
以上步驟設置好後,可以用 ulimit -n 查看效果
4,修改系統可使用端口範圍,/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000
#net.ipv4.ip_conntrack_max = 10240,好像不存在本配置
修改後,使生效,sysctl -p
參考來源:
http://www.cnblogs.com/zengkefu/p/5635153.html
http://www.cnblogs.com/TonyXiaoClub/p/4747736.html
動態設置:
#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
運行結果,設置不成功。