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

22 | 答疑(三):文件系统与磁盘的区别是什么?

估计应用程序的最小内存
OOM按照虚拟内存还是实际内存来打分
回收后的内存去向
LRU算法
原理和指标的类似性
减少动态内存分配
使用数组暂存计算结果
安装bcc-tools
升级内核
累加PSS
区分读写文件和读写磁盘
Buffer和Cache的原理
内存回收与OOM
工具版本问题
内存泄漏案例的优化方法
CentOS系统中安装bcc-tools
统计所有进程的物理内存使用量
文件系统与磁盘的区别
内存性能篇
性能优化

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

你好,我是倪朋飞。
专栏更新至今,四大基础模块的第二个模块——内存性能篇,我们就已经学完了。很开心你还没有掉队,仍然在积极学习和实践操作,并且热情地留言与讨论。
这些留言中,我非常高兴看到,很多同学用学过的案例思路,解决了实际工作中的性能问题。我也非常感谢 espzest、大甜菜、Smile 等积极思考的同学,指出了文章中某些不当或者不严谨的地方。另外,还有我来也、JohnT3e、白华等同学,积极在留言区讨论学习和实践中的问题,也分享了宝贵的经验,在这里也非常感谢你们。
今天是性能优化的第三期。照例,我从内存模块的留言中摘出了一些典型问题,作为今天的答疑内容,集中回复。为了便于你学习理解,它们并不是严格按照文章顺序排列的。
每个问题,我都附上了留言区提问的截屏。如果你需要回顾内容原文,可以扫描每个问题右下方的二维码查看。

问题 1:内存回收与 OOM

