epoll 笔记

news/2024/5/15 18:15:49/文章来源:https://blog.csdn.net/qixiang2013/article/details/129119408
  1. maxevents 参数大小一般不超过64

  1. 必须够了 maxevents 个事件,才会传到用户空间吗?

可见,只要有事件就可以传到用户空间。

一台服务器可以支撑多少个链接

https://blog.csdn.net/mijichui2153/article/details/81331345

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。”

https://blog.csdn.net/mijichui2153/article/details/81331345

C/C++ epoll内存计算方法,4G内存服务器epoll并发量最大能达到多少?

https://blog.csdn.net/u012206617/article/details/89304317

按照题主的意思 是根据内存去算一个最大并发的连接数. 那么首先要找出来单个连接消耗内存的地方.

第一个首先是socket buffer. read 和write 分别有一个, 默认大小在。

/proc/sys/net/ipv4/tcp_rmem (for read)

/proc/sys/net/ipv4/tcp_wmem (for write)

默认大小都是87K和16K, 最低是4K和4K, 最高是2M,2M, 实际使用默认值最低也要保留8K,8K.

然后是逻辑IO缓冲区

就是比如你监听了recv事件 事件来了 你要有内存可用(一般都是socket建立起就分配好,断开才会释放的).

这个内存是自己写socket程序时候自己控制的, 最低也要4K,4K, 实际使用8K,8K至少.

现在设定一个优化方案和使用场景, 首先假设4G内存全部为空闲(系统和其他进程也要内存的….

假如网络包的大小都可以控制在4K以下, 假设所有连接的网络都不会拥堵, 或者拥堵时候的总量在4K以下:

一个连接的内存消耗是4+4+4+4=16K

4G/16K=26.2万并发

假如网络包的大小都可以控制在8K以下, 假设所有连接的网络都不会拥堵, 或者拥堵时候的总量在8K以下

一个socket的内存占用介于 24K ~ 32K之间, 保守的按照32K算

4G/32K=13.1万并发, 这个在生产环境作为一个纯网络层面的内存消耗, 是可以作为参考的.

假如使用默认配置, 假如所有连接的网络都出现严重拥堵, 不考虑逻辑上的发送队列的占用,

使用默认配置是2M+2M+8+8 ~= 4M

4G/4M=1024并发 ( …

如果考虑到发送队列也拥堵的话 自己脑补.

如果只是为了跑分 为了并发而优化, 没有常驻的逻辑缓冲区 并且socket的网络吞吐量很小并且负载平滑, 把socket buffer size设置系统最低.

那么是

4G/8K = 52.4万并发 这个应该是极限值了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_71527.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亮个相吧小宝贝儿,五款压箱底的软件

今天要给大家推荐5款压箱底的宝贝软件了,百度搜索一下就能找到下载链接了。 1.开源浏览器——Firefox Firefox是一个自由的,开放源码的浏览器,适用于 Windows, Linux 和 MacOS X平台,Mozilla Firefox官方版体积小速度快&#xf…

rocketmq延时消息自定义配置

概述 使用的是开源版本的rocketmq4.9.4 rocketmq也是支持延时消息的。 rocketmq一般是4个部分: nameserver:保存路由信息broker:保存消息生产者:生产消息消费者:消费消息 延时消息的处理是在其中的broker中。 但是…

堆球问题,开普勒猜想(格密码相关)

目录 一. 介绍 二. 历史进展分析 三.2维下的堆球问题 四. 3维下的堆球问题 五. 8维与24维下的堆球问题 总结 一. 介绍 堆球问题又叫堆球理论、最密堆积、球填充,英文为The Theory Of Sphere Packings。 堆球问题的本质就是填充一堆大小相同的球。要求这些球…

公会发展计划(GAP)第三季

继前两季发布的公会发展计划取得成功之后,Yield Guild Games 现在推出了第三季的公会发展计划(GAP)。GAP 在第二季有了显著的增长,有超过 3000 个成就 NFT 被铸造。GAP 是以成就为导向的社区代币分配协议,下一次迭代将…

pmp考试是什么?适合哪些人学?含金量?(含pmp资料)

先说一下我这个人的理解,PMP就是提高项目管理理论基础和实践能力的考试。 再说说PMP官方一点的说明: PMP证书全称为Project Management Professional,也叫项目管理专业人士资格认证。PMP证书由美国项目管理协会(PMI)发起,是严格…

美国原装二手keysight E4980A(安捷伦)2MHZ LCR表

Agilent E4980A、Keysight E4980A、LCR 表,20 Hz - 2 MHz E4980A 是 Agilent 的 2 MHz LCR 表。LCR表是一种电子测试设备,用于测量电子元件的电感(L)、电容(C)和电阻(R)。LCR 表可…

关于在VM上的windows server 2022系统安装

目录 1、windows serer 2022安装的准备工作 1)下载系统 2)寻找对应系统密钥 3)配置server系统开机配置项(可能会出现sconfig配置界面) 2、开始安装server系统 1、windows serer 2022安装的准备工作 1)…

