Linux系统内核参数优化

Linux系统内核参数优化

  在工做中,日常咱们使用官方镜像安装的Linux系统(非自定制化的)系统内核考虑的是最通用的场景,一般设定都偏向稳定保守,比较典型的表明如红帽系列的RHEL、CentOS等。而在正式的生成环境使用中,服务器的CPU、内存等硬件配置都比较高,而安装系统时默认的系统内核参数设定并不符合用于支持高并发访问的业务服务器,所以咱们须要根据实际的业务特性来对系统的默认内核参数设定加以优化,以便能充分发挥服务器的硬件计算处理能力,提升资源利用率的同时也给企业节省IT设备资源成本。linux

  以centos为例,能够经过vim /etc/sysctl.conf 文件来更改内核参数,可以使用sysctl -p命令当即生效。算法

Linux系统经常使用的内核参数及定义总结以下:vim

如下内核参数配置仅供参考,具体使用应当根据业务环境特性及服务器硬件配置来设置合理的值。centos

net.ipv4.ip_nonlocal_bind = 1 
#容许非本地IP地址socket监听,当主机做为网关、反向代理或负载均衡器实现双机热备高可用时,主机须要绑定监听虚拟VIP地址时,必须开启此项。

net.ipv4.ip_forward = 1 
#开启IPv4转发。当服务器做为路由网关、反向代理与负载均衡(开启客户端IP透传时)必须开启。

net.ipv4.tcp_timestamps = 1 
#开启TCP时间戳,以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。默认为0不启用。

fs.file-max = 6553560 
#系统全部进程一共能够打开的文件数量,即系统当前最大的文件句柄数,属于系统级别的限制,默认值大小一般与系统物理内存有关。注意:ulimit的open file值(默认1024)是单个进程能够打开的最大文件数,在高并发业务下,这个2个值都须要进行调整。

net.ipv4.tcp_tw_reuse = 1 
#默认为0不启用,设置为1启用tcp复用,表示容许将TIME_WAIT状态的socket从新用于新的TCP连接,这对于高并发的服务器来讲意义重大,由于总有大量TIME_WAIT状态的连接存在。

net.ipv4.tcp_tw_recycle = 1 
#默认为0表示关闭,为1时表示开启TCP链接中TIME-WAIT sockets的快速回收,用于大量TIME_OUT场景。

net.ipv4.tcp_keepalive_time = 600 
#当keepalive启用时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效连接。

net.ipv4.tcp_keepalive_probes = 3
#当keepalive启用时,若是对方不予应答,探测包的发送次数。

net.ipv4.tcp_keepalive_intvl = 15 
#当keepalive启用时,keepalive探测包的发送间隔,单位为秒。

net.ipv4.tcp_fin_timeout = 30 
#当服务器主动关闭连接时,socket保持在FIN_WAIT_2状态的最长时间,单位为秒。

net.ipv4.tcp_syn_retries = 1 
#在内核放弃创建链接以前发送SYN包的数量

net.ipv4.tcp_syncookies = 1 
#与性能无关,用于解决TCP的SYN攻击。1表示开启TCP SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少许SYN攻击,默认为0,表示关闭。

net.ipv4.icmp_echo_ignore_broadcasts = 1 
#忽略icmp ping广播包,避免放大攻击。

net.ipv4.icmp_ignore_bogus_error_responses = 1 
#开启恶意icmp错误消息保护

net.inet.udp.checksum=1 
#防止不正确的udp包的攻击

net.ipv4.conf.default.accept_source_route = 0 
#是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在充当网关的linux主机上缺省值应为1,在通常的linux主机上缺省值应为0。从安全性角度出发,建议关闭该功能。

net.ipv4.tcp_slow_start_after_idle = 0 
#关闭tcp的链接传输的慢启动,即先休止一段时间,再初始化拥塞窗口。

net.ipv4.route.gc_timeout = 100 
#路由缓存刷新频率,当一个路由失败后多长时间跳到另外一个路由,默认是300秒。

net.ipv4.tcp_max_tw_buckets = 5000 
#表示操做系统容许保持TIME_WAIT套接字数量的最大值,如超过此值,TIME_WAIT套接字将马上被清除并打印警告信息,默认为8000,过多的TIME_WAIT套接字会使服务器响应变慢。

net.ipv4.ip_local_port_range = 1024 65000 
#定义UDP和TCP连接的本地端口的取值范围。

net.ipv4.tcp_rmem = 10240 87380 12582912 
#定义了TCP接受socket请求缓存的内存最小值、默认值、最大值。

net.ipv4.tcp_wmem = 10240 87380 12582912 
#定义TCP发送缓存的最小值、默认值、最大值。该值为自动调优定义每一个 socket 使用的内存。
#第一个值是为 socket 的发送缓冲区分配的最少字节数。
#第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的状况下能够增加到这个值。
#第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。