虎虎的这个问题,实际上包括四个子问题,即,
怎么理解 LRU 内存回收?
回收后的内存又到哪里去了?
OOM 是按照虚拟内存还是实际内存来打分?
怎么估计应用程序的最小内存?
其实在 Linux 内存的原理篇Swap 原理篇中我曾经讲到,一旦发现内存紧张,系统会通过三种方式回收内存。我们来复习一下,这三种方式分别是 :
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Linux系统中的文件系统与磁盘的区别,以及内存回收与OOM的相关知识。在内存回收方面,详细介绍了基于LRU算法的缓存回收、Swap机制回收和OOM机制,并解答了相关问题。此外,还阐述了磁盘作为文件系统载体的功能,以及读写普通文件和块设备文件时的不同I/O请求路径和使用的缓存类型。最后,强调了理解PSS的含义对于统计所有进程的物理内存使用量至关重要。整体而言,本文内容涵盖了文件系统、磁盘、内存回收和OOM等技术知识,对读者了解相关概念和原理具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(45)

  • 最新
  • 精选
  • 白华
    自己跑虚拟机跑的k8s小集群,node节点跑的镜像太多,就特别卡,看集群情况发现好多pod都死了,看虚拟机上面就写到oom自动杀进程了,以前从没遇到过oom,这次一下就知道怎么回事了

    作者回复: 😊 k8s别忘了设置好内存资源的请求和限制

    2019-01-09
    2
    17
  • wykkx
    老师您好,请教一个问题,您说匿名页回收是使用swap机制,那么这里有几个问题:一是如果我的系统不开启swap(现在很多系统都是不开启swap的,尤其是web类应用,为了提升响应时间),那么匿名页还怎么回收?二是即使我开启了swap,匿名页被放到了swap上,那么swap是如何清理这些匿名页的,总不能一致保存这些匿名页吧。谢谢老师 2019-01-10  作者回复 1. 不开swap,没法回收 2. 取决于这些页的实际访问情况,只要一访问,就会换入到内存中 ---------追问------------------------- 首先谢谢老师的问答,可能是我没有描述清楚。一是,如果按照老师说的“不开swap,没法回收”那么我系统产生的大量匿名页怎么办?是不是一直在内存里,不能被回收?直到引发oom,把这个进程干掉?;二是“ 取决于这些页的实际访问情况,只要一访问,就会换入到内存中”如果这些被换到swap上的匿名页量很大 ,把swap都写满了,这个时候是怎么选择从swap里清理哪些匿名页呢?

    作者回复: 1.是的;2. swap都满了,说明内存也耗尽了呀,这时候就要OOM了

    2019-01-12
    2
    14
  • 好好学习
    内存统计这样也可以吧smem|awk '{total+=$7};END{printf "%d kb/n",total}'

    作者回复: smem是可以的👍,不过要注意计算 PSS 而不是 RSS

    2019-01-13
    8
  • 陳先森
    很多同学装bcc工具的时候都提示找不到动态库之类的,经过本人亲测是因为没有安装匹配新内核版本的内核头包。我的系统centos7.3更新了之后内核是5.0.5版本的,升完之后一直提示缺少库文件,我的做法是 rpm -qa |grep kerner,先查找系统内核版本,网上查找相应的匹配kerner-devel包,及时没有相同版本也不要紧,比如5.0.5-1的版本就是我系统的版本网上找了没有这个版本对应的kerner-devel包但是不知道为什么升级了会安装这个版本,我系统升级前centos7.3,升级后7.6。我就下载了5.0.5-3并安装,然后版本的,找到对应的包版本,rpm -ql 包版本,做个软连接就OK。至此bcc已经安装完成。做为一个linux运维我都装了2天,可想而知大家。此方法亲测centos7.3

    作者回复: 👍谢谢分享

    2019-04-05
    3
    7
  • 平安喜乐
    打卡: bcc-tools install(centos6.9) 已尝试可以顺利安装 https://blog.csdn.net/luckgl/article/details/88355074

    作者回复: 谢谢分享

    2019-03-12
    2
    2
  • ninuxer
    打卡day23 喜欢一篇文章看两次,第一次看,第二次是实践的时候再看一遍

    作者回复: 👍

    2019-01-09
    2
  • JJj
    OOM 触发的时机基于虚拟内存。换句话说,进程在申请内存时,如果申请的虚拟内存加上服务器实际已用的内存之和---这里的实际已使用内存是不是对应free里面的used

    作者回复: 应该是buff/cache+used,参考问题1的第三种方式,先尝试回收内存然后才是OOM

    2019-06-29
    1
  • H&HH
    老师,初始系统版本是centos7.3,按照你给的安装bcc-tools步骤安装完后还是出现了以下报错,请问老师怎么回事呀 [root@server tools]# ./cachetop Traceback (most recent call last): File "./cachetop", line 21, in <module> from bcc import BPF File "/usr/lib/python2.7/site-packages/bcc/__init__.py", line 27, in <module> from .libbcc import lib, bcc_symbol, bcc_symbol_option, _SYM_CB_TYPE File "/usr/lib/python2.7/site-packages/bcc/libbcc.py", line 17, in <module> lib = ct.CDLL("libbcc.so.0", use_errno=True) File "/usr/lib64/python2.7/ctypes/__init__.py", line 360, in __init__ self._handle = _dlopen(self._name, mode) OSError: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /lib64/libbcc.so.0) [root@server tools]# uname -r 5.0.3-1.el7.elrepo.x86_64 [root@server tools]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)

    作者回复: 看错误是找不到依赖的动态链接库,可以试试修复安装 libstdc++

    2019-03-22
    2
    1
  • LotusChing
    老师,您对wykkx同学问题的回答我有些不理解,"不开swap,没法回收匿名页。",我自己用tomcat容器做了个小实验。 环境:Ubuntu 14.04.1 LTS, Trusty Tahr,3.13.0-128-generic,docker 17.12.0-ce,tomcat:8-alpine 我的环境没有启用swap(free看到的都是0),通过启停tomcat容器,并观察/proc/zoneinfo、/proc/meminfo中anon相关匿名页相关指标,发现这些指标数值会随着启停容器上下浮动。 这样,是不是说明应用占用的匿名页只有在退出时释放?那应用运行过程中使用到的内存如何释放呢?通过GC么? 希望老师能抽空回复下关于我们的这个问题么,感谢!

    作者回复: 停止进程后当然是会释放进程所占用的内存。我说的是进程一直在运行中的时候,进程自己分配的内存只能进程自己来释放,或者等着进程推出后由系统释放。

    2019-02-16
    1
  • 我的现象是32G服务器 free 还有2g多出现oom,但并没有容器的内存升高。 进程申请的虚拟内存 + 服务器已用的内存(包括buf/cache) > 物理内存 的时候会触发OOM 那们我个人理解OOM 发生以后会出现某个进程内存飙升的情况,但从OOM对应的时间上来看,监控没有发现某个容器进程飙升。 不知道是为什么? ubuntu 16.04 sar -r -S 1 %commit 与 free -g 里面又该如何对应呢?

    作者回复: 使用容器的话,内存可能还受到cgroups的限制。这时候容器OOM只代表容器的内存达到了limit,不代表系统内存使用情况。另外,进程的内存使用不一定是飙升,还有可能缓慢增长(其实大部分内存泄漏都是这样). %commit跟free没有对应关系,commit是一个动态计算出来的估计值

    2019-02-01
    1
收起评论
显示
设置
留言
45
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部