Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
85429 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

20 | 案例篇:为什么系统的Swap变高了?(下)

你好,我是倪朋飞。
上一节我们详细学习了 Linux 内存回收,特别是 Swap 的原理,先简单回顾一下。
在内存资源紧张时,Linux 通过直接内存回收和定期扫描的方式,来释放文件页和匿名页,以便把内存分配给更需要的进程使用。
文件页的回收比较容易理解,直接清空缓存,或者把脏数据写回磁盘后,再释放缓存就可以了。
而对不常访问的匿名页,则需要通过 Swap 换出到磁盘中,这样在下次访问的时候,再次从磁盘换入到内存中就可以了。
开启 Swap 后,你可以设置 /proc/sys/vm/min_free_kbytes ,来调整系统定期回收内存的阈值,也可以设置 /proc/sys/vm/swappiness ,来调整文件页和匿名页的回收倾向。
那么,当 Swap 使用升高时,要如何定位和分析呢?下面,我们就来看一个磁盘 I/O 的案例,实战分析和演练。

案例

下面案例基于 Ubuntu 18.04,同样适用于其他的 Linux 系统。
机器配置:2 CPU,8GB 内存
你需要预先安装 sysstat 等工具,如 apt install sysstat
首先,我们打开两个终端,分别 SSH 登录到两台机器上,并安装上面提到的这些工具。
同以前的案例一样,接下来的所有命令都默认以 root 用户运行,如果你是用普通用户身份登陆系统,请运行 sudo su root 命令切换到 root 用户。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(48)

  • 最新
  • 精选
  • Free_fish
    用smem --sort swap命令可以直接将进程按照swap使用量排序显示

    作者回复: 👍 谢谢分享

    7
    94
  • Scott
    答案不是上一讲有提到吗,就算设置为0,如果空闲内存+文件页 < page_low,还是会发生swap,这个值是设置swap的积极程度,就算最不积极,被逼无奈还是得swap的。

    作者回复: 👍 是的

    4
    33
  • 尘封
    $ swapoff -a && swapon -a,线上使用这个命令释放swap有什么风险吗?

    作者回复: 有的,使用了swap说明内存可能有压力了,这么强制换入有可能导致内存问题

    19
  • Geek_b04b12
    对于sar以及其他的linux命令,如果出现列对的不整齐的时候,可以适当的参考文档,增加格式化输出,例如:sar的格式化输出:sudo sar -h --human -r -S 1 5 free 可以添加 -h :free -h 更容易让人理解

    作者回复: 谢谢分享👍

    2
    9
  • 仲鬼
    老师好,我研究man sar后还是没理解kbcommit,这个估计值具体指什么呢? 就算单纯以不导致OOM的最小内存理解,为什么会小于kbmemused(已用物理内存)呢?我认为应该是kbcommit >= kbmemused。

    作者回复: kbcommit就是进程申请的内存之和,kbmemused还包括了buffer和cache

    8
  • Days
    老师,请问如果关闭swap分区,swapping配置是不是无效的?

    作者回复: 是的

    2
  • 幸运的人
    老师,问一个问题 现在的公有云主机或者是私有云的虚拟机,swap默认是0,这种情况下是否还会出现swap in和swap out呢?我在留言中也看到其他同学问过相似的问题,但没有看到答案,请帮忙解释一下?谢谢。

    作者回复: 嗯,云环境一般都是关闭swap,避免恍如换出带来的性能问题

  • zshanjun
    大文件读取瞬间完成,没有观察到内存的变化: root@linux-1:~/go/bin# dd if=/dev/sda1 of=/dev/null bs=16G count=2048 0+1 records in 0+1 records out 1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00693471 s, 151 MB/s

    作者回复: 仔细看看,1048576 bytes (1.0 MB, 1.0 MiB) copied

    2
  • berryfl
    /proc/*/status会匹配到self之类的特殊目录,把匹配的部分写复杂点可以限制到仅数字,例如+([0-9])

    作者回复: 嗯,是的

  • 白华
    我写的dd参数就是大文件系统的数据,一共就20g存储的虚拟机,传的是/dev/root文件系统 有10g 需要写好久,实验现象和您描述的差不多,但是swap就是没变化

    作者回复: swap开了吗?swapiness配置的什么

    2
收起评论
显示
设置
留言
48
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部