网络 buffer 与内存 swap

news/2024/4/20 9:21:54/文章来源:https://blog.csdn.net/dog250/article/details/128037033

到底要不要开 swap,几乎一致说不,但仍有人为之辩护:In defence of swap: common misconceptions 。

这文章没站稳立场,承认不要将 swap 作为 emergency memory,承认卡顿,却没找准根因并解决,只寻求 “公平卡顿”,将坏事分摊到所有进程,并引入没完没了地调参。

Swap is primarily a mechanism for equality of reclamation, not for emergency “extra memory”. Swap is not what makes your application slow – entering overall memory contention is what makes your application slow.

文中显示,内存争抢是变慢的原因。case by case 看,文章没错,就像用排队代替争抢一样。但问题是,避免内存争抢才是根本,为什么不提一下应用程序的贪婪呢?

作者接受每个应用程序申请并读写 50GB 内存,并希望利用 swap 让结果不太糟糕,但作者没意识到,问题的根源恰恰在于申请内存太多,而不是满足这么多内存需求的方式不够好。

时代早就变了,“古时候”,由于内存不足导致程序执行失败进而重新载入程序的成本非常高,可现在,如果内存配置就是低,一次少运行几个程序没什么大不了,而再低的内存配置也几乎能满足一个程序的需求。

swap 相关的内存颠簸抖动和网络传输延时抖动相比,无论从原因还是结果看,如出一辙。

网络传输有端到端反馈以提醒 sender 做拥塞控制,而不是承认 sender 的贪婪后想办法最小化其贪婪的恶果。
举个例子。

根治延时抖动之术,大 buffer 加一个好的队列算法,还是小 buffer 加一个好的拥塞控制算法,显然是后者。延时抖动的根源是 buffer,延时的最大方差取决于 buffer 大小,大方差是否引起抖动取决于报文如何到达,好的队列算法只能尽量保证延时公平。

足够久,河里一定会有鱼,这是进化论,也是统计律,足够久,buffer 一定有填满的时刻,也是统计律,因此 buffer 越大,延时一定会增加。所以要有好的拥塞控制算法。

swap 和 buffer 一样,只提供假象,该假象和 buffer 一样具象。buffer 足够大,端可以一直发送而不丢包,但只有带宽才真实。swap 足够大,可满足进程对足够多内存的需求,但只有物理内存才真实。

和好的拥塞控制以效率和公平为目标一致,高尚的做法是高效紧凑使用内存,好的调度算法公平使用内存。
与 buffer 满了丢包不同,内存满了除 OOM 外无法丢弃匿名页,但这并非开 swap 的理由。开篇引用的文章提出的转嫁 I/O 我并不认同,理由很简单,拥有后备存储的 page cache,代码页(简称后备页)等内存是特殊的,与匿名页并不平等。

后备页并非真正的内存页,而作为 cache 临时占用物理内存,剩下的匿名页是才算真正的内存,30GB 的内存装不下 40GB 字节,这是基础事实,正确的做法是将内存扩到 40GB 以上,而不是用 swap 提供假象。因为回收和调入 page cache 造成颠簸无碍,将此事看作 cache 回写和刷新更合适,应该评估这种 cache 在整体上的收益,而不是拉低匿名页效率以求公平性。

开启 swap 在整体上并不能平衡后备页 I/O 造成的颠簸,若不是 page cache,这些页本来是要每次 I/O 的。
10Mbps 带宽铁定无法满足 100Mbps 码率,这个都理解,正确的做法要么购买更大带宽,要么忍受更低品质,而不是增加 buffer。换到内存场景,30GB 的内存就是满足不了 40GB 字节的需求。

为挽救没有后备的匿名内存,应对内存的统计突发申请,要么以足够低的物理内存使用率安排应用程序,要么应用程序自行对匿名内存做后备存储。比如始终保留若干足够大的空闲内存作为 buffer 应对统计突发,越下界则新内存分配失败,越上界则 OOM。

内存抖动的根源在于内存不够大却还要贪婪使用,要么约束应用程序,要么买更大内存。但文章显然不是这个意思。

应对统计突发的时空转换是等价的。

