linux下修改内核参数进行Tcp性能调优 -- 高并发

前言

在高并发的网络服务中,对TCP性能的调优显得尤为重要。Linux操作系统提供了丰富的内核参数,允许系统管理员和工程师针对TCP/IP网络栈进行细致的性能调优。本文将介绍一些关键的内核参数,以及如何通过修改这些参数来提升Linux系统在面对高并发场景下的TCP性能。

内核参数调优原则

在进行TCP性能调优前,需要明确几个原则:

  1. 性能调优需要基于实际的监控数据:在调整任何内核参数之前,应先通过工具(如topvmstatiostatnetstat等)监控系统的性能指标。
  2. 调优需要逐步进行:每次调整后,都需要重新测试并监控效果,以评估调优的效果。
  3. 需要考虑业务场景:不同的业务场景对网络性能的需求不同,调优参数需要根据实际业务来设定。

关键TCP性能调优参数

1. net.ipv4.tcp_tw_reuse

启用重用TCP连接。如果服务端的TIME_WAIT状态的连接可以被重用来建立新的连接,可以减少服务端的连接数。

sysctl -w net.ipv4.tcp_tw_reuse=1

将此参数写入/etc/sysctl.conf文件以使更改永久生效。

2. net.ipv4.tcp_fin_timeout

减少TIME_WAIT状态的持续时间,从而允许系统快速回收相关资源。

用于定义 TCP 连接在收到 FIN 包后,处于 TIME_WAIT 状态的最大时间。TIME_WAIT 状态是 TCP 连接终止过程中的一个正常阶段,用于确保所有重复的或迟到的数据包都被处理。

作用
  • 确保数据包处理:保证即使在网络延迟较大的情况下,数据包也能被正确处理。
  • 防止连接立即关闭:给数据包传输提供额外的时间,确保数据完整性。
默认值和调整
  • 默认值:默认值通常是 60 秒。
  • 调整方法
    sysctl -w net.ipv4.tcp_fin_timeout=30
    这会将 TIME_WAIT 的时间调整为 30 秒。
调整的好处
  • 释放端口更快:减少 TIME_WAIT 状态的持续时间可以更快地释放被占用的端口,对于端口数量有限或频繁创建和销毁连接的应用(如Web服务器)非常有用。
  • 提高并发连接数:在高并发环境下,减少 TIME_WAIT 状态的时间可以增加系统同时处理的连接数。
调整的风险

调整 net.ipv4.tcp_fin_timeout 参数可能带来以下风险:

  1. 数据包丢失:如果设置的时间过短,可能会导致处于 TIME_WAIT 状态的数据包在未完全处理完就被关闭,从而导致数据丢失。
  2. 端口耗尽:如果设置的时间过短,可能会导致端口过早释放,而新的连接又快速建立,从而增加端口耗尽的风险。
  3. 安全性问题:减少 TIME_WAIT 状态的时间可能会增加被攻击的风险,例如 SYN 泛洪攻击。

sysctl -w net.ipv4.tcp_fin_timeout=30

将此参数写入/etc/sysctl.conf文件以使更改永久生效。

3. net.ipv4.tcp_max_syn_backlog

调整TCP的半连接队列长度,允许系统同时处理更多的未完成的连接。

net.ipv4.tcp_max_syn_backlog 是 Linux 内核的一个参数,用于设置 TCP SYN 队列的最大长度。在 TCP 三次握手过程中,当客户端发起连接请求(发送 SYN 包)时,服务器内核会将这些请求存放在 SYN 队列中,直到完成握手过程。这个参数定义了 SYN 队列可以容纳的半打开连接的最大数量。

自 Linux 内核 2.2 版本以后,backlog 为已完成连接队列的最大值,未完成连接队列大小以 /proc/sys/net/ipv4/tcp_max_syn_backlog 确定,但是已连接队列大小受 SOMAXCONN 限制,为 min(backlog, SOMAXCONN)

作用和重要性
  • 队列管理:管理等待完成三次握手的连接请求。
  • 连接处理:确保服务器能够处理大量的并发连接请求。
默认值和调整
  • 默认值:通常,默认值足以处理大多数常规流量。
  • 调整方法
    sysctl -w net.ipv4.tcp_max_syn_backlog=4096
    这会将 SYN 队列的最大长度调整为 4096。
调整的好处
  • 提高并发处理能力:增加 SYN 队列的长度可以提高服务器处理大量并发连接请求的能力。
调整的风险
  • 资源消耗:增加 SYN 队列的长度可能会消耗更多的系统资源。
  • 安全风险:如果设置得过大,可能会使系统更容易受到 SYN 洪泛攻击,攻击者可以通过发送大量的 SYN 包来填满 SYN 队列,导致服务器无法处理其他正常的连接请求。

4. net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem

调整TCP接收和发送缓冲区的大小,可以提升大量并发连接下的网络吞吐量。

sysctl -w net.ipv4.tcp_rmem='4096 87380 6291456'
sysctl -w net.ipv4.tcp_wmem='4096 16384 6291456'

将这些参数写入/etc/sysctl.conf文件以使更改永久生效。

5. net.ipv4.tcp_no_delay

禁用Nagle算法,对于频繁交换小数据包的应用,可以减少延迟。

sysctl -w net.ipv4.tcp_no_delay=1

将此参数写入/etc/sysctl.conf文件以使更改永久生效。

6. net.core.somaxconn

调整监听队列的长度,允许服务器同时处理更多的连接请求。

前面说了Syn队列的最大长度限制,somaxconn参数决定Accept队列长度,在listen函数调用时backlog参数即决定Accept队列的长度,该参数太小也会限制最大并发连接数,因为同一时间完成3次握手的连接数量太小,server处理连接速度也就越慢。服务器端调用accept函数实际上就是从已连接Accept队列中取走完成三次握手的连接。
Accept队列和Syn队列是listen函数完成创建维护的。
/proc/sys/net/core/somaxconn修改

