优化linux系统提高网络速度很多网站都有介绍,但很少介绍为什么要这么做,以及这些数值为什么要这样,本篇简单介绍下,可以根据自己的vps情况等修改自己的配置,可能不对酌情修改。优化就是在 /etc/sysctl.conf
写入自己的网络配置,它用于设置内核参数和系统调优选项,这个文件包含了许多用于调整系统行为和优化性能的设置。
修改系统网络配置我们可以用下列命令先行查看 sysctl 设置项
的值,如:sysctl net.ipv4.tcp_wmem
。
先看一段优化设置,设置如下:
# bbr net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # 启用路径 MTU 发现 net.ipv4.ip_no_pmtu_disc = 0 # 全局套接字默认接受缓冲区 net.core.rmem_default = 25165824 net.core.rmem_max = 33554432 # 全局套接字默认发送缓冲区 net.core.wmem_default = 25165824 net.core.wmem_max = 33554432 # tcp缓冲区大小 net.ipv4.tcp_wmem="4096 16384 16777216" net.ipv4.tcp_rmem="4096 87380 16777216" # UDP 缓冲区的大小 net.ipv4.udp_mem = 65536 131072 262144 net.ipv4.udp_rmem_min = 65536 net.ipv4.udp_wmem_min = 65536 # 其他 net.core.optmem_max = 20480 fs.file-max = 51200
BBR
这个无需细说,bbr是谷歌公司开发的一种新的网络拥塞控制算法,能够优化网络连接的传输效率。海外连接到国内对网速有奇效。Linux 内核 4.9 以上都可以开启。
启用路径 MTU 发现
net.ipv4.ip_no_pmtu_disc = 0
,控制着是否启用路径最大传输单元 (PMTU, Path Maximum Transmission Unit) 发现。路径 MTU 发现 (PMTU Discovery) 是一种机制,用于自动确定从源主机到目标主机的网络路径中允许的最大数据包大小。这有助于避免数据包被丢弃或需要分片,因为数据包大小可能超过网卡的最大传输单元(MTU)。
在这种设置下,内核会在传输数据时根据路径 MTU 发现的结果自动调整数据包大小。如果一个数据包过大而中间路由器无法处理,它将被丢弃并发送一个 ICMP “Fragmentation Needed”(需要分片)消息,源主机会根据这个信息调整后续发送的包的大小。因此需要打开,设置为1表示禁用 PMTU 发现,数据包大小可能不适合网络路径中的所有路由器,导致丢包或性能问题。
全局套接字缓冲区
这是一个全局设置,用于定义系统中所有套接字(包括 TCP 和 UDP)默认的发送和接受缓冲区大小。现在使用HTTP/3协议的服务越来越多,需要修改全局套接字缓冲区设定。
先看看接受缓冲区最大值 net.core.rmem_max = 33554432
怎么来的,国外服务器vps目前基本都是1G的网口及以上,最大值的计算过程是理论值:BDP(时延带宽积)= 带宽(bps,bit/s)× 往返时延(RTT, 秒)。基于 1 Gbps 带宽 和 150 ms RTT(往返延迟,ping一次就是往返),按照公式计算所需的网络缓冲区大小。可以求得1000×1000×1000×0.15=150000000bit,再除以8转换为18750000bytes。为了提高容错能力和处理突发流量,通常会加倍缓冲区大小或取接近的 2 的幂次值,加倍后:18,750,000×2=37,500,000bytes。缓冲区大小通常以 2 的幂次为基准,易于计算和分配内存,可以根据内存大小等取附近的2次幂,这里取2 的25次方33,554,432为基准确定(也就是约34M),也就是net.core.rmem_max = 33554432。
default是默认值,默认情况下linux系统 net.core.wmem_default 的值通常是较小的,例如 212992 字节(大约 208 KB)。但是这个值可以根据需求进行调整。在高带宽、高延迟的网络环境中,默认缓冲区大小可能不足以有效处理大量的数据传输。为避免在高速网络上传输过程中发生阻塞或丢包,我们可以增加缓冲区大小以提升性能。计算方法和上面类似,酌情减少加倍缓冲区大小。通常设置为24M,也就是24×1024×1024=25165824。
全局套接字默认发送缓冲区wmem和上述一样,可以直接套用数值。
tcp缓冲区大小
net.ipv4.tcp_mem = 65536 131072 262144
,用于控制 TCP 内核的内存使用量,具体用于管理 TCP 套接字的缓冲区内存。这个参数定义了三个阈值,小内存限制、默认内存限制 和 最大内存限制,单位是 页面(page),而不是字节。一个页面的大小通常为 4 KB。它们控制了 TCP 内核在不同状态下的内存使用。这些值帮助内核管理 TCP 套接字的内存使用,确保内存分配不会过多,从而避免占用过多系统资源。一般设为最小256kb,默认512kb,最大1MB。256kb就是 65536页面×4KB=262144字节=256KB 。
net.ipv4.tcp_wmem
和 net.ipv4.tcp_rmem
,用于配置 TCP/IP 协议栈中的发送缓冲区和接收缓冲区。和全局套接字缓冲区相比,提供了更精细的控制,允许设置 TCP 套接字的最小、默认和最大发送缓冲区。它实际上是一个数组,包含了三个元素,分别表示最小值、默认值和最大值,格式为 min_size default_size max_size
,单位为字节。
net.ipv4.tcp_wmem="4096 16384 16777216"
,这个参数控制了 TCP 发送缓冲区的大小,发送缓冲区用于存放待发送但尚未被确认的数据;当应用程序发送数据时,数据首先会被放入发送缓冲区,然后通过网络传输,如果发送缓冲区已满,发送操作将会被阻塞,直到有空间可用为止。
net.ipv4.tcp_rmem="4096 87380 16777216"
,这个参数控制了 TCP 接收缓冲区的大小,接收缓冲区用于存放从网络中接收但尚未被应用程序读取的数据;当数据到达时,它首先会被放入接收缓冲区,然后等待应用程序读取。类似于 net.ipv4.tcp_wmem,它的格式、单位都与之相同。
net.ipv4.tcp_wmem
和 net.ipv4.tcp_rmem
的最小值、默认值一般都无需改变,可以通过sysctl net.ipv4.tcp_wmem
查看,我们需要调整的是最大值。
最大值的计算过程和上述一致,也是是理论值:BDP(时延带宽积)= 带宽(bps,bit/s)× 往返时延(RTT, 秒)。例:本地500Mbps,vps1Gbps口,RTT150ms(主要目标地区ping值)。如果需要提高单线程传输能力,可取瓶颈带宽500Mbps,可以求得500×1000×1000×0.15=75000000bit,再除以8转换为9375000bytes。再加上3MB的富余量(加或减需要根据perf3测试重传多少确定)9375000+3*1000*1000=12375000,约12M。缓冲区大小通常以 2 的幂次为基准,易于计算和分配内存,可以根据内存大小等取附近的2次幂,这里取2 的24.次方16777216为基准确定,也就是16M。不取1Gbps是因为满速下客户端不支持,会丢包重传。
UDP 缓冲区的大小
net.ipv4.udp_mem = 65536 131072 262144
调整udp的内存限制,和前述tcp一致。
net.ipv4.udp_rmem_min = 65536
,表示 UDP 套接字的最小接收缓冲区大小,单位是字节。这个设置影响 UDP 套接字在接收数据时使用的最小内存空间,即最小64 KB。需不需要设置最大值呢?如果不设置的话,net.core.rmem_max
控制所有协议(包括 TCP 和 UDP)的 最大接收缓冲区大小。这个值会影响所有套接字的最大缓冲区大小,包括 UDP 套接字。net.ipv4.udp_rmem_max
就受到net.core.rmem_max
的控制,也就是和前述的net.core.rmem_max = 33554432
值一致。net.ipv4.udp_rmem_min = 65536
,取64KB,为 UDP 套接字提供更大的缓冲空间,适合高带宽、高延迟的场景(如 1Gbps 带宽和 150ms 延迟),能够更好地应对突发流量或较大的数据包。如取为net.ipv4.udp_rmem_min = 16384
16KB,节省内存资源,适合处理小数据包或系统内存有限的情况,适用于轻量级 UDP 流量(如 DNS 查询或小型消息通信)。对于高带宽和高延迟网络环境,可能不足以容纳更大的数据流,导致丢包。
其他
net.core.optmem_max = 20480
,用于控制套接字选项缓冲区(socket option buffer)的最大大小,这里设置为20kb。它的作用是设置一个限制,规定用于存储套接字选项的内存区域的最大值。套接字选项,当程序与套接字通信时,可能需要在操作系统内核与用户空间之间交换配置选项(如 TCP_NODELAY,SO_RCVBUF 等)。这些选项需要内核分配内存进行处理,而 optmem_max 控制的是这部分内存的最大大小。如果某些应用程序需要设置一些网络参数(例如 TCP 缓冲区大小),系统会分配最多 20 KB 的内存来存储这些参数。linux系统在高负载下运行,或有大量并发网络连接时,可以增加该值,以确保足够的内存分配来处理大量的套接字选项。
fs.file-max = 51200
用于设置系统允许的最大文件描述符数量。文件描述符是操作系统用来跟踪和管理文件、套接字、管道等资源的标识符。51200 这个值表示系统允许同时打开的文件描述符最大数量为 51200。这适用于需要大量并发 I/O 操作的系统(例如 Web 服务器、数据库服务器等),在高负载情况下,系统可能会打开大量文件或套接字。运行的应用程序经常遇到 “too many open files”(文件过多)错误,可能需要增加 fs.file-max
。
知道了以上原理,可以看到原来的设置 全局套接字默认缓冲区 只对udp产生了作用,tcp是net.ipv4.tcp_wmem等决定的。 针对国外服务器 ,我们可以只要这样写一下优化配置就可以了。
# bbr net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # 启用路径 MTU 发现 net.ipv4.ip_no_pmtu_disc = 0 # 全局套接字默认接受缓冲区,给出udp和tcp的默认值及最大值 net.core.rmem_default = 25165824 net.core.rmem_max = 33554432 # 全局套接字默认发送缓冲区,给出udp和tcp的默认值及最大值 net.core.wmem_default = 25165824 net.core.wmem_max = 33554432 # tcp缓冲区大小,tcp内存的设置及,tcp最小缓冲区设置 net.ipv4.tcp_mem = 65536 131072 262144 net.ipv4.tcp_rmem_min = 65536 net.ipv4.tcp_wmem_min = 65536 # 调整 UDP 缓冲区的大小 net.ipv4.udp_mem = 65536 131072 262144 net.ipv4.udp_rmem_min = 65536 net.ipv4.udp_wmem_min = 65536 # 其他 net.core.optmem_max = 20480 fs.file-max = 51200
这样对于 TCP/IP 协议栈就等效于设置 net.ipv4.tcp_wmem="65536 25165824 33554432"
。至于 带宽 是用1Gbps还是500Mbps还是其他要看你服务器用途决定。如果是网页、下载等服务器,可以按1Gbps及大部分用户的延时决定;如果是用来翻墙,需要提高单线程上传下载能力避免重传等可以用瓶颈带宽设置。
执行 nano /etc/sysctl.conf
把优化的配置写入进去并保存,执行 sysctl -p
让其生效。
实际上由于现在硬件设备强大,系统容错率也较高,这些所谓的优化其实意义不是很大,不做任何修改网络也一样能稳定运行。
技术不断升级,请注意文章时效性。
本站文章,欢迎转发。转载请注明出处:https://www.bandwh.com/web/2199.html