vlambda博客
学习文章列表

Linux系统内核优化常用参数

Linux系统内核优化

常用参数

 

net.ipv4.ip_nonlocal_bind = 1

 

net.ipv4.ip_forward = 1

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

 

net.ipv4.tcp_timestamps = 1

#开启TCP时间戳,以一种比重发超时更精确的方法来启用对 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.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

 

net.ipv4.conf.default.rp_filter = 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的占用。