您的位置:首页 > 运维架构 > Linux

构建百万级高性能Web网站-5 CentOS 6.5 系统优化-内核参数调整

2015-01-01 22:11 609 查看
资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

通过修改系统的 /etc/security/limits 配置文件,来对用户使用的资源进行限制。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。

很多应用需要对整个系统的资源使用做一个总的限制,这时候我们需要修改 /proc 下的配置文件。/proc 目录下包含了很多系统当前状态的参数,例如 /proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range 等等,从文件的名字大致可以猜出所限制的资源种类。由于该目录下涉及的文件众多,在此不一一介绍。有兴趣的读者可打开其中的相关文件查阅说明。

5.1 Linux下高并发socket最大连接数所受的各种限制

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在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。

 

5.2 内核参数修改

修改如下的配置文件:【这儿的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息