[linux]常见内核TCP参数描述与配置

简介: [linux]常见内核TCP参数描述与配置

前言

所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),如果需要固化设置,则需要修改/etc/sysctl.conf(也可以在/etc/sysctl.d目录下新建conf文件)

sysctl命令基本使用

# 查看指定参数
sysctl net.ipv4.tcp_tw_reuse
# 查看所有内核参数
sysctl -a
# 临时修改指定内核参数
sysctl -w net.ipv4.tcp_tw_reuse=1
# 重加载 /etc/sysctl.conf文件
sysctl -p
# 重加载所有系统配置文件
sysctl --system

TIME_WAIT问题

linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接。如果没有及时断开,会有大量的端口资源的服务器资源被占用。对此我们有必要调整下linux的TCP内核参数,让系统更快地释放TIME_WAIT连接。

统计TCP各种状态的数量

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

编辑配置文件/etc/sysctl.conf,加入以下内容:

net.ipv4.tcp_syncookies= 1
net.ipv4.tcp_tw_reuse= 1
net.ipv4.tcp_tw_recycle= 1
net.ipv4.tcp_fin_timeout= 30

生效:

sysctl -p
# 如果编辑的文件在 /etc/sysctl.d/ 目录下, 需要改成使用以下命令
sysctl --system

高并发下端口配置优化

net.ipv4.tcp_keepalive_time= 1200
net.ipv4.ip_local_port_range= 1024 65535
net.ipv4.tcp_max_syn_backlog= 8192
net.ipv4.tcp_max_tw_buckets= 5000

参数说明

对于不同的linux发行版,默认值可能不一样。

net.core.somaxconn

一般情况下默认值是128,不同linux发行版可能会有区别。

该参数用于控制处于监听状态的套接字的最大连接队列长度,对于高并发的nginx服务器而言要注意调大该参数值,比如16384,32768。

net.core.xmem_default和net.core.xmem_max

参数 说明 默认值
net.core.rmem_default 系统范围接收数据的内核缓冲区初始大小 262144byte,即256KB
net.core.wmem_default 系统范围发送数据的内核缓冲区初始大小 262144byte,即256KB
net.core.rmem_max 系统范围接收数据的内核缓冲区最大大小 262144byte,即256KB
net.core.wmem_max 系统范围发送数据的内核缓冲区最大大小 262144byte,即256KB

默认值在不同的linux发行版可能会有所不同。

网络环境良好和内存资源充足的情况下,增大上述四个参数的值有助于提高并发能力,减少丢包和延迟。

网络环境较差或内存资源不足的情况下,可以考虑减小上述四个参数的值。

如果xmem_default的值大于xmem_max的值,将以xmem_max为准,且超出的部分内存将被浪费。

net.ipv4.ip_local_port_range

一般情况下默认值为32768 60999,表示本地端口范围为32768到60999,不同linux发行版可能会有所不同。

常见优化配置:net.ipv4.ip_local_port_range = 1024 65535

通过将本地端口号限制在指定的范围内,可以避免与系统或其它应用程序使用的端口号发生冲突。如果服务器上还运行了后端应用程序,注意要错开后端服务的端口号。

net.ipv4.tcp_fastopen

该参数用于启用或禁用 TCP 的快速打开(TCP Fast Open)功能。TCP 快速打开是一种优化的 TCP 握手过程,旨在减少客户端与服务器之间的往返延迟时间,从而加速连接的建立。传统的 TCP 握手过程需要三次往返(3-way handshake)才能建立连接。而 TCP 快速打开通过在初始 SYN 数据包中携带客户端发送的应用层数据,使服务器可以在接收到 SYN 数据包后直接发送 SYN+ACK 数据包,从而减少了一个往返的延迟。

net.ipv4.tcp_fastopen 参数有以下几个取值:

  • 0:表示禁用 TCP 快速打开功能。
  • 1:表示启用 TCP 快速打开功能。
  • 2:表示启用 TCP 快速打开功能,并允许客户端在第一次握手时发送数据包。