修改somaxconn 方式如下

# 修改方式一

#修改内核参数 设置 系统中每一个端口最大的监听队列的长度
echo 511 > /proc/sys/net/core/somaxconn

#使修改立即生效 
sysctl -p

# 修改方式二

vim /etc/sysctl.conf
net.core.somaxconn=32768

# 修改方式三
sysctl -w net.core.somaxconn=65535

#使修改立即生效 
sysctl -p

将此参数写入/etc/sysctl.conf文件以使更改永久生效。

7. net.ipv4.ip_local_port_range

调整本地端口范围,为系统提供更多的可用端口。

sysctl -w net.ipv4.ip_local_port_range="1024 65535"

将此参数写入/etc/sysctl.conf文件以使更改永久生效。

8. net.ipv4.tcp_max_tw_buckets

调整TIME_WAIT状态的桶数量,防止过多的TIME_WAIT状态占用过多资源。

sysctl -w net.ipv4.tcp_max_tw_buckets=5000

将此参数写入/etc/sysctl.conf文件以使更改永久生效。

9.net.ipv4.tcp_syncookies

作用tcp_syncookies 参数用于启用 SYN Cookies 功能,这是一种防范 SYN 洪泛攻击的机制。当服务器收到 SYN 包时,如果因为 SYN 队列已满而无法处理新的 SYN 请求,就会使用 SYN Cookies 来处理。

原理

  • 在收到 SYN 包并发送 SYN+ACK 包时,服务器不立即为连接分配内存,而是计算一个 Cookie 值。
  • 收到 ACK 包时,服务器使用该 Cookie 值验证 ACK 包的合法性。
  • 如果验证通过,服务器再为连接分配资源。

设置

  • 默认值为 0(关闭)。
  • 设置为 1 以开启 SYN Cookies。
sysctl -w net.ipv4.tcp_syncookies=1

10. net.ipv4.tcp_keepalive_time

作用tcp_keepalive_time 参数定义了 TCP 连接在处于 ESTABLISHED 状态时,多久发送一次 keepalive 消息以检测连接是否仍然有效。

影响

  • 定时发送 keepalive 消息可以帮助发现并清除死连接,但同时也可能消耗一定的带宽。

设置

  • 默认值通常为 7200 秒(2 小时)。
  • 可以根据需要调整时间间隔
sysctl -w net.ipv4.tcp_keepalive_time=600

11. net.ipv4.tcp_tw_reuse

作用tcp_tw_reuse 参数允许服务器重用处于 TIME_WAIT 状态的 socket,如果新的连接请求与 TIME_WAIT 状态的连接具有相同的四元组(源地址、源端口、目标地址、目标端口)。

好处

  • 减少 TIME_WAIT 状态的连接数量,释放资源以供新连接使用。

设置

  • 默认值为 0(关闭)。
  • 设置为 1 以开启。
sysctl -w net.ipv4.tcp_tw_reuse=1

12. net.ipv4.tcp_tw_recycle

作用tcp_tw_recycle 参数用于加速 TIME_WAIT 状态 socket 的回收过程。当启用时,Linux 内核会跳过一些检查,快速回收处于 TIME_WAIT 状态的 socket。

风险

  • 可能会引入一些安全风险,因为它允许快速重用 TIME_WAIT 状态的端口。

设置

  • 默认值为 0(关闭)。
  • 设置为 1 以开启。
sysctl -w net.ipv4.tcp_tw_recycle=1

13. fs.file-max

fs.file-max 是一个内核参数,它指定了系统可以同时打开的文件数量上限。这个参数非常重要,因为每个运行中的进程都需要打开文件,无论是常规文件、目录、套接字还是管道。

适当增加 fs.file-max 的值可以提升系统处理大量并发文件操作的能力。例如,数据库服务器在处理高并发请求时,可能需要比默认值更高的文件打开数量。

作用
  • 限制系统资源:控制文件描述符的数量,防止系统被过多的文件打开操作所耗尽。
  • 影响系统性能:如果设置得太低,可能会导致进程因为无法打开新文件而失败;如果设置得太高,则可能会占用过多内存。
查看当前值

要查看当前系统的 fs.file-max 参数值,可以使用如下命令:

cat /proc/sys/fs/file-max
修改方法

要永久修改 fs.file-max 参数,可以使用 sysctl 命令或者直接编辑 /etc/sysctl.conf 文件。

  • 临时修改

    sudo sysctl -w fs.file-max=1000000

    这会将系统能打开的最大文件数修改为 1,000,000 个。

  • 永久修改

    /etc/sysctl.conf 文件中添加或修改以下行:

    fs.file-max = 1000000

    修改后,需要重新加载配置文件使更改生效:

    sudo sysctl -p
注意事项
  1. 系统限制:修改 fs.file-max 时,需要注意系统的其他限制,如内存大小,以免造成系统不稳定。
  2. 进程限制:每个进程也有其可以打开的文件数量上限,通常由 /proc/sys/fs/nr_open 参数控制,这个值通常应该小于 fs.file-max
  3. 资源监控:在调整此参数后,应监控系统资源使用情况,确保系统稳定性没有受到影响。
  4. 服务需求:对于需要处理大量文件的应用程序,如数据库和Web服务器,可能需要调高这个值。

总结

通过调整上述内核参数,可以显著提升Linux系统在面对高并发TCP连接时的性能。然而,需要注意的是,调优是一个持续的过程,需要根据实际情况不断调整和优化。同时,调优的效果需要通过实际的测试和监控来验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值