19 | 案例篇:为什么系统的Swap变高了(上)
倪朋飞
该思维导图由 AI 生成,仅供参考
你好,我是倪朋飞。
上一节,我通过一个斐波那契数列的案例,带你学习了内存泄漏的分析。如果在程序中直接或间接地分配了动态内存,你一定要记得释放掉它们,否则就会导致内存泄漏,严重时甚至会耗尽系统内存。
不过,反过来讲,当发生了内存泄漏时,或者运行了大内存的应用程序,导致系统的内存资源紧张时,系统又会如何应对呢?
在内存基础篇我们已经学过,这其实会导致两种可能结果,内存回收和 OOM 杀死进程。
我们先来看后一个可能结果,内存资源紧张导致的 OOM(Out Of Memory),相对容易理解,指的是系统杀死占用大量内存的进程,释放这些内存,再分配给其他更需要的进程。
这一点我们前面详细讲过,这里就不再重复了。
接下来再看第一个可能的结果,内存回收,也就是系统释放掉可以回收的内存,比如我前面讲过的缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)。
大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放。
这些脏页,一般可以通过两种方式写入磁盘。
可以在应用程序中,通过系统调用 fsync ,把脏页同步到磁盘中;
也可以交给系统,由内核线程 pdflush 负责这些脏页的刷新。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了系统Swap机制的工作原理及其在NUMA架构下的应用。Swap机制通过将不常访问的内存数据暂时存储到磁盘中,释放内存资源,以应对系统内存资源紧张的情况。文章详细解释了Swap的工作原理,包括换出和换入两个过程,以及内存回收的相关概念和内核线程kswapd0的作用。此外,还介绍了Swap的应用场景,如在内存不足时运行大内存的应用程序、避免OOM杀死进程、以及支持笔记本电脑的休眠和快速开机功能。文章指出,即使现在内存便宜且服务器配置较大内存,Swap仍然具有重要作用。最后,文章提到了内存压力的衡量方法,以及内核选项对内存阈值的设置。通过本文的内容,读者可以深入了解Swap机制的工作原理和应用场景,以及内存回收的相关概念和方法。文章内容涵盖了Swap机制的原理、应用及相关技术细节,对于需要深入了解系统内存管理的读者具有重要参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》,新⼈⾸单¥68
《Linux 性能优化实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(78)
- 最新
- 精选
- Ray关于上面有同学表示 hadoop 集群建议关 swap 提升性能。事实上不仅 hadoop,包括 ES 在内绝大部分 Java 的应用都建议关 swap,这个和 JVM 的 gc 有关,它在 gc 的时候会遍历所有用到的堆的内存,如果这部分内存是被 swap 出去了,遍历的时候就会有磁盘IO 可以参考这两篇文章: https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html https://dzone.com/articles/just-say-no-swapping
作者回复: 嗯嗯,大部分应用都不需要swap
2019-01-22686 - 爱学习的小学生请问老师、为什么kubernetes要关闭swap呢?
作者回复: 一个是性能问题,开启swap会严重影响性能(包括内存和I/O);另一个是管理问题,开启swap后通过cgroups设置的内存上限就会失效。
2019-02-21266 - 某、人swap应该是针对以前内存小的一种优化吧,不过现在内存没那么昂贵之后,所以就没那么大的必要开启了 numa感觉是对系统资源做的隔离分区,不过目前虚拟化和docker这么流行。而且node与node之间访问更耗时,针对大程序不一定启到了优化作用,针对小程序,也没有太大必要。所以numa也没必要开启。 不知道我的理解对否,老师
作者回复: 对的
2019-01-0232 - bobswappiness=0 Kernel version 3.5 and newer: disables swapiness. Kernel version older than 3.5: avoids swapping processes out of physical memory for as long as possible. 如果linux内核是3.5及以后的,最好是设置swappiness=10,不要设置swappiness=0 以前整理的说明,供大家参考。
作者回复: 谢谢分享
2019-01-03218 - 日行一善520看到评论有人问 hadoop集群服务器一般是建议关闭swap交换空间,这样可提高性能。在什么情况下开swap、什么情况下关swap? 为了性能关闭swap,这样就不会交换也不会慢了。内核里有个vm.xx的值可以调节swap和内存的比例,在使用内存90%时才交换到swap,可以设置这个来保持性能。在内存比较少的时候,还可以交换,就好了。
作者回复: 谢谢分享
2019-01-1612 - 刘政伟老师,在工作中经常会遇到这种情况,系统中的剩余内存较小、缓存内存较大的,也就是整体可用内存较高的情况下,就开始使用swap了,而查看swappiness的配置为10,理论上不应该使用swap的;具体看下面的free命令,麻烦老师看下是什么原因? [root@shvsolman ~]# free -m total used free shared buffers cached Mem: 32107 31356 750 0 15 12514 -/+ buffers/cache: 18825 13281 Swap: 3071 1581 1490 [root@shvsolman ~]# sysctl -a | grep swappiness vm.swappiness = 10
作者回复: 这是容易误解的地方,其实,即使把swappiness设置成0也不会禁止swap。想要禁止,就不要开启swap。
2019-03-1111 - Days我们公司处理嵌入式系统都是关闭swap分区,具体不知道什么原因?
作者回复: 一般是为了减少写的次数,延长Flash存储的寿命
2019-01-0211 - 我来也[D19打卡] 很遗憾,还未遇到过swap导致的性能问题. 刚买电脑时,512M内存要四百多,可是当时也不玩linux. 等工作了,用linux了,内存相对来说已经比较便宜了. 现在就更不用说了,基本小钱能解决的问题都不是问题了. -------------------- 以前的程序喜欢在启动时预分配很多内存,可是现在的几乎都是动态分配了. 以前一个程序动辄实际使用内存2-3G. 现在即使重构后,只需要100M内存,老板都不愿意换了.[稳定第一]
作者回复: 👍
2019-01-027 - 路过老师,前面你写只有当剩余内存落在页最小阈值和页低阈值中间,才开始回收内存。后面讲即使把 swappiness 设置为0,当剩余内存 + 文件页小于页高阈值时,还是会发生 Swap。我理解,这里是不是应该是:当剩余内存 + 文件页小于页低阈值时,还是会发生 Swap。谢谢!
作者回复: 阈值的比较只代表回收内存的时机,具体回收哪些内存才是swappiness的目的,但是swappiness只是个倾向,而非绝对值
2019-01-0336 - DJH倪老师,请教一下,Linux下怎么关闭SWAP功能?直接不分配SWAP卷(或者分区、文件),还是通过某个关闭SWAP功能的系统选项?
作者回复: swapoff命令可以动态关闭,持久化还要从fstab里面删除
2019-01-023
收起评论