【离散数学】1. 数理逻辑

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学:研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑:研究推理的科学 数学方法:引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学,即使用符号化…

「可信计算」与软件行为学

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

实验室设计|实验室设计要点SICOLAB

一、实验室设计规划要素1、实验室布局:实验室的布局要符合实验室工作流程,可以将实验室划分为干净区和污染区,以确保实验室的卫生和实验的准确性。2、设备选购:根据实验需要选择适当的设备,并确保设备的质量和性能符合…

Melis4.0[D1s]:1.启动流程(与adc按键初始化相关部分)跟踪笔记

文章目录1.启动流程1.1 最先进入的文件:head_s.S1.2 start_kernel()函数所在的文件:init.c1.3 input_init()函数所在文件:sys_input.c1.4 INPUT_LKeyDevInit()所在文件:keyboarddev.c1.5 esINPUT_RegLdev()所在文件:in…

【LeetCode】剑指 Offer 09. 用两个栈实现队列 p68 -- Java Version

题目链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/ 1. 题目介绍(09. 用两个栈实现队列) 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别…

如何运行YOLOv6的代码实现目标识别?

YOLOv6是由美团视觉团队开发的1.环境配置我们先把YOLOv6的代码clone下来git clone https://github.com/meituan/YOLOv6.git安装一些必要的包pip install pycocotools2.0作者要求pytorch的版本是1.8.0,我的环境是1.7.0,也是可以正常运行的pip install -r requirement…

【机器学习】决策树-C4.5算法

1.C4.5算法 C4.5算法与ID3相似,在ID3的基础上进行了改进,采用信息增益比来选择属性。ID3选择属性用的是子树的信息增益,ID3使用的是熵(entropy, 熵是一种不纯度度量准则),也就是熵的变化值&…

Kaldi语音识别技术(六) ----- DTW和HMM-GMM

Kaldi语音识别技术(六) ----- DTW和HMM-GMM 文章目录Kaldi语音识别技术(六) ----- DTW和HMM-GMM前言一、语音识别概况二、语音识别基本原理三、DTW(动态时间弯折)算法四、GMM-HMM前言 前面的内容中我们完成了特征的提取,那么本章节我们主要进行理论部分…

2023爱分析· 云管理服务(MSP)市场厂商评估报告:华创方舟

目录 1. 研究范围定义 2. 云管理服务(MSP)市场定义 3. 厂商评估:华创方舟 4. 入选证书 1. 研究范围定义 数字化时代,应用成为企业开展各项业务的落脚点。随着业务的快速发展,应用的功能迭代变得越来越…

VSCode Remote-SSH配置免密登录踩坑

VSCode Remote-SSH配置免密登录踩坑1. 参考2. 基本流程2.1 机器A(Windows客户端)2.2 机器B(Linux服务器)2.3 机器A(Windows客户端)的VSCode设置3. 踩坑总结相关教程很多,但要么冗余,…

Elasticsearch:提升 Elasticsearch 性能

Elasticsearch 是为你的用户提供无缝搜索体验的不可或缺的工具。 在最近的 QCon 会议上,我遇到了很多的开发者。在他们的系统中,Elastic Stack 是不可缺少的工具,无论在搜索,可观测性或安全领域,Elastic Stack 都发挥着…

秒懂算法 | 莫队算法

01、基础莫队算法 莫队算法 = 离线 + 暴力 + 分块。 “离线”和“在线”的概念。在线是交互式的,一问一答;如果前面的答案用于后面的提问,称为“强制在线”。离线是非交互的,一次性读取所有问题,然后一起回答,"记录所有步,回头再做”。 基础的莫队算法是一种离线…

dubbo SPI之依赖注入、禁止依赖注入@DisableInject

本文基于dubbo2.7.7分析 dubbo SPI如何实现依赖注入如何禁用dubbo的依赖注入 使用标准Setter方法依赖注入 dubbo的SPI默认支持依赖注入功能, 在SPI的实现类中,只要写标准的Setter方法即可, 示例如下: public class CustomInterfaceImpl implements CustomInterf…