带宽属于时间延展资源,数据会随时间流逝,因此额外空间暂存突发,就是网络节点的 buffer。与之相对,内存属于空间延展资源,数据不会随时间流逝,因此需要额外时间,等内存释放或挪动数据腾出空间,同时要求应用程序尽快释放不使用的匿名页,因此保持一个足够高又不太高的内存使用率可供吸收突发。

为什么 swap 不能像 buffer 吸收网络突发那样吸收内存突发?

网络在汇聚,大收敛,多对一扇入面临的突发内存并不存在,以网络拥塞为例,任何信息均无法第一时间反馈到 sender 而抑制它,若丢包替代排队,sender 无法获取反馈以实施拥塞控制,重传数据更容易淹没网络,小 buffer 配合 AQM 是避免拥塞崩溃的重要一环。内存场景与之不同,内存可第一时间反馈失败,若启用 swap,只是增加颠簸后延迟了失败,远不如快速失败。

借着内存 swap 的反面评述一个人们在本质上相同的两件事上矛盾的做法。很有意思。

“内存抖动的根源在于内存不够大却还要贪婪使用,要么约束应用程序,要么买更大的内存“ 上面这句话换到网络传输场景再说一遍就是 “延时抖动的根源在于带宽不够大却还要贪婪使用,要么约束发送,要么买更大带宽”,前者,人们普遍知道 swap 不好,要关掉,可对后者,人们却依然倾向于部署大 buffer 而不想约束发送。

在我看来,计算机里的进程更具有全局观,统筹全局的就是计算机用户或管理员,而分布式端主机则处于博弈状态。

但无论如何,与网络传输相似,应用程序对内存的使用也存在并需要端到端控制,若每个应用程序拼命申请读写匿名页,OOM 会保证进程级公平性。另一方面,若每个应用程序都企图用更多内存做磁盘的后备 cache,频繁页面回收和调入势必造成所有应用的内存颠簸,一损俱损也公平。但把很多场景糅合在一起,似乎很难保证公平,正如网络传输多个拥塞控制算法混部并存很难保证公平性一样。

大致就是以上的意思,在我看来,文初引用的那篇文章观点不正确,请关掉 swap。

周一下午讨论了一个问题,说是为什么关闭 swap。注意,问题是 “为什么关闭 swap”,而不是 “要不要关闭 swap”,有人不但答非所问,反而贴了一个文章链接而支持打开 swap,此人道不明,似乎是为了反驳而反驳,读了链接的文章,亦不敢苟同。关于 swap 不 swap,一句简单的话,你安装有多大物理内存,就申请多少用量,有多少硬件资源干多大事。打开 swap 只是没事找事。写篇作文记之。

浙江温州皮鞋湿,下雨进水不会胖。

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

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

相关文章

Day11--首页-轮播图效果

1.创建 home 分支 我的操作: ************************************************** ************************************************** ******* 2.配置网络请求 博主文档: 我的操作: 1》.先初始化一个package.json文件。 2》根据博主的…

秉持技术普惠的华为,致力于无处不在的联接

编辑 | 阿冒 设计 | 沐由经济学家托马斯弗里德曼在《世界是平的》一书中曾经指出:“科技和通信领域如闪电般迅速的进步,使全世界的人们可以空前地彼此接近。”然而,在世界各国和地区的政府工作报告中,“数字鸿沟”一词出现的频…

vscode一键生成佛祖保佑永无bug

工欲善其事,必先利其器 今天给大家分享一个vscode注释插件-koroFileHeader,可以快速给我们的文件和函数添加注释,快来看看吧 安装 打开vscode拓展,搜索“koroFileHeader”,安装,重新启动一下 使用 快捷键 生…

边缘计算那些事儿--网络切片技术(1)

0 背景 边缘计算可以支持就近的计算卸载,让数据在靠近数据源的设备上处理。对于边缘计算低时延的应用场景来说,网络性能的好坏,直接影响着卸载算法的整体耗时,决定着整个算法模型的可行性。因此如果想实现低时延卸载算法&#xff…

国外顶尖程序员手写,402页汉译版微服务与事件驱动架构开发手册

为什么用事件驱动型微服务? Marshall McLuhan认为,影响人类并给社会带来根本性变革的不是媒介的内容,而是与媒介的互动过程。在我们的集体参与下,报纸、广播、电视、互联网、即时通信和社交媒体改变了人类的互动方式以及社会结构…