需要注意的是,启用 TCP 快速打开功能需要支持该功能的客户端和服务器。如果客户端或服务器不支持 TCP 快速打开,即使在内核中启用了该功能,TCP 连接仍然会回退到传统的三次握手过程。对于linux服务器,内核版本应高于3.7。

net.ipv4.tcp_fin_timeout

一般情况下默认值为60,单位秒,不同linux发行版可能会有所不同。

用于控制TCP/IP协议栈中的FIN-WAIT-2状态的超时时间。

在TCP协议中,当一段的连接主动关闭后,会进入FIN-WAIT-2状态,等待对方的确认,以确保双方都完成了连接关闭。当FIN-WAIT-2状态持续超过该参数值是,连接会被内核强制关闭,这对于释放系统资源,提高连接处理能力非常重要。

较小的参数值可以更快地释放系统资源,但可能导致一些连接在网络不稳定的情况下被错误地关闭。

net.ipv4.tcp_keepalive_time

一般情况下默认值为7200,单位秒,不同linux发行版可能会有所不同。

该参数用于控制TCP/IP协议栈中的 TCP keepalive 检测时间间隔。TCP keepalive是一种机制,用于检测处于空闲状态的连接是否仍然有效。当一段时间内没有数据传输时,TCP Keepalive会发送一些特定的探测报文到对方,以确认连接的状态。这对于检测死连接、清理空闲连接和提高连接可靠性很重要。

如果该参数值默认2小时,如果修改为很小的值,将会带来频繁的keepalive检测,这会增加网络流量和系统负载,不必要的连接也可能被中断。同时也会增加系统安全问题,攻击者可以利用Keepalive探测报文进行DoS攻击或网络扫描。

net.ipv4.tcp_max_tw_buckets

不同linux发行版可能会有所不同,可能是65536或180000。

该参数用于控制 TIME_WAIT 状态的 TCP 连接的最大数量。当TIME_WAIT数超过该参数值,新的连接请求可能会被丢弃或拒绝。

较小的值会加快清理TIME_WAIT,但可能会有连接异常。一般情况下默认即可,根据实际情况可以考虑减少或增多。

net.ipv4.tcp_max_syn_backlog

一般情况下默认值为1024,不同linux发行版可能会有所不同。

该参数用于控制TCP/IP协议栈中SYN队列的最大长度。在 TCP 握手过程中,当客户端发送 SYN 报文请求建立连接时,服务器端会将这些 SYN 请求放入 SYN 队列中等待处理。net.ipv4.tcp_max_syn_backlog 参数指定了 SYN 队列的最大长度,即能够同时等待处理的 SYN 请求的最大数量。较小的 net.ipv4.tcp_max_syn_backlog 值可能会导致 SYN 队列溢出,从而无法处理所有的连接请求。这可能会导致客户端无法成功建立连接,出现连接超时或连接被拒绝的情况。

net.ipv4.tcp_syncookies

一般情况下默认为0,表示关闭,不同linux发行版可能会有所不同。置为1表示开启。

表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。

当系统遭受SYN Flood攻击时,攻击者会发送大量的TCP SYN请求,消耗服务器资源并导致服务不可用。

启用SYN Cookie机制后,当服务器接收到一个新的 TCP SYN 请求时,会根据该请求生成一个 SYN Cookie,并将 SYN Cookie 发送回给客户端。客户端在后续的请求中需要携带该 SYN Cookie。服务器在收到后续请求时,会验证 SYN Cookie 的合法性,并根据其中的信息还原出原始的 SYN 请求。

通过使用 SYN Cookie 机制,服务器可以在不消耗太多资源的情况下抵御 SYN Flood 攻击,确保系统的稳定性和可用性。

启用 SYN Cookie 机制也可能带来一些问题,一些网络设备可能无法正确处理SYN Cookie的连接请求,导致连接无法建立或其它问题。

net.ipv4.tcp_synack_retries

