Linux网络编程-tcp缓存设置
最近发现服务的逻辑完成时间很短,但是上游接收到的时间比较长,所以就怀疑是底层数据的序列化/反序列化、读写、传输有问题,然后怀疑是TCP的读写缓存是不是设置太小。现在就记录下TCP缓存的各配置项以及缓存大小的计算公式。
1.有关发送、接收缓存的配置
内核设置的套接字缓存
/proc/sys/net/core/rmem_default,net.core.rmem_default,套接字接收缓存默认值 (bit)
/proc/sys/net/core/wmem_default,net.core.wmem_default,套接字发送缓存默认值 (bit)
/proc/sys/net/core/rmem_max,net.core.rmem_max,套接字接收缓存最大值 (bit)
/proc/sys/net/core/wmem_max,net.core.wmem_max,发送缓存最大值 (bit)
tcp缓存
/proc/sys/net/ipv4/tcp_rmem:net.ipv4.tcp_rmem,接收缓存设置,依次代表最小值、默认值和最大值(bit)
4096 87380 4194304
/proc/sys/net/ipv4/tcp_wmem:net.ipv4.tcp_wmem,发送缓存设置,依次代表最小值、默认值和最大值(bit)
/proc/sys/net/ipv4/tcp_mem:
94500000 915000000 927000000
对应net.ipv4.tcp_mem,tcp整体缓存设置,对所有tcp内存使用状况的控制,单位是页,依次代表TCP整体内存的无压力值、压力模式开启阀值、最大使用值,用于控制新缓存的分配是否成功
tcp或者udp的设置会覆盖内核设置。其中只有tcp_mem是用于tcp整体内存的控制,其他都是针对单个连接的。
2.修改配置
sysctl -w net.core.rmem_max=8388608
...
sysctl -w net.ipv4.tcp_mem='8388608 8388608 8388608'
3.估算TCP缓存大小
以tcp接收缓存为例(实际上发送窗口=对方的接收窗口),tcp接收缓存有2部分组成:接收窗口及应用缓存,应用缓存用于应用的延时读及一些调度信息。linux使用net.ipv4.tcp_adv_win_scale(对应文件/proc/sys/net/ipv4/tcp_adv_win_scale)指出应用缓存的比例。
if tcp_adv_win_scale > 0: 应用缓存 = buffer / (2^tcp_adv_win_scale),tcp_adv_win_scale默认值为2,表示缓存的四分之一用于应用缓存,可用接收窗口占四分之三。
if tcp_adv_win_scale <= 0: 应用缓存 = buffer - buffer/2^(-tcp_adv_win_scale),即接收窗口=buffer/2^(-tcp_adv_win_scale),如果tcp_adv_win_scale=-2,接收窗口占接收缓存的四分之一。
那如果能估算出接收窗口就能算出套接字缓存的大小。如何算接收窗口呢?
BDP(bandwidth-delay product,带宽时延积) = bandwith(bits/sec) * delay(sec),代表网络传输能力,为了充分利用网络,最大接收窗口应该等于BDP。delay = RTT/2。
receive_win = bandwith * RTT / 2
buffer = rec_win/(3/4) (上面知道tcp_adv_win_scale=2时表示接收窗口占buffer的3/4
以我们的机房为例,同机房的带宽为30Gbit/s,两台机器ping可获得RTT大概为0.1ms,那BDP=(30Gb/1000) * 0.1 / 2 = 1.5Mb,buffer = 1.5Mb * 4 / 3 = 2Mb
4.TCP缓存的综合考虑
如第三节我们真的能设置tcp最大缓存为2Mb吗?通常一台机器会部署多个服务,一个服务内部也往往会建立多个tcp连接。但系统内存是有限的,如果有4000个连接,满负荷工作,达到最大窗口。那么tcp整体消耗内存=4000 * 2Mb = 1GB。
并发连接越多,默认套接字缓存越大,则tcp占用内存越大。当套接字缓存和系统内存一定时,会影响并发连接数。对于高并发连接场景,系统资源不足,缩小缓存限制;并发连接少时,可以适当放大缓存限制。
linux自身引入了自动调整接收缓存的功能,来使吞吐量最大,(缓存最大值还是受限于tcp_rmem[2])。配置项如下。
net.ipv4.tcp_moderate_rcvbuf = 1 (/proc/sys/net/ipv4/tcp_moderate_rcvbuf)
Linux网络编程-tcp缓存设置的更多相关文章
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- Linux 网络编程——TCP
环境:Linux C 一.协议介绍 TCP是面向连接的协议,提供可靠的数据传输:TCP协议的可靠传输基于三次握手.四次挥手以及确认重传机制实现.下面来具体展示下TCP的三次握手.四次挥 ...
- linux网络编程tcp
之前学习的时候笔记没有保存好,这次重新编写一个案例. 客户端实现程序代码: #include <string.h> #include <stdlib.h> #include & ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信
Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命令.socketserver通信 目录 Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命 ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
随机推荐
- Sublime Text3安装JsHint
介绍 Sublime Text3使用jshint依赖Nodejs,SublimeLinter和Sublimelinter-jshint. NodeJs的安装省略. 安装SublimeLinter Su ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- 旺财速啃H5框架之Bootstrap(三)
好多天没有写了,继续走起 在上一篇<<旺财速啃H5框架之Bootstrap(二)>>中已经把CSS引入到页面中,接下来开始写页面. 首先有些问题要先处理了,问什么你要学boot ...
- ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...
- 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)
Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...
- 谈谈一些有趣的CSS题目(七)-- 消失的边界线问题
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- java中易错点(二)
java,exe是java虚拟机 javadoc.exe用来制作java文档 jdb.exe是java的调试器 javaprof,exe是剖析工具 解析一: sleep是线程类(Thread)的方法, ...
- JSP 标准标签库(JSTL)
JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签, ...
- 我的屌丝giser成长记-工作篇之B公司
从A公司跳槽到B公司,岗位还是webgis开发方向,但是具体实现的技术完全变了,从flex转换js,这也是我要离开A公司的最重要的原意之一:A公司的arcgis for flex框架采用了flexvi ...