容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

10 | Swap:容器可以使用Swap空间吗?

判断Swap分区中的数据写入情况
区分全局和控制组内的swappiness
swappiness参数的作用
解决容器使用Swap的问题
控制组内的swappiness
memory.swappiness参数
控制内存释放比例
内存类型:Page Cache 和 RSS
swappiness的定义
内存泄漏的影响
Memory Cgroup限制
容器中使用Swap空间
思考题
重点总结
解决问题
如何正确理解swappiness参数
问题再现
容器是否可以使用Swap空间

该思维导图由 AI 生成,仅供参考

你好,我是程远。这一讲,我们来看看容器中是否可以使用 Swap 空间。
用过 Linux 的同学应该都很熟悉 Swap 空间了,简单来说它就是就是一块磁盘空间。
当内存写满的时候,就可以把内存中不常用的数据暂时写到这个 Swap 空间上。这样一来,内存空间就可以释放出来,用来满足新的内存申请的需求。
它的好处是可以应对一些瞬时突发的内存增大需求,不至于因为内存一时不够而触发 OOM Killer,导致进程被杀死。
那么对于一个容器,特别是容器被设置了 Memory Cgroup 之后,它还可以使用 Swap 空间吗?会不会出现什么问题呢?

问题再现

接下来,我们就结合一个小例子,一起来看看吧。
首先,我们在一个有 Swap 空间的节点上启动一个容器,设置好它的 Memory Cgroup 的限制,一起来看看接下来会发生什么。
如果你的节点上没有 Swap 分区,也没有关系,你可以用下面的这组命令来新建一个。
这个例子里,Swap 空间的大小是 20G,你可以根据自己磁盘空闲空间来决定这个 Swap 的大小。执行完这组命令之后,我们来运行 free 命令,就可以看到 Swap 空间有 20G。
输出的结果你可以参考下面的截图。
然后我们再启动一个容器,和 OOM 那一讲里的例子差不多,容器的 Memory Cgroup 限制为 512MB,容器中的 mem_alloc 程序去申请 2GB 内存。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在容器中使用Swap空间是一个复杂的问题,本文深入探讨了这一话题。首先介绍了在设置了Memory Cgroup的容器中使用Swap空间可能引发的问题,并通过一个例子展示了在有Swap空间的节点上启动容器后,设置了Memory Cgroup限制后,容器可以正常运行而不会因内存不足而被杀死。文章还提到了Linux中的Swappiness概念,以及在容器中运行不同需求的程序可能会带来的冲突。此外,文章还介绍了如何在Memory Cgroup中使用memory.swappiness参数来控制匿名内存和page cache的回收,以及如何解决容器中不同程序对内存需求的冲突。通过深入讨论Swap空间的使用和内存回收机制,为读者提供了在实际场景中综合考虑Swap空间的使用的方法和思路。文章内容涵盖了技术细节,对于需要了解容器中Swap空间使用的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • 伟平
    k8s下容器貌似不能用swap

    作者回复: kubelet缺省不能在打开swap的节点上运行。 配置“failSwapOn: false”参数,kubelet可以在swap enabled的节点上运行。

    2020-12-07
    2
    19
  • 莫名
    Memory Cgroup 参数 memory.swappiness 起到局部控制的作用,前提是节点开启了 swap 功能,不然无论如何设置都无济于事。

    作者回复: @莫名, 没错

    2020-12-07
    10
  • Khirye
    想问下老师,对于最近k8s宣布放弃docker有什么看法?

    作者回复: 对于k8s来说,的确没有必要再用docker了。 这是我们组之前做的从docker切换到containerd的技术分享: https://www.infoq.cn/article/odslclsjvo8bnx*mbrbk

    2020-12-11
    2
    8
  • kimoti
    既然memory.swappiness设置为0了,Swap分区是不会有数据写入的。

    作者回复: @kimoti 是的

    2020-12-07
    2
    8
  • po
    老师,文章中你说的这两句话好像是矛盾的,swappiness设置为0的时候,到底会不会回收匿名内存呢? 1. 不过,这里有一点不同,需要你留意:当 memory.swappiness = 0 的时候,对匿名页的回收是始终禁止的,也就是始终都不会使用 Swap 空间。这时 Linux 系统不会再去比较 free 内存和 zone 里的 high water mark 的值,再决定一个 Memory Cgroup 中的匿名内存要不要回收了。请你注意,当我们设置了"memory.swappiness=0 时,在 Memory Cgroup 中的进程,就不会再使用 Swap 空间,知道这一点很重要. 2. 值为 0 的时候,当系统中空闲内存低于一个临界值的时候,仍然会释放匿名内存并把页面写入 Swap 空间。

    作者回复: 1. memory.swappiness 是指cgroup中的参数 2. 这里说的是/proc/sys/vm/swappiness

    2020-12-15
    4
    2
  • haha
    所以对于开启了swap,且swap空间够大的前提下,goup的mem limit没用咯?

    作者回复: 是的, 如果只是设置 memory.limit_in_bytes

    2020-12-15
    2
  • Geek4329
    感谢老师的分享,学习的越多,越感到自己的自信😼 学完这个课程,并完全吸收的话,是不是可以说自己接近精通容器技术了😁

    作者回复: @Geek4329 很高兴我的分享对你有帮助!

    2020-12-07
    2
  • chong chong
    老师,k8s pod默认的memory.swappiness 值是60,如何设置才能使得默认是0呢?

    作者回复: 可以修改kube代码

    2021-05-11
    1
  • 谢哈哈
    已经设置memory.swappiness参数,全局参数swappiness参数失效,那么容器里就不能使用swap了

    作者回复: @谢哈哈 是的

    2020-12-07
    1
  • 刘宏
    请问一下在容器里如何加快page cache的释放速度,原因是发现scp的时候,page cache会很快将内存占满,速度会骤然下降,drop cache以后,速度能显著提升;配置了vm.vfs_cache_pressure为1w,依旧在容器里没改善
    2021-10-03
    1
    1
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部