11 | 如何修改TCP缓冲区才能兼顾并发数量与传输速度?

本文讨论了在Linux系统中,如何通过理解TCP缓冲区的工作原理,特别是滑动窗口和内存配置,来优化内存使用,以支持高并发下的高速TCP传输。重点关注了带宽时延积对缓冲区大小的影响和如何正确配置TCP窗口大小以避免性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在[第 8 课] 中讲了如何从 C10K 进一步到 C10M,不过,这也意味着 TCP 占用的内存翻了一千倍,服务器的内存资源会非常紧张。

如果你在 Linux 系统中用 free 命令查看内存占用情况,会发现一栏叫做 buff/cache,它是系统内存,似乎与应用进程无关。但每当进程新建一个 TCP 连接,buff/cache 中的内存都会上升 4K 左右。而且,当连接传输数据时,就远不止增加 4K 内存了。这样,几十万并发连接,就在进程内存外又增加了 GB 级别的系统内存消耗。

这是因为 TCP 连接是由内核维护的,内核为每个连接建立的内存缓冲区,既要为网络传输服务,也要充当进程与网络间的缓冲桥梁。如果连接的内存配置过小,就无法充分使用网络带宽,TCP 传输速度就会很慢;如果连接的内存配置过大,那么服务器内存会很快用尽,新连接就无法建立成功。因此,只有深入理解 Linux 下 TCP 内存的用途,才能正确地配置内存大小。

这一讲,我们就来看看,Linux 下的 TCP 缓冲区该如何修改,才能在高并发下维持 TCP 的高速传输。

滑动窗口是怎样影响传输速度的?

我们知道,TCP 必须保证每一个报文都能够到达对方,它采用的机制就是:报文发出后,必须收到接收方返回的 ACK 确认报文(Acknowledge 确认的意思)。如果在一段时间内(称为 RTO,retransmission timeout)没有收到,这个报文还得重新发送,直到收到 ACK 为止。

可见,TCP 报文发出去后,并不能立刻从内存中删除,因为重发时还需要用到它。由于 TCP 是由内核实现的,所以报文存放在内核缓冲区中,这也是高并发下 buff/cache 内存增加很多的原因。

事实上,确认报文被收到的机制非常复杂,它受制于很多因素。我们先来看第一个因素,速度

如果我们发送一个报文,收到 ACK 确认后,再发送下一个报文,会有什么问题?显然,发送每个报文都需要经历一个 RTT 时延(RTT 的值可以用 ping 命令得到)。要知道,因为网络设备限制了报文的字节数,所以每个报文的体积有限。

比如,以太网报文最大只有 1500 字节,而发送主机到接收主机间,要经历多个广域网、局域网,其中最小的设备决定了网络报文的最大字节数,在 TCP 中,这个值叫做 MSS(Maximum Segment Size),它通常在 1KB 左右。如果 RTT 时延是 10ms,那么它们的传送速度最多只有 1KB/10ms=100KB/s!可见,这种确认报文方式太影响传输速度了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值