net.core.netdev_max_backlog = 8096 
#当网卡接收数据包的速度大于内核处理速度时,会有一个缓冲队列保存这些数据包。这个参数表示该列队的最大值。

net.core.somaxconn=262114 
#选项默认值是128,表示socket监听的backlog(监听队列)上限。这个参数用于调节系统同时发起的TCP链接数,在高并发的请求中,默认的值可能会致使连接超时或者重传,所以须要结合高并发请求数来调节此值。

net.core.optmem_max = 10000000 
#该参数指定了每一个套接字所容许的最大缓冲区的大小(以字节为单位)

net.core.rmem_default = 6291456 
#表示内核接收套接字缓冲区默认大小(以字节为单位)。该参数定义了默认的发送窗口大小,对于更大的 BDP 来讲,这个大小也应该更大。

net.core.wmem_default = 6291456 
#表示内核发送套接字缓冲区默认大小(以字节为单位)

net.core.rmem_max = 12582912 
#表示内核接收套接字缓冲区最大大小(以字节为单位)。该参数定义了默认的发送窗口大小,对于更大的 BDP 来讲,这个大小也应该更大。

net.core.wmem_max = 12582912 
#表示内核发送套接字缓冲区最大大小(以字节为单位)

net.ipv4.tcp_mem
#肯定 TCP 栈应该如何反映内存使用;每一个值的单位都是内存页(一般是 4KB)。
#第一个值是内存使用的下限。
#第二个值是内存压力模式开始对缓冲区使用应用压力的上限。
#第三个值是内存上限。在这个层次上能够将报文丢弃,从而减小对内存的使用。对于较大的 BDP 能够增大这些值(其单位是内存页,而不是字节)。

net.ipv4.tcp_max_syn_backlog = 8192 
#这个参数表示TCP三次握手创建阶段接受SYN请求列队的较大长度,默认1024,将其设置的大一些可以使出现服务器程序繁忙来不及accept新链接时,能够容纳更多等待链接的网络链接数,Linux不至于丢失客户端发起的连接请求。

net.ipv4.tcp_max_orphans=262114 
#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。若是超过这个数字,孤立连接将当即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过度依靠这个限制甚至认为的减少这个值,更多的状况是增长这个值。

net.ipv4.netfilter.ip_conntrack_max=204800 
#设置系统开始iptables防火墙对TCP链接进行状态跟踪的最大队列长度限制,超过此限定值,将会发生数据表溢出丢弃,对于高并发业务一般也可使用iptables的raw表设置免跟踪处理。

net.ipv4.conf.all.rp_filter = 1 
#用于控制系统是否开启对数据包源地址的校验,1为严谨模式  (推荐),0为松散模式。默认为1开启。

net.ipv4.conf.default.rp_filter = 1 
#用于控制系统是否开启对数据包源地址的校验,1为严谨模式  (推荐),0为松散模式。默认为1开启。

net.ipv4.tcp_congestion_control = cubic 
#TCP拥塞控制算法,centos7默认设置是cubic。Linux内核中提供了若干套TCP拥塞控制算法,已加载进内核的能够经过内核参数net.ipv4.tcp_available_congestion_control看到:sudo sysctl net.ipv4.tcp_available_congestion_control 没有加载进内核的通常是编译成了模块,能够用modprobe加载。这些算法各自适用于不一样的环境。reno是最基本的拥塞控制算法,也是TCP协议的实验原型。bic适用于rtt较高但丢包极为罕见的状况,好比北美和欧洲之间的线路,这是2.6.8到2.6.18之间的Linux内核的默认算法。cubic是修改版的bic,适用环境比bic普遍一点,它是2.6.19以后的linux内核的默认算法。hybla适用于高延时、高丢包率的网络,好比卫星链路——一样适用于中美之间的链路。多人实验代表,TCP拥塞控制算法对TCP传输速率的影响可很大。修改TCP拥塞控制算法须要修改内核参数net.ipv4.tcp_congestion_control=xxx

net.ipv4.tcp_window_scaling = 0 
#关闭tcp_window_scaling,启用 RFC 1323 定义的 window scaling;要支持超过64KB的窗口,必须启用该值。

net.ipv4.tcp_ecn = 0 
#关闭TCP的直接拥塞通告(tcp_ecn)

net.ipv4.tcp_sack = 1 
#关闭tcp_sack,启用有选择的应答(Selective Acknowledgment),这能够经过有选择地应答乱序接收到的报文来提升性能(这样可让发送者只发送丢失的报文段),(对于广域网通讯来讲)这个选项应该启用,可是这会增长对CPU的占用。
相关文章
相关标签/搜索