这篇文章比较好,可以关注下 https://zhuanlan.zhihu.com/p/290651392

0、初始两台虚拟机的初始状态如下:

服务端初始状态内存占用330.8M左右,剩余内存647.1M。

客户端初始状态内存占用350.4M左右,剩余内存627.5M。

服务端:

客户端:

/

1、开始建立TCP连接设定连接数为三万。

建立三万个连接,经过测试确实是吃内存的。

1.1、一万个连接的时候

服务端:

客户端:

10000个连接的时候服务端内存消耗:647.1-576.6=70.5M。

10000个连接的时候客户端内存消耗:627.5-588.6=38.0M。(考虑截图误差人为减了0.9)

1.2三万个连接的时候

服务端:

客户端:

30000个连接的时候服务端消耗了:647.1-433.0=214.1M

30000个连接的时候客户端消耗了:627.5-500.4=127.1M

之后这个数据保持的相当稳定。

2、分析:

0、根据测试结果计算出来的内存占用如下:

服务端:214.1M=219238.4KB;每个连接占用内存=219238.4KB/30000=7.31KB

客户端:127.1M=130150.4KB;每个连接占用内存=130150.4KB/30000=4.34KB

这个数靠谱吗??验证如下

我们知道一个TCP连接主要内存消耗为文件描述符、读缓冲、写缓冲。

1、服务端、客户端的读写缓冲区大小均如下:

cat /proc/sys/net/ipv4/tcp_rmem  
4096    4096    16777216 #TCP读缓存大小,单位是字节:第一个是最小值4K,第二个是默认值85K,第三个是最大值16M。
cat /proc/sys/net/ipv4/tcp_wmem
4096    4096    16777216 #TCP写缓存大小,单位是字节:第一个是最小值4K,第二个是默认值64K,第三个是最大值16M。

