服务器TCP内核参数调优

本文深入探讨了TCP连接的不同状态,包括LISTENING、ESTABLISHED、CLOSE_WAIT、TIME_WAIT等,详细解释了TIME_WAIT状态的产生原因及如何通过内核参数调整来优化大量TIME_WAIT状态的问题。

TCP状态转移要点
  TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得 注意的状态有两个:CLOSE_WAIT和TIME_WAIT。

1、LISTENING状态
  FTP服务启动后首先处于侦听(LISTENING)状态。

2、ESTABLISHED状态
  ESTABLISHED的意思是建立连接。表示两台机器正在通信。

3、CLOSE_WAIT
  对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭。

4、TIME_WAIT
  我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分 段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情 况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

5、SYN_SENT状态
  SYN_SENT状态表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为 ESTABLISHED,此时SYN_SENT状态非常短暂。但如果发现SYN_SENT非常多且在向不同的机器发出,那你的机器可能中了冲击波或震荡波 之类的病毒了。这类病毒为了感染别的计算机,它就要扫描别的计算机,在扫描的过程中对每个要扫描的计算机都要发出了同步请求,这也是出现许多 SYN_SENT的原因。

TCP协议中有TIME_WAIT这个状态,主要有两个原因:
1、防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2、可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

查看系统TCP连接资源命令

查看网络连接数:

#查看某个/特定ip的连接数
netstat -an |grep xx |wc -l

#查看连接数等待time_wait状态连接数
netstat -an |grep TIME_WAIT|wc -l

#查看建立稳定连接数量
netstat -an |grep ESTABLISHED |wc -l

查看不同状态的连接数数量

netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'

TIME_WAIT 1
CLOSE_WAIT 3
SYN_SENT 1
ESTABLISHED 1848
LISTEN 15

查看每个ip跟服务器建立的连接数

netstat -nat|grep "tcp"|awk ' {print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn

444 10.71.177.123
102 100.11.71.123
101 49.14.55.132
#(PS:正则解析:显示第5列,-F : 以:分割,显示列,sort 排序,uniq -c统计排序过程中的重复行,sort -rn 按纯数字进行逆序排序)

查看每个ip建立的ESTABLISHED/TIME_OUT状态的连接数

netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn

24 103.56.195.17
19 45.116.147.186
18 103.56.195.18
17 45.116.147.178

问题:怎么解决大量Time_Wait

通过调整内核参数:

vim /etc/sysctl.conf

#然后执行命令让参数生效:
/sbin/sysctl -p

配置说明:

配置参数说明
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.tcp_fin_timeout=30修改默认的 TIMEOUT 时间。
net.ipv4.tcp_keepalive_time = 1200表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.tcp_keepalive_probes = 3探测次数
net.ipv4.tcp_keepalive_intvl = 20探测周期时间
net.ipv4.ip_local_port_range = 1024 65000表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量。但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

调优完毕,再压一下看看效果吧。

netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
<think>好的,我现在要帮用户解决关于Linux内核参数的问题。首先,我需要理解用户的需求。他们想知道最佳实践,所以应该涵盖主要的方向和具体参数,同时给出操作建议。 用户提供的引用内容提到了内存管理、TCP、文件系统,以及的步骤。我需要把这些内容整合起来,确保结构清晰。可能分为几个部分,比如方向、常见参数、步骤和注意事项。 要注意引用对应的标记,比如[^1]、[^2]等,确保正确关联到参考内容。比如引用[1]提到默认参数可能不是最佳,需要根据环境整,这可能放在步骤里。引用[4]关于内存管理策略,应该在内存部分提及。 用户可能希望具体的例子,比如每个方向下的参数示例,如vm.swappiness、net.core.somaxconn等,并说明它们的作用和整方法。同时,需要强备份配置和监控的重要性,如引用[3]提到的。 还需要考虑用户的实际操作,比如如何修改参数,使用sysctl命令或编辑sysctl.conf文件。可能还要提到工具,如sysctl、/proc文件系统,以及监控工具如vmstat、sar,这部分引用[3]和[4]的内容。 要避免过于技术化的术语,但保持专业性。确保每个部分都有实际的应用场景,比如高并发下的网络,数据库服务器的内存化,这样用户更容易理解。 最后,生成的相关问题需要围绕的不同方面,比如内存、网络、文件系统,以及步骤和工具。确保问题覆盖用户可能进一步询问的方向。 检查是否有遗漏的重要参数或步骤,确保引用正确,语法符合要求,数学表达式用$...$,如果有的话。不过这次内容可能较少涉及数学公式,但要注意LaTeX的正确使用,如果有的话。</think>### Linux内核参数最佳实践 Linux内核参数需结合具体应用场景,通过整关键参数提升系统性能与稳定性。以下是主要方向及实践建议: --- #### 一、方向与核心参数 1. **内存管理** - **`vm.swappiness`**:控制内核使用交换分区的倾向,默认值60。对于数据库等内存敏感型应用,建议降低至10-30以减少交换频率[^4]。 - **`vm.overcommit_memory`**:控制内存分配策略。若应用需大量内存,可设为1(允许超量分配)或2(禁止超量分配)[^4]。 - **`vm.dirty_ratio`/`vm.dirty_background_ratio`**:整脏页刷盘阈值,避免I/O突发。例如: $$ \text{vm.dirty\_background\_ratio} = 5,\quad \text{vm.dirty\_ratio} = 10 $$ 2. **网络性能** - **`net.core.somaxconn`**:增大TCP连接队列长度(默认128),高并发场景可设为4096以上。 - **`net.ipv4.tcp_tw_reuse`**:启用TIME-WAIT套接字重用,减少端口耗尽问题。 - **`net.ipv4.tcp_max_syn_backlog`**:提高SYN队列容量,防御连接洪泛攻击。 3. **文件系统** - **`fs.file-max`**:增加系统最大文件句柄数,避免“Too many open files”错误[^3]。 - **`vm.vfs_cache_pressure`**:整inode缓存回收先级,默认值100,降低可提升文件访问性能[^3]。 --- #### 二、步骤与工具 1. **步骤** - **监控分析**:使用`vmstat`、`sar`、`dstat`等工具定位瓶颈。 - **参数备份**:修改前备份`/etc/sysctl.conf`或自定义配置文件。 - **渐进整**:每次仅整1-2个参数,观察性能变化[^3]。 2. **操作示例** ```bash # 临时修改参数 sysctl -w vm.swappiness=10 # 永久生效(编辑/etc/sysctl.conf) echo "vm.swappiness=10" >> /etc/sysctl.conf sysctl -p ``` --- #### 三、注意事项 - **硬件与负载适配**:例如高并发Web服务器需侧重网络参数,数据库服务器化内存与I/O[^5]。 - **内核版本差异**:部分参数在不同内核版本中行为可能变化,需验证兼容性。 - **监控验证**:后持续监控`/proc/meminfo`、`/proc/net/netstat`等指标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值