有助于提高网络性能和吞吐量的参数
net.core.somaxconn = 128
已完成连接队列(completed connection queue)
(1)三次握手已经完成,但还未被应用层接收(accept),但也处于ESTABLISHED状态.
(2)队列长度由listen的backlog参数和内核的 net.core.somaxconn 参数共同决定.
(3)当这个队列满了之后,不管未完成连接队列是否已满,是否启用syncookie,都不在接收新的SYN请求.(该特性跟内核版本有关)
(4)如果client端向已完成连接队列的socket发送包,内核将保存数据到socket的接收缓冲区,等应用层accept之后,传给应用层.
(5)对于高并发服务器建议设置为8192,甚至更大 net.ipv4.tcp_max_syn_backlog = 512
未完成连接队列(incomplete connection queue)
(1)半连接状态,处于SEND_RCVD状态.
(2)由内核参数 net.ipv4.tcp_max_syn_backlog 设置.
(3)如果启用了syncookie,在未完成连接队列满了之后,新的SYN请求将使用syncookie机制.
(5)对于高并发服务器建议设置为8192,甚至更大 net.ipv4.tcp_syn_retries = 5
表示的是3次握手过程中第1个步骤syn的最大发送次数,默认值是5
net.ipv4.tcp_synack_retries = 5
表示的是3次握手中第2个步骤syn-ack的最大发送次数,默认值为5
net.ipv4.tcp_retries1 = 3
放弃回应一个TCP连接请求前﹐需要进行多少次重试.RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间.(注意:这个值同时还决定进入的syn连接)
net.ipv4.tcp_retries2 = 15
在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试.默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)
net.ipv4.tcp_orphan_retries = 0
在近端丢弃TCP连接之前﹐要进行多少次重试.默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定.如果您的系统是负载很大的WEB服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源.另外参的考 tcp_max_orphans .(事实上做NAT的时候,降低该值也是好处显着的,我本人的网络环境中降低该值为3)
net.ipv4.tcp_abort_on_overflow = 0
当守护进程太忙而不能接受新的连接,就象对方发送reset消息,默认值是false.这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态.只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用.(对待已经满载的sendmail,apache这类服务的时候,这个可以很快让客户端终止连接,可以给予服务程序处理已有连接的缓冲机会,所以很多防火墙上推荐打开它)
net.ipv4.tcp_max_orphans = 65536
系统所能处理不属于任何进程的TCP sockets最大数量.假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息.之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)
net.core.wmem_max = 229376
最大socket写buffer,可参考的优化值:873200
net.core.rmem_max = 229376
最大socket读buffer,可参考的优化值:873200
net.core.wmem_default = 229376
net.core.rmem_default = 229376
net.core.optmem_max = 20480
socket buffer的最大初始化值
net.ipv4.tcp_mem = 89376 119168 178752
同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
上述内存单位是页,而不是字节.可参考的优化值是:786432 1048576 1572864
net.ipv4.tcp_wmem = 4096 16384 3813376
net.ipv4.tcp_rmem = 4096 87380 3813376
net.ipv4.udp_mem = 89376 119168 178752
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
net.core.netdev_max_backlog = 1000
进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000
对于改善TIME_WAIT状态太多有益的参数
net.ipv4.tcp_syncookies = 1
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.ip_local_port_range = 32768 61000
指定端口范围的一个配置,默认是32768 61000,可调整到1024 61000
net.ipv4.tcp_max_tw_buckets = 18000系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)
net.ipv4.tcp_timestamps = 1
TCP有一种行为,可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。
如果服务器身处NAT环境,安全起见,通常要禁止tcp_tw_recycle,至于TIME_WAIT连接过多的问题,可以通过激活tcp_tw_reuse来缓解。
net.ipv4.tcp_fin_timeout = 60
表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
对于改善CLOSE_WAIT状态太多有益的参数
TCP KeepAlive有关.默认值是:
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可调整到:
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30
开启LINUX路由功能
net.ipv4.ip_forward = 1
设置为1 是linux可以作为路由器