一般情况下默认为5,不同linux发行版可能会有所不同。

该参数用于设置在连接建立过程中,发送 SYN-ACK(同步应答)包后等待客户端 ACK(确认应答)包的最大重试次数。

在 TCP 连接的三次握手过程中,服务器收到客户端的 SYN(同步)包后,会回复一个 SYN-ACK 包作为应答。然后服务器等待客户端发送 ACK 包来确认连接的建立。如果服务器在等待期间未收到 ACK 包,它将重试发送 SYN-ACK 包,重试次数由 net.ipv4.tcp_synack_retries 参数确定。

网络环境糟糕的情况下可以考虑增加参数值,以允许更多的重试次数,增加连接建立的成功率。

减小参数值有助于快速建立连接和减少资源占用。

net.ipv4.tcp_syn_retries

一般情况下默认为6,不同linux发行版可能会有所不同。

该参数用于设置在连接建立过程中,发送 SYN(同步)包后等待对方响应的最大重试次数。当客户端发送 SYN 包后,如果没有收到服务器的 SYN-ACK(同步应答)包,客户端会重试发送 SYN 包,重试次数由 net.ipv4.tcp_syn_retries 参数确定。

net.ipv4.tcp_timestamps

一般情况下默认为1,表示开启,不同linux发行版可能会有所不同。置为0表示关闭。

启用后允许在TCP报文中添加时间戳信息,用于测量报文的往返时间(RTT)和计算报文的时序。

net.ipv4.tcp_tw_reuse

一般情况下默认为0,表示关闭,不同linux发行版可能会有所不同。置为1表示开启。

允许重用TIME_WAIT Socket,也就是可以重用TIME_WAIT占用的端口。

启用net.ipv4.tcp_tw_reuse也可能带来一些问题。例如,如果处于TIME_WAIT连接上仍然存在未完全处理的数据包,重用该端口可能导致数据包被传递到错误的连接上,从而导致数据错乱或安全问题。

net.ipv4.tcp_tw_recycle

一般情况下默认为0,表示关闭,不同linux发行版可能会有所不同。置为1表示开启。

启用快速回收TIME_WAIT Socket,内核根据一定规则释放TIME_WAIT的端口资源。具体的回收规则可以根据net.ipv4.tcp_timestamps参数和其它相关参数进行调整。

当多个客户端位于同一个NAT网络后面时,启用快速回收可能导致来自不同客户端的连接被错误服用,导致数据错乱或安全问题。

net.ipv4.tcp_rmem和net.ipv4.tcp_wmem

用于设置tcp接收缓冲区和发送缓冲区的大小,有三个值组成,分别是最小值、默认值和最大值。类似于net.core.xmem_default和net.core.xmem_max。不过net.core是系统全局参数,适用于所有类型的socket,包括tcp和udp。

参考

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
0
0
0
27
分享
相关文章
Intel Linux 内核测试套件-LKVS介绍 | 龙蜥大讲堂104期
《Intel Linux内核测试套件-LKVS介绍》(龙蜥大讲堂104期)主要介绍了LKVS的定义、使用方法、测试范围、典型案例及其优势。LKVS是轻量级、低耦合且高代码覆盖率的测试工具,涵盖20多个硬件和内核属性,已开源并集成到多个社区CICD系统中。课程详细讲解了如何使用LKVS进行CPU、电源管理和安全特性(如TDX、CET)的测试,并展示了其在实际应用中的价值。
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
100 15
|
2月前
|
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
243 7
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
93 1
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
99 17
Linux内核中的调度策略优化分析####
本文深入探讨了Linux操作系统内核中调度策略的工作原理,分析了不同调度算法(如CFS、实时调度)在多核处理器环境下的性能表现,并提出了针对高并发场景下调度策略的优化建议。通过对比测试数据,展示了调度策略调整对于系统响应时间及吞吐量的影响,为系统管理员和开发者提供了性能调优的参考方向。 ####
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等