python数据分析绘图

ROC-AUC曲线(分类模型) 混淆矩阵 混淆矩阵中所包含的信息 True negative(TN),称为真阴率,表明实际是负样本预测成负样本的样本数(预测是负样本,预测对了)False positive(FP),称为假…

activiti-bpmn-converter

activiti-bpmn-converter目录概述需求:设计思路实现思路分析1.BpmnXMLConstants2.BpmnXMLConverter3.StartEventXMLConverter4.EndEventXMLConverter参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full bu…

伸展树原理介绍

一 点睛 伸展树,也叫作分裂树,是一种二叉搜索树,可以在 O (logn ) 内完成插入、查找和删除操作。在任意数据结构的生命周期内执行不同操作的概率往往极不均衡,而且各操作之间有极强的相关性,在整体上多呈现极强的规律…

zabbix集群搭建分布式监控的操作步骤

作用: 分担server的集中式压力解决多机房之间的网络延迟问题环境准备: 服务器1:zabbix-server 服务器2:zabbix-proxy 服务器3:zabbix-agent 关系:zabbix-agent发送数据到代理,代理汇总数据发送…

学习Python要学习哪些课程?

通过学习 Python数据分析与应用课程,可以掌握Python进行科学计算、可视化绘图、数据处理,分析与建模、构建聚类、回归、分类模型的主要方法和技能,并为后续相关课程学习及将来从事数据分析挖掘研究、数据分析工作奠定基础。 Python数据分析与…

XSStrike工具使用说明

今天继续给大家介绍渗透测试相关知识,本文主要内容是XSStrike工具使用说明。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权…

记录:微星 GE63 屏轴断裂 之后。。。

2022/11/25 记录 微星 GE63 1070 笔记本,使用的第三年,已过保了一年,上周使用时,准备合上笔记本盖。啪一下,左侧屏轴断裂,B面翘起,A面左下角轴盖断了一截。 网上好多人都有类似的情况&#xff…

Linux多核运行机制(SMP)

一、Linux内核兼容多处理器要求 有多个 CPU 处理器 的 系统中 , Linux 内核需要处理的问题 : 1、公平共享 : CPU 的负载 , 需要公平地共享 , 不能出现某个CPU空闲 , 造成资源浪费。 2、可设置进程 与 CPU 亲和性 : 可以为 某些类型的 进程 与 指定的 处理器设置亲和性 , 可以针…

数据结构与算法之让我们种下一棵字典树(Java/C++双语言实现)

⭐️前面的话⭐️ 本篇文章将介绍一种经常使用的数据结构——字典树,它又称Tire树,前缀树,字典树,顾名思义,是关于“字典”的一棵树。这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径&#xff0…

CSRF漏洞简介

今天继续给大家介绍渗透测试相关知识,本文主要内容是CSRF漏洞原理、产生与危害。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未…

C语言 * 数组的解析 *

目录 一:一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二:二维数组的创建和初始化 2.1 数组的创建 2.2 数组的初始化 2.3 一维数组的使用 2.4 一维数组在内存中的存储 2.5 数组越…

【蓝桥杯选拔赛真题30】python计算倒数和 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python计算倒数和 一、题目要求 1、编程实现 2、输入输出 3、评分标准

从01背包说起(上)

目录 引入 1.什么是动态规划? 2.什么是背包问题? 3.什么是01背包? 模板题 1.题面 2.思路 Ⅰ为何不可用贪心 Ⅱ状态转移方程 3.代码 下期预告 引入 1.什么是动态规划? 动态规划(英语:Dynamic programming&#xff0…

收到多个20k+的offer!选哪一个呢?

“收到offer了!”最近,黑马老师收到最多的消息就属这句了。随着黑马各个学科迎来毕业,班主任收到的喜讯越来越多。班主任说,没有比在接近年底时收到学生就业喜讯更让人开心的事了。今天,播妞给大家带来的是黑马HTML&am…

就两秒?这说出去谁信啊!

文 | xiaoyi(转载请后台联系)关注公众号:小一的学习笔记截止发文,北上广深一共有6510条公交线路为了获取上面的这些线路信息,我写了一个爬虫,大概用了2秒左右就搞定,真爽!说出来你们…