也就是说一个TCP在三次握手建立连接后,最小的内存消耗在8K左右,最大的内存消耗在32M左右。(注:这是错的

然后问题就来了,为毛客户端我算出来的每个TCP连接只有4.34k,即时是服务端也只有7.31k而已????

1.1难道是建立的TCP连接数不对?验证之

netstat -nat|grep -i "12345"|wc -l %12345为端口号

结果如下是服务端30001个、客户端30000个:

看来连接数不存在问题,确实是3万个TCP连接。

1.2、实在想不到原因了只能怀疑网上说的最低8K了。

果然:目光再次转向了陈硕大神在知乎上的一篇帖子。陈硕大神贴

“8K论”说法错误的原因在于 TCP 连接在建立时并不会真的去分配接收缓冲区和发送缓冲区,此时只有socket文件描述符占用内存,一个socket大约3k。3K具体怎么来的可以参考上面陈硕的那个链接。

对于接收缓冲区和发送缓冲区,如果没有数据,是不占内存的。具体来说,对于接收缓冲区,只有当有数据可读但应用程序尚未读取的时候才占内存(就是 epoll_wait 返回 EPOLL_IN之后,程序调用 read() 之前的那一小段时间)。换句话说,只要服务器总是及时读取数据,接收缓冲区基本不占内存。对于发送缓冲区,只有等待发送的数据和发送之后尚未收到 ACK 的数据才占用内存,在稳态下,发送缓冲区占用的内存等于 BDP。

1.3、至此为什么小于8K的问题解决了。那为什么服务端但TCP连接占用的内存比客户端多很多呢????

说到这儿就要结合上一段话和之前的 CPU占用率和Load Average区别的文章   。

我们知道在我们之前的压力测试中性能瓶颈来源于服务端的CPU,具体来说是CPU的Load Average大于1,导致的较多待处理task排队。在结合上一段陈硕的话“对于接收缓冲区,只有当有数据可读但应用程序尚未读取的时候才占内存(就是 epoll_wait 返回 EPOLL_IN之后,程序调用 read() 之前的那一小段时间)”。所以接受端平均内存占用达到7.31K的原因应该就是因为应用程序并没有每次都立刻读取缓冲区中的数据。从而导致缓冲区确实占用了部分内存得到情况。

1.4.注册一个epoll事件会占用内存空间吗?

按照epoll的实现机制事件是注册到内核事件表的,这个表应该是由红黑树实现的。按照《Linux高性能服务器编程》的说法一个事件会消耗160字节的内核空间。也就是说这个事件对象的本身占用的应该不是内存空间,当然epoll_wait的调用和返回可能会占用一些内存空间。

在说一遍:读缓存是一个动态变化的、实际用到多少才分配多少的缓冲内存,当这个连接非常空闲时,且用户进程已经把连接上接收到的数据都消费了,那么读缓存使用内存就是0。写缓存也是同样道理。... 因此,写缓存也是动态变化的,空闲的正常连接上,写缓存所用内存通常也为0。”

服务端客户端均采用epoll模式,建立3万TCP连接对内存的影响。相关推荐

  1. 二、Netty服务端/客户端启动整体流程

    一.综述 Netty 的整体流程相对来说还是比较复杂的,初学者往往会被绕晕.所以这里总结了一下整体的流程,从而对 Netty 的整体服务流程有一个大致的了解.从功能上,流程可以分为服务启动.建立连接. ...

  2. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  3. 一个简单的完成端口(服务端/客户端)类

    一个简单的完成端口(服务端/客户端)类 作者:spinoza 翻译:麦子芽儿, POWERCPP(后面部分内容) 下载源代码 原文网址:http://www.codeproject.com/KB/IP ...

  4. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    TCP/IP网络编程之基于TCP的服务端/客户端(一) 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于 ...

  5. Redis(服务端/客户端)的启动、关闭、查看状态

    目录 服务端 查看Redis是否启动 前台启动 后台启动 关闭(停止) 客户端 启动(单机模式) 启动(集群模式) 退出 客户端使用示例 服务端 查看Redis是否启动:ps -ef|grep red ...

  6. linux 进程sockfd fork,Linux下多进程服务端客户端模型一(单进程与多进程模型)...

    本文将会简单介绍Linux下如何利用C库函数与系统调用编写一个完整的.初级可用的C-S模型. 一.基本模型: 1.1   首先服务器调用socket()函数建立一个套接字,然后bind()端口,开始l ...

  7. SpringBoot整合WebService(服务端+客户端)

    SpringBoot整合WebService(服务端+客户端) 文章目录 SpringBoot整合WebService(服务端+客户端) 一.服务端 1.项目结构 2.创建好SpringBoot项目后 ...

  8. 侠义道服务器修改,[侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改...

    [侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改 资源说明: 1.本资源为侠义道Online1.85版本,默认IP为192.168.200.175,虚拟机架设,默认使用NAT模 ...

  9. react服务端/客户端,同构代码心得

    FKP-REST是一套全栈javascript框架 react服务端/客户端,同构代码心得 作者:webkixi react服务端/客户端,同构代码心得 服务端,客户端同构一套代码,大前端的梦想,为了 ...

  10. restful服务端客户端_测试RESTful服务的客户端

    restful服务端客户端 开发使用RESTful Web API的应用程序可能意味着开发服务器和客户端. 为服务器端编写集成测试可以像使用Arquillian启动服务器一样容易,并且可以通过REST ...

最新文章

  1. 软件开发是一门手艺活
  2. javascript高级程序设计第一章
  3. hbid新建html标签不能用,hbhdjtx.html
  4. 以连咖啡为例丨设计小程序的流量裂变体系
  5. 电脑看书软件_能全平台阅读的图书软件,是kindle? No!大公司低调出品
  6. java如何忽略过程值_如果值为null,如何告诉Jackson在序列化期间忽略某个字段?...
  7. java宏定义_现代化的 Java (二十六)—— Akka Stream Graph
  8. zabbix2.0安装与配置
  9. 程序员 面试笔记 C++ 程序设计的基础 第10章
  10. YOLOv4论文笔记
  11. c语言实现线程相关操作,如何用C语言实现多线程
  12. JVM监控及诊断工具GUI篇之Arthas(二):jvm相关指令
  13. Xshell/Xftp个人完全免费版
  14. php poedit怎么debug,php – 如何使PoEdit正确解析自定义“ngettext”实现?
  15. wxPay微信支付订单提交提示「订单号重复」问题
  16. Android App 耗电量分析-1
  17. 汇编指令lmm_动画视频角色的LMM神经网络
  18. 世界哲学语录100句(句句珠玑,细细品味)
  19. 为了学(mo)习(yu),我竟开发了这样一个插件
  20. 【3】简单粗暴MATLAB中文文本分类

热门文章

  1. 如何格式化电脑_电脑硬盘不小心格式化如何恢复【恢复方法】
  2. 部署java的tcp服务端_java网络编程(TCP)-服务端
  3. 黑匣子_NOI导刊2010提高 (对顶堆)
  4. nginx access.log 忽略favicon.ico訪问记录的方法
  5. 用数羊的方式来解释熵
  6. linux 输入--输出--重定向 stdin/stdout/stderr
  7. 奶爸业余单片机学习之:C语言基础——for循环及for嵌套
  8. 2012春季ACM内部测试赛3
  9. [C语言数据存储深度解析]-内存数据搞不懂?三千字长文带你走进数据类型及其存储
  10. Linux之http服务基本配置案例