内核tcp参数总结

    xiaoxiao2021-03-25  71

    三次握手阶段

    net.ipv4.tcp_max_syn_backlog    

    serverSYN_RECV半连接队列长度

    net.ipv4.tcp_syn_retries                

    第一次握手时client向server发送SYN,等待server的ack回复超时,在放弃连接前重新发送syn的次数, 默认为5 ,大约是180s。可以适当减小。

    net.ipv4.tcp_synack_retries           

    第二次握手server向client发送syn+ack后,等待client的ack回复超时,那在放弃连接之前重新发送SYN+ACK的次数,默认是5。建议为3      

    net.ipv4.tcp_syncookies

    0       1       当服务器出现tcp_max_syn_backlog配置的SYN等待队列溢出时,服务器收到TCP SYN包,返回syn+ack时不再直接分配资源去等待响应,而是通过这个syn包计算出一个cookie值,如果是正常的客户端访问,客户端会返回ack,此时服务器再通过检查返回的cookie值的合法性来决定是否分配资源,启用cookies,可防范少量SYN Flood攻击。

    tcp_syncookies 可以说是一个无奈的参数,它使严重违反 TCP 协议的。开启这个选项,系统会根据缓存的未完成的连接的信息算一个值,也就是 cookie,返回给客户端,如果客户端是正常的连接请求,再往服务端发包时,会把这个 cookie 带回来,服务端就会查看这个 cookie,类似加了一个验证的过程。

    如果服务器收到大量的正常请求,导致服务器负载非常高,不要为了应对这种情况开启 tcp_syncookies。文档里用了大写的 “MUST NOT” 来提醒我们,然后很良心地建议去修改 tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow。

    tcp_max_syn_backlog 已经提到过,设置更高的值,允许系统保持更多的“未完成连接”。按照在 listen 函数的文档所说,当开启了 tcp_syncookies 之后,tcp_max_syn_backlog 的值就失去了原本意义,该值被忽略。

    tcp_abort_on_overflow

    是个跟应用程序更相关的参数,当被设置为 1 时,如果应用程序处理速度比较慢,来不及接受新的连接,系统就直接丢弃这个连接,给对端发个 RST。这个选项也要谨慎开启。

    四次挥手阶段

    net.ipv4.ip_local_port_range 

    32768 61000    1024 65000      指定端口范围

    net.ipv4.tcp_tw_reuse   

    0       1       表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

    net.ipv4.tcp_tw_recycle

    0       1       打开快速 TIME-WAIT sockets 回收。请不要随意修改这个值。(做NAT的时候,建议打开它)

    tcp_tw_recycle 设置为 1 会开启系统对 TIME_WAIT 状态的 socket 的快速回收。开启这个功能,系统就会存下 TCP 连接的时间戳,当同一个 IP 地址过来的包的时间戳小于缓存的时间戳,系统就直接丢包,“回收”这个 socket。这个选项同样需要开启 tcp_timestamp 才生效。

    开启这个功能是有很大风险的,如前面所说,会根据同一个 IP 来的包得时间戳来判断是否丢包,而时间戳是根据发包的客户端的系统时间得来的,如果服务端收到的包是同一出口 IP 而系统时间不一样的两个客户端的包,就有可能会丢包,可能出现的情况就是一个局域网内有的客户端能连接服务端,有的不能。

    相对 tcp_tw_recycle,tcp_tw_reuse 是比较安全的一个选项,但是也可能会导致问题。按照官方文档的说法

    It should not be changed without advice/request of technical experts.

    还有一个与 TIME_WAIT密切相关的参数,tcp_max_tw_buckets 指定系统在同一时间最多能有多少 TIME_WAIT 状态,当超过这个值时,系统会直接干掉这个 TIME_WAIT 的 socket。不要为了减少 TIME_WAIT 就把这个值改小。

    net.ipv4.tcp_fin_timeout        

    对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。

    net.ipv4.tcp_max_tw_buckets     

    系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)

    net.ipv4.tcp_max_orphans  

    系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制。如果内存大更应该增加这个值。(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)

    net.ipv4.ip_forward      

    是否开启数据包转发. 默认为0.做nat服务器时需要打开。                

    数据传输阶段

    出现time_wait的原因很大的一部分原因是使用了短连接的方式,可以使用长连接的方式来处理。

    因为 TCP 的上层调用是 Socket,客户端和服务端都会启动 Socket。如果客户端关闭了 Socket,而服务端不知道,一直会为客户端保持着连接,这样是很浪费资源的。为了解决这个问题,TCP协议规定,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,连接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为连接丢失,应该关闭连接。

    net.ipv4.tcp_keepalive_time

    如果某个TCP连接在空闲 2个小时,内核会发起存活探测,探测不成功,会断开连接。默认7200s,建议600s 

    net.ipv4.tcp_keepalive_probes    

    探测次数。默认9次,建议3次

    net.ipv4.tcp_keepalive_intvl

    两次探测间隔时间。默认75,建议15    

    tcp_fastopen

    /proc/sys/net/ipv4/netfilter/,文件需要打开防火墙才会存在

    ip_conntrack_max   65536       

    系统支持的最大ipv4连接数,默认65536(事实上这也是理论最大值),同时这个值和你的内存大小有关,如果内存128M,这个值最大8192,1G以上内存这个值都是默认65536,这个值受/proc/sys/net/ipv4/ip_conntrack_max限制

    ip_conntrack_tcp_timeout_established

    432000              已建立的tcp连接的超时时间,值过大将导致一些可能已经不用的连接常驻于内存中,占用大量链接资源,从而可能导致NAT ip_conntrack: table full的问题。建议:对于NAT负载相对本机的 NAT表大小很紧张的时候,可能需要考虑缩小这个值,以尽早清除连接,保证有可用的连接资源

    ip_conntrack_tcp_timeout_time_wait  

    120            time_wait状态超时时间,超过该时间就清除该连接

    ip_conntrack_tcp_timeout_close_wait

      60              close_wait状态超时时间,超过该时间就清除该连接

    ip_conntrack_tcp_timeout_fin_wait      

    120            fin_wait状态超时时间,超过该时间就清除该连接

    /proc/sys/net/core/

    netdev_max_backlog      

    1024                   每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点。

    net.core.somaxconn       

    128  65536       对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度,与如下两方面有关:- somaxconn参数.- 使用该端口的程序中listen()函数.关于somaxconn参数:定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128.用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。对繁忙的服务器,增加该值有助于网络性能

    有时候会看到 somaxconn (/proc/sys/net/core/somaxconn) 这个值跟 tcp_max_syn_backlog 一起出现,其实 somaxconn 跟 listen 的 backlog 参数的意义是基本一样的,指定用于保存已完成三次握手等待 accept 的队列长度,somaxconn 是 backlog 可以设置的最大值。当在应用程序里设置 backlog 的值大于 somaxconn 参数时,系统也会默默地把 backlog 减小为 somaxconn 指定的值。

    TCP缓冲参数

    wmem_default       

      129024     129024     默认的发送窗口大小(以字节为单位)

    rmem_default

    129024     129024     默认的接收窗口大小(以字节为单位)

    rmem_max     

    129024     873200     最大的TCP数据接收缓冲

    wmem_max    

    129024     873200     内核TCP数据发送缓冲

    vm.swappiness = 60

    表示当系统内存使用超过40%的时候,swap空间将被使用,建议禁用,即设为0

    生产环境参考示例

    #是否开启数据包转发 net.ipv4.ip_forward = 0

    #对从默认网卡进来的数据包进行反向路径校验(reserve path filtering ),可以减少ddos攻击和ip欺骗,https://www.jianshu.com/p/717e6cd9d2bb  net.ipv4.conf.default.rp_filter = 0             net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.eth0.rp_filter = 0

    #是否接受含有源路由信息的ip包 net.ipv4.conf.default.accept_source_route = 0

    #SysRq是键盘上的"Prent Screen"健位. 用来在系统无法响应时操作机器.比如重启,终端Alt+SysRq+b,xshell下,echo 'b' > /proc/sysrq-trigger kernel.sysrq = 0

    #程序崩溃时,一般会生成一个core文件,控制产生的core文件的文件名中是否添加pid作为扩展 kernel.core_uses_pid = 1

    #控制如何使用swap分区。0表示最大限度使用物理内存,值过大会增加物理内存与swap分区的数据交换,增加系统io,如果内存够大,足以负担机器上的服务,建议设置为0 vm.swappiness = 0

    #单个消息队列的大小 default max size of queue (字节) kernel.msgmnb = 655360 #单个消息的大小 kernel.msgmax = 655360 单个共享内存段的大小,计算公式64G*1024*1024*1024(字节) kernel.shmmax = 68719476736 #所有内存大小(单位:页,1页 = 4Kb),计算公式16G*1024*1024*1024/4KB(页) kernel.shmall = 4294967296  

    #当出现SYN等待队列溢出时,启用cookies来处理,可防范syn攻击 net.ipv4.tcp_syncookies = 1 #有选择的应答(selection ack),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段     net.ipv4.tcp_sack = 1 #处于time_wait状态的最大数值,超过则立刻被清除并且警告。 net.ipv4.tcp_max_tw_buckets = 6000 #对外连接端口范围 net.ipv4.ip_local_port_range = 1024 65535 #内核分配给TCP连接的内存,单位是Page,1 Page = 4kb,小于第一个数字,kernel 不对其进行任何的干预,超过第二个数字进入 “memory pressure” 压力模式,超过第三个数字会报错,Out of socket memory net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_wmem = 4096 65536 8388608 net.ipv4.tcp_rmem = 4096 65536 8388608 #SYN队列的长度,在进行系统调用connect时会发生Tcp的三次握手,server内核会为Tcp维护两个队列,Syn队列和Accept队列,Syn队列是指存放完成第一次握手的连接,Accept队列是存放完成整个Tcp三次握手的连接,加大队列长度,可以容纳更多等待连接的网络连接数,数过大可能遭遇到Syn flood攻击 net.ipv4.tcp_max_syn_backlog = 819200 #出现错误的时候重传 net.ipv4.tcp_retrans_collapse = 0

    net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 #tcp/ip会话的滑动窗口大小是否可变 net.ipv4.tcp_window_scaling = 1         net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_timestamps = 0 #在放弃连接之前所送出的 SYN+ACK 数目 net.ipv4.tcp_synack_retries = 1         #对于一个新建连接,内核要发送SYN 连接请求重试次数 net.ipv4.tcp_syn_retries = 1         #是否开启TIME-WAIT sockets 回收 net.ipv4.tcp_tw_recycle = 0             #对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡 net.ipv4.tcp_fin_timeout = 1         #是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助) net.ipv4.tcp_tw_reuse = 0         #系统级别最大文件句柄数,一般为内存大小(KB)的10%来计算。 fs.file-max = 2048000  #内核panic时,5秒后自动重启 kernel.panic = 5         net.core.netdev_max_backlog = 262144 fs.aio-max-nr = 1048576

    sysctl --system与sysctl -p的区别

    sysctl -p  会重新加载 /etc/sysctl.conf 

    sysctl --system会重新加载以下所有文件

    /run/sysctl.d/*.conf /etc/sysctl.d/*.conf /usr/local/lib/sysctl.d/*.conf /usr/lib/sysctl.d/*.conf /lib/sysctl.d/*.conf /etc/sysctl.conf

     

     https://www.cnblogs.com/bodhitree/p/5756719.html

    转载请注明原文地址: https://ju.6miu.com/read-37824.html

    最新回复(0)