linux 高併發系統限制 設置

本文打算探討兩種設置方法,一種是在程序中動態設置,一種是在程序啓動前的靜態設置。

先說靜態設置(具體設置見:參考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

運行結果,設置不成功。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章