资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。
ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
通过修改系统的 /etc/security/limits 配置文件,来对用户使用的资源进行限制。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。
很多应用需要对整个系统的资源使用做一个总的限制,这时候我们需要修改 /proc 下的配置文件。/proc 目录下包含了很多系统当前状态的参数,例如 /proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range 等等,从文件的名字大致可以猜出所限制的资源种类。由于该目录下涉及的文件众多,在此不一一介绍。有兴趣的读者可打开其中的相关文件查阅说明。
http://www.centoscn.com/CentOS/Intermediate/2013/1114/2106.html
在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
$ ulimit –n
1024
这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。
对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。
修改如下的配置文件:【这儿的20480,可以根据机器的配置和网站需要支持的并发用户数等需要放大】
[root@maoshan memcached]# cat /etc/security/limits.conf
#@student - maxlogins 4
* soft nofile 20480
* hard nofile 20480
# End of file
[root@maoshan memcached]# cat /etc/pam.d/login
-session optional pam_ck_connector.so
session required /lib64/security/pam_limits.so
重启服务器
#reboot
验证结果:
[root@maoshan memcached]# ulimit -n
20480
将如下内容加入/etc/sysctl.conf,若有重复,删除重复语句,但保持值与这儿一致,每个参数的含义,可参考相关资料或去网络搜索。
#vi /etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 300
#net.ipv4.ip_conntrack_max = 20480
net.netfilter.nf_conntrack_max = 20480
# sysctl -p
error: "net.ipv4.ip_conntrack_max" is an unknown key
改成
#net.ipv4.ip_conntrack_max = 20480
net.netfilter.nf_conntrack_max = 20480
仍然报错:
error: "net.netfilter.nf_conntrack_max" is an unknown key
解决办法:(http://blog.csdn.net/lizhongren/article/details/21710541)
[root@maoshan~]# modprobe nf_conntrack
echo "modprobe nf_conntrack">> /etc/rc.local
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
[root@iZ28782qhuhZ ~]# modprobe bridge
echo "modprobe bridge">> /etc/rc.local
修改/etc/security/limits.d/ 90-nproc.conf
[root@maoshan limits.d]# vi 90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 40960
root soft nproc unlimited
重启服务器:
#reboot