当前位置:   article > 正文

Linux:centos内核优化详解_centos内核参数优化

centos内核参数优化

一、系统内核部分设置在以下文件

vim /etc/sysctl.conf

1.禁用IPV6

net.ipv6.conf.all.disable_ipv6 = 1 # 禁用整个系统所有接口的IPv6
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1 # 禁用某一个指定接口的IPv6(此处为:lo)


理想情况下,向IPv6过渡的进程不应该被最终的用户所看见,但是IPv4/IPv6混合环境有时会让你碰到各种源于IPv4和IPv6之间不经意间的相互碰撞的问题。举个例子,你会碰到应用程序超时的问题,比如apt-get或ssh尝试通过IPv6连接失败、DNS服务器意外清空了IPv6的AAAA记录、或者你支持IPv6的设备不兼容你的互联网服务提供商遗留下的IPv4网络,等等等等。
当然这不意味着你应该盲目地在你的Linux机器上禁用IPv6。鉴于IPv6许诺的种种好处,作为社会的一份子我们最终还是要充分拥抱它的,但是作为给最终用户进行故障排除过程的一部分,如果IPv6确实是罪魁祸首,那你可以尝试去关闭它。

2.设置交换空间

vm.swappiness = 0
swappiness,Linux内核参数,控制换出运行时内存的相对权重。swappiness参数值可设置范围在0到100之间。 低参数值会让内核尽量少用交换,更高参数值会使内核更多的去使用交换空间。默认值为60(参考网络资料:当剩余物理内存低于40%(40=100-60)时,开始使用交换空间)。对于大多数操作系统,设置为100可能会影响整体性能,而设置为更低值(甚至为0)则可能减少响应延迟。

3.决定检查过期多久邻居条目

net.ipv4.neigh.default.gc_stale_time = 120
ARP参数,检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。

4.关闭反向过滤

net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
反向过滤技术,系统在接收到一个IP包后,检查该IP是不是合乎要求,不合要求的IP包会被系统丢弃。该技术就称为rpfilter。怎么样的包才算不合要求呢?例如,用户在A网口上收到一个IP包,检查其IP为B。然后考查:对于B这个IP,在发送时应该用哪个网口,“如果在不应该接收到该包的网口上接收到该IP包,则认为该IP包是hacker行为”。

5.arp请求包中源ip地址限制

net.ipv4.conf.default.arp_announce = 2
arp_announce对网络接口(网卡)上发出的ARP请求包中的源IP地址作出相应的限制;主机会根据这个参数值的不同选择使用IP数据包的源IP或当前网络接口卡的IP地址作为ARP请求包的源IP地址。
详情可以看这一篇,写的很好。https://www.jianshu.com/p/a682ecae9693

6.开启SYN cookie

net.ipv4.tcp_syncookies = 1
在正常情况下,服务器端接收到客户端发送的SYN包,会分配一个连接请求块(即request_sock结构),用于保存连接请求信息,并且发送SYN+ACK包给客户端,然后将连接请求块添加到半连接队列中。客户端接收到SYN+ACK包后,会发送ACK包对服务器端的包进行确认。服务器端收到客户端的确认后,根据保存的连接信息,构建一个新的连接,放到监听套接字的连接队列中,等待用户层accept连接。这是正常的情况,但是在并发过高或者遭受SYN flood攻击的情况下,半连接队列的槽位数量很快就会耗尽,会导致丢弃新的连接请求,SYN cookies技术可以使服务器在半连接队列已满的情况下仍能处理新的SYN请求。
如果开启了SYN cookies选项,在半连接队列满时,SYN cookies并不丢弃SYN请求,而是将源目的IP、源目的端口号、接收到的客户端初始序列号以及其他一些安全数值等信息进行hash运算,并加密后得到服务器端的初始序列号,称之为cookie。服务器端在发送初始序列号为cookie的SYN+ACK包后,会将分配的连接请求块释放。如果接收到客户端的ACK包,服务器端将客户端的ACK序列号减1得到的值,与上述要素hash运算得到的值比较,如果相等,直接完成三次握手,构建新的连接。SYN cookies机制的核心就是避免攻击造成的大量构造无用的连接请求块,导致内存耗尽,而无法处理正常的连接请求。

7.尝试多少次去建立由远端启始的TCP连接

net.ipv4.tcp_synack_retries = 3
tcp_synack_retries 显示或设定 Linux 核心在回应 SYN 要求时会尝试多少次重新发送初始 SYN,ACK 封包后才决定放弃。这是所谓的三次握手 (threeway handshake) 的第二个步骤。即是说系统会尝试多少次去建立由远端启始的 TCP 连线。tcp_synack_retries 的值必须为正整数,并不能超过 255。因为每一次重新发送封包都会耗费约 30 至 40 秒去等待才决定尝试下一次重新发送或决定放弃。tcp_synack_retries 的缺省值为 5,即每一个连线要在约 180 秒 (3 分钟) 后才确定逾时。

