工作的原因,同事在单条流的性能测试中出现性能值低的问题,最后的问题点确认为缓存设置不合理。为什么要设置缓存?如何设置缓存?

缓存和带宽时延积

读缓存的上限应该由TCP接收窗口的最大值确定,过大或过小的接收窗口(通告窗口),都会造成网络问题。发送端可以发送的一窗数据大小,由拥塞窗口(cwmd)和通告窗口的最小值决定,如果接收窗口过小,将使发送端发送速度缓慢,即使再理想的带宽和网络状况,也无法增加连接的吞吐。而如果接收窗口设置过大(试想节假日的高速公路上车辆无限制的涌入的情形),超过了网络所能承载的上限,将造成网络网络的拥塞和丢包,最后通过发送端的拥塞控制,将连接流量控制在一个合理范围内。

linux协议栈默认的缓存大小设置可以应对普遍情况,但在特殊环境下,例如希望在一条延迟很大的连接上跑出线速,缓存可能就需要被修改。先说一下BDP的概念,出自百度百科,带宽时延积是一种网络性能指标。在数据通信中,带宽时延乘积指的是一个数据链路的能力(每秒比特)与来回通信延迟(单位秒)的乘积。带宽时延积很大的一条连接,称为“长肥管道”。对于一个时延10ms、带宽万兆的网络环境,那么BDP = 10000Mb / 8 * 0.01 = 12.5MB,那么读缓存的理论值为 12.5MB(不考虑tcp_adv_win_scale)

TCP缓存设置

net.core.rmem_default:全协议默认接收缓存大小,对于tcp而言,会被tcp_rmem[1]覆盖;

net.core.wmem_default:全协议默认发送缓存大小,对于tcp而言,会被tcp_wmem[1]覆盖;

net.core.rmem_max:全协议接收缓存最大值;

net.core.wmem_max:全协议发送缓存最大值。

在不使用SO_SNDBUF、SO_RCVBUF套接字选项情况下,系统将使用上面的默认缓存大小,对于tcp而言,默认的缓存大小会被tcp_rmem[1]和tcp_wmem[1]覆盖。

sk->sk_sndbuf = sysctl_tcp_wmem[1];

sk->sk_rcvbuf = sysctl_tcp_rmem[1];

通过套接字选项修改缓存大小的行为如下:

val = min_t(u32, val, sysctl_rmem_max);

sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF);

可以看到,如果缓存设置大于rmem_max,则缓存被修改为rmem_max;如果缓存设置小于SOCK_MIN_RCVBUF,缓存被修改为SOCK_MIN_RCVBUF(2KB)。另外,我们所设置的缓存值被乘以2后设置,这里猜想可能是因为这个缓存值并不完全用于缓存,它需要包含了数据结构大小。

TCP缓存自调节

linux通过net.ipv4.tcp_moderate_rcvbuf使能缓存自调节功能,当系统tcp内存使用少的情况下,为连接分配更大的缓存,而当系统tcp内存使用多的情况下,减少连接缓存的分配大小。

tcp_mem:

tcp_mem[3]被用来追踪TCP的内存使用情况,需要注意这里的单位是页大小而不是字节,它们的默认值在系统启动时根据总的可用内存大小来计算。

tcp_mem[0]:当TCP分配的总内存大小小于该值时,TCP并不控制它的内存分配;

tcp_mem[1]:当TCP使用的总内存大小超过该值时,TCP进入压力状态,并开始减缓它的内存消耗。一旦TCP使用的总内存低于tcp_mem[0],将退出压力状态;

tcp_mem[2]:TCP使用内存的最大值,当其使用的总内存超过该值时,TCP的所有缓存分配都将失败。

tcp_rmem:

tcp_rmem[3]被用来控制TCP接受缓存大小,TCP根据系统的内存使用状况和tcp_rmem配置,动态的调整接收缓存大小。

tcp_rmem[0]:缺省值为页大小,当TCP内存使用处于压力状态时,低于该值的读缓存分配都会成功。当使用SO_RCVBUF对socket缓存大小进行设置后,tcp_rmem对读缓存的限制不再生效;

tcp_rmem[1]:TCP接收缓存的缺省大小,该值将覆盖net.core.rmem_default对所有协议设置的接收缓存默认值。如果期望更大的接收缓存,可以增大该值;

tcp_rmem[2]:TCP套接字接收缓存最大值,该值将不会覆盖全局的net.core.rmem_max,该值不会限制SO_RCVBUF对接收缓存大小的设置。

tcp_wmem:基本与tcp_rmem一致。

总结如下:

1.当TCP内存使用低于tcp_mem[0],不超过连接缓存上限的内存分配都会成功;

2.当TCP内存使用高于tcp_mem[2],连接缓存的分配都会失败;

3.当TCP内存使用高于tcp_mem[0]且低于tcp_mem[2]时,系统可能处于压力状态也可能处于非压力状态,压力状态下连接缓存上限减少,非压力状态下连接缓存上限增加,但保证低于tcp_rmem[0]或tcp_wmem[0]的缓存成功。

