TCP系统默认参数与TCP系统调优参数对比
基于系统快速回收time_wait 调优 :
默认参数:
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_max_tw_buckets = 8192
调优参数:
net.ipv4.tcp_fin_timeout = 30 缩短tcp 四次挥手2MSL时间。
net.ipv4.tcp_tw_recycle = 0 保持为0,如果为1,不能保证客户端网络环境不在NAT中,会发生不可达数据包
net.ipv4.tcp_tw_reuse = 1 可以快速复用time_wait sockets
net.ipv4.tcp_timestamps = 1 此值不能关闭,如果关闭,tw_reuse 不生效
net.ipv4.tcp_max_tw_buckets = 5000 time_wait 超过5000就开始回收
---------------------------------------------------------------------------------------------------------------------------------------------------------
基于系统快速回收close_wait 调优 :
默认参数:
net.ipv4.tcp_keepalive_time = 7200 如果业务都是长连接,保持默认值就行,
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
调优参数:
net.ipv4.tcp_keepalive_time = 600 缩短CLOSE_WAIT 等待时间,TCP保活机制。
net.ipv4.tcp_keepalive_intvl = 30 探测包的发送间隔, 确认连接不可用30秒后断开连接。
net.ipv4.tcp_keepalive_probes = 5 探测包的发送次数。
基于系统监听syn状态 listen调优,扩大监听队列;
默认参数
net.core.somaxconn = 128
调优参数
net.core.somaxconn = 2048 扩大syn监听队列,方便快速响应连接;定义了系统中每一个端口最大的监听队列的长度。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
基于系统半连接状态sync_rcvd调优,扩大等待队列;
默认参数
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 1
调优参数:
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列长度,默认1024,改成8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_syncookies = 1 预防syn 流量攻击,超过等待队列最大值,启动syncookies。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
基于系统网卡硬件等设备接受数据包调优
默认参数
net.core.netdev_max_backlog = 1000
调优参数
net.core.netdev_max_backlog = 262144 该参数决定了,网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
基于系统本地端口范围扩展
默认参数
net.ipv4.ip_local_port_range = 32768 60999
调优参数
net.ipv4.ip_local_port_range = 1024 65000
---------------------------------------------------------------------------------------------------------------------------------------------------------------
基于tcp 网络栈缓存调优
默认参数 单位(bit)
每个套接字所允许的最大缓冲区的大小(以字节为单位)
net.core.optmem_max = 20480
接收套接字缓冲区大小的默认值(以字节为单位)。
net.core.rmem_default = 212992
接收套接字缓冲区大小的最大值(以字节为单位)
net.core.rmem_max = 212992
发送套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_default = 212992
发送套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_max = 212992
确 定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力 的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字 节)。 BDP (带宽时延积)
net.ipv4.tcp_mem = 系统会自动随着自身内存实际情况分配 (无需配置,基本够用)
为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。
net.ipv4.tcp_wmem = 4096 87380 6291456
为自动调优定义socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。
net.ipv4.tcp_rmem = 4096 16384 4194304
调优参数
net.core.optmem_max = 16777216
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216
net.ipv4.tcp_mem = 系统会自动随着自身内存实际情况分配(单位是页)(1120416 1493888 2240832)( 96G内存推荐)
net.ipv4.tcp_wmem = 4096 8388608 16777216
net.ipv4.tcp_rmem = 4096 8388608 16777216
通过上述表述net.core.rmem_default与net.core.rmem_max 不要设置一致,避免自有中间值与最高值相同,调整tcp mem buffer 是为了解决dmesg出现TCP: too many of orphaned sockets。
另一个, 如果系统并发连接数不高于2万,默认参数配置就可以,如果高于,调整成以上调优数值就可以了. 调整以上参数的是为了增加tcp mem buffer
总内存量计算: total mem (bytes) = 1120416(页) * 4096 bytes = 4589223936 bytes = 4377 Mib
1493888(页) * 4096 bytes = 6118965248 bytes = 5835 Mib
16777216(页)* 4096 bytes = 68719476736 bytes = 8753 Mib
------------------------------------------------------------------------------------------------------------------------------------------------------------------
基于系统 TCP 通讯质量优化
默认参数
net.ipv4.tcp_synack_retries = 5 参数决定了发送SYN+ACK确认包重试的次数(数量),默认是5
net.ipv4.tcp_syn_retries = 6 作为客户端,主动建立连接时发送syn包重试的次数,默认6次
net.ipv4.tcp_sack = 1 启用有选择的应答,从而减少拥塞情况的发生
net.ipv4.tcp_fack = 1 启用转发应答,从而减少拥塞情况的发生,增加快速重传
net.ipv4.tcp_retries1 = 3 放弃回应一个TCP连接请求前进行重试的次数
net.ipv4.tcp_retries2 = 15 放弃一个已经建立的TCP连接前进行重试的次数
net.ipv4.tcp_slow_start_after_idle = 1 拥塞窗口在经过一段时间空闲后需要重新初始化
net.ipv4.icmp_echo_ignore_broadcasts = 1 避免放大攻击,防止内网icmp风暴
icmp_ignore_bogus_error_responses =1 开启icmp恶意报错保护
net.ipv4.tcp_max_orphans=8192 允许保留的僵尸套接字进程的tcp socket最大数量. 超过这个数量的socket会被reset.
一个僵尸socket最高占用64K 内存,计算公式 :最大使用内存总量=8192*64*1024 bytes = 512Mib (推荐 如果是8G内存报错默认值,如果是16G以上,推荐使用16384值)
调优参数
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 7
net.ipv4.tcp_slow_start_after_idle = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
icmp_ignore_bogus_error_responses =1
net.ipv4.tcp_max_orphans=16384 如果内存很大,调整成262144
一个僵尸socket最高占用64K 内存,计算公式 :最大使用内存总量=16384*64*1024 bytes = 1024Mib 如果是nginx服务器,推荐使用:net.ipv4.tcp_max_orphans = 262144
如此调优是为了TCP快速释放失败通道, 为了优化RTT 一个连接往返时间 RTO 重传超时时间
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
基于系统TCP 路由转发的参数调优
默认参数
net.ipv4.ip_forward=0
net.ipv4.conf.default.rp_filter = 1 在Linux文件系统映射出的内核参数配置文件中记录了Linux系统中网络接口 反向路由校验
net.ipv4.conf.default.accept_source_route = 0 禁止所有IP源路由
调优参数
net.ipv4.ip_forward=1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
根据实际情况开IP转发功能;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------