8.连接重试次数


net.ipv4.tcp_syn_retries = 3
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

9.内核分配给TCP连接的内存

net.ipv4.tcp_mem = 379008 505344 758016

  • 第一个数字表示,当 tcp 使用的 page 少于 379008时(相当于1.4G内存),kernel 不对其进行任何的干预
  • 第二个数字表示,当 tcp 使用了超过 505344 的 pages 时,kernel 会进入 “memory pressure” 压力模式
  • 第三个数字表示,当 tcp 使用的 pages 超过 758016 时(相当于2.9GB内存),就会报:Out of socket memory

/
tcp_wmem(3个INTEGER变量): min, default, max
min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。
default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。
max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了51200 131072 204800)
/
tcp_rmem (3个INTEGER变量): min, default, max
min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。
default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值情况下,TCP窗口大小为65535。默认值为87380
max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,"静态"选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。(可以看出,.max的设置最好是default的两倍,对于NAT来说主要该增加它,我的网络里为 51200 131072 204800)
/
tcp_mem(3个INTEGER变量):low, pressure, high
low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )
pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )
high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。 在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为192000 300000 732000)

#关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1                          # 禁用整个系统所有接口的IPv6
net.ipv6.conf.default.disable_ipv6 = 1                  
net.ipv6.conf.lo.disable_ipv6 = 1                          # 禁用某一个指定接口的IPv6(此处为:lo)

#设置交换空间
vm.swappiness = 0                        # 仅在内存不足的情况下--当剩余空闲内存低于vm.min_free_kbytes limit时,使用交换空间。

#决定检查过期多久邻居条目
net.ipv4.neigh.default.gc_stale_time = 120

#关闭反向路径过滤
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

#arp请求包中源ip地址限制
#在内核参数中除了每个网卡都有自己的arp_announce配置外,还有两个(一个是默认default,一个是全局all)需要用到arp_announce配置。
net.ipv4.conf.default.arp_announce = 2    #2-始终使用与目标IP地址对应的最佳本地IP地址作为ARP请求的源IP地址。(0,1选项可以看上处)
net.ipv4.conf.lo.arp_announce = 2            
net.ipv4.conf.all.arp_announce = 2

#开启SYN Cookie
net.ipv4.tcp_syncookies = 1   #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_synack_retries = 3  #尝试3次去建立由远端启始的TCP连接
net.ipv4.tcp_syn_retries = 3       #对于一个新建连接,内核要发送3个SYN连接请求才决定放弃。

#内核分配给TCP连接的内存
net.ipv4.tcp_mem = 379008       505344  758016  
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_rmem = 4096          87380   4194304

# 设置发送缓冲区
net.core.wmem_default = 8388608   #发送套接字缓冲区大小的默认值(以字节为单位)
net.core.rmem_default = 8388608    #发送套接字缓冲区大小的默认值(以字节为单位)
net.core.rmem_max = 16777216      #最大值
net.core.wmem_max = 16777216    #最大值

net.core.somaxconn = 60480  #用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制
net.ipv4.tcp_max_orphans = 262144 #系统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_max_syn_backlog = 262144  #表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_timestamps = 0  #时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.core.netdev_max_backlog = 262144 # 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

kernel.msgmnb = 4203520 #每个消息队列的最大字节限制。
kernel.msgmni = 128            #整个系统的最大数量的消息队列。该文件指定消息队列标识的最大数目,即系统范围内最大多少个消息队列。
kernel.msgmax = 8192        #单个消息的最大size。

kernel.core_pattern = /var/log/core/core-%e-%p-%t  #输出core文件地址,core文件命名规则为:core-%e-%p-%t 表示为core.进程名称.进程id.时间戳

net.ipv4.tcp_fin_timeout = 10 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 300 #当keepalive打开的情况下,TCP发送keepalive消息的频率。
net.ipv4.ip_local_port_range = 1024 65000 #可用于定义网络连接可用作其源(本地)端口的最小和最大端口的限制,同时适用于TCP和UDP连接。
net.ipv4.tcp_max_tw_buckets = 8000 #表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
net.ipv4.route.max_size = 5242880 #路由高速缓存的最大项数,超过会进行清除旧项操作.
net.unix.max_dgram_qlen = 512     #允许域套接字中数据包的最大个数,在初始化unix域套接字时的默认值.
在调用listen函数时第二个参数会复盖这个值.
fs.file-max = 2000000   #系统中所有进程能够同时打开的文件句柄数量(在用ab压测的时候这个选项很重要!!!!)

二、使配置生效

/sbin/sysctl -p

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/158572
推荐阅读
相关标签
  

闽ICP备14008679号