linux设置TCP接收缓存,TCP缓存设置及自调节相关推荐

  1. c++tcp接收文件缓存多大合适_必知必会的TCP/IP知识

    点击上方「蓝字」关注我们 1 TCP/IP模型 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络 ...

  2. c++tcp接收文件缓存多大合适_网易面经:深剖TCP协议的流量控制和拥塞控制,你懂了吗?...

    1.自我介绍+项目 2.RPC框架和普通http有什么区别和优势? 基于Tcp封装还是http封装的 3.rpc是长连接吗?如果要传输一个特别大的文件 底层还是基于流吗? Nio是一个什么IO模型? ...

  3. c++tcp接收文件缓存多大合适_linux高性能网络编程之tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣.socket编程方法提供了SO_SNDBUF.SO_RCVBUF这样的接口来设置连接的读写缓存,li ...

  4. qt tcp接收缓冲区设置_TCP的发送缓冲区

    (一)基础知识 IPv4 数据报最大大小是65535(16位),包括IPv4头部. IPv6 数据报最大大小是65575,包括40个字节的IPv4头部 MTU,这是由硬件规定的,如以太网的MTU是15 ...

  5. linux系统如何设置缓存,磁盘缓存如何设置?

    这看你的内存是多少? 如果512的话,最少 50 最大 100 另外建议你在进程里把BT的优先级改低一点 然后如果以后使用电脑的时候决定速度慢了,随时调一下就好了 另外给你参考一下别人的资料: 置好你 ...

  6. 【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )

    文章目录 I 客户端代码示例 II 服务器端代码示例 III 运行结果 I 客户端代码示例 import java.io.IOException; import java.io.InputStream ...

  7. 电脑tcp协议设置成服务器,电脑tcp协议设置成服务器

    电脑tcp协议设置成服务器 内容精选 换一换 DNS服务器用于解析弹性文件服务中文件系统的域名.DNS服务器东北区IP地址为100.125.6.250,其它区域详情请参见华为云内网DNS地址.默认情况 ...

  8. 网络基础4(TCP三次握手,四次握手,TCP流量控制,TCP状态转换 , TCP异常断开,设置TCP属性,端口复用)

    TCP协议 TCP通信时序 下图是一次TCP通讯的时序图.TCP连接建立断开.包含大家熟知的三次握手和四次握手. TCP通讯时序 在这个例子中,首先客户端主动发起连接.发送请求,然后服务器端响应请求, ...

  9. linux内核中TCP接收的实现

    linux内核中TCP接收的实现入口函数是tcp_v4_rcv 1. 数据包检查处理 一开始做一些数据包详细检查处理,一旦出错,可能导致内核挂掉 int tcp_v4_rcv(struct sk_bu ...

最新文章

  1. 非对称加密算法RSA公钥私钥的模数和指数提取方法
  2. 万字解读:预训练模型最新综述!
  3. java 加载中_Java 6类加载中更快的是什么?
  4. C#设计模式(3)——工厂方法模式
  5. 关于集合类的做法示例 实体类赋值 cnblogs
  6. mysql数据库函数详解_MySQL数据库之字符函数详解
  7. matlab自定义函数如何报错,MATLAB自定义函数
  8. 制造业Google Glass 焕发巨大活力
  9. 运筹优化算法工程师面试汇总
  10. 一维无限深势阱定态薛定谔方程
  11. html中target四种选择_blank、_parent、_self、_top,分别是什么意思?
  12. sharding-jdbc(ShardingSphere )、mycat、DRDS 三个分布式数据库中间件的简单介绍(纯理论说明)
  13. 基于区块链技术,电子商务平台将提高安全性和透明度
  14. 【DC010沙龙年度合集】顶尖Hacking技术盛宴(文末福利)
  15. VBS--Microsoft Visual Basic Script Edition(一)
  16. DG - 逻辑standby角色转换
  17. IntelliJ IDEA中好用的插件 写代码必备
  18. 机器学习之多层感知器
  19. Android UI动画 仿直播点赞飘心动画效果
  20. 神州数码:防火墙上配置NAT

热门文章

  1. 云台山走出来的慈善家——李亮先生
  2. 第二届智能制造与工业自动化国际研讨会(CIMIA 2022)
  3. 程序员减肥-肥胖程序员让你上班时间减肥
  4. 白领女性光吃不胖的减肥食品
  5. JavaScript: The Definitive Guide 权威指南,读书笔记(一)
  6. C语言中的conio头文件,C中的conio.h头文件在VC++中是什么?
  7. 踩坑 Mac Xcode 与 conio.h windows.h 库(如何解决错误代码:‘conio.h‘ file not found ‘windows.h‘ file not found)
  8. 简单谈谈编程语言(外篇)
  9. python office365_Python 使用office365邮箱的示例
  10. 如何把中文数字字符串转成十六进制byte[]