Linux内核技术实战课
邵亚方
前蘑菇街技术专家,Linux Kernel活跃贡献者
新⼈⾸单¥9.9
2801 人已学习
课程目录
已更新 16 讲 / 共 23 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 如何让Linux内核更好地服务应用程序?
免费
Page Cache管理问题 (5讲)
01 基础篇 | 如何用数据观测Page Cache?
02 基础篇 | Page Cache是怎样产生和释放的?
03 案例篇 | 如何处理Page Cache难以回收产生的load飙高问题?
04 案例篇 | 如何处理Page Cache容易回收引起的业务性能问题?
免费
05 分析篇 | 如何判断问题是否由Page Cache产生的?
内存泄漏问题 (5讲)
06 基础篇 | 进程的哪些内存类型容易引起内存泄漏?
07 案例篇 | 如何预防内存泄漏导致的系统假死?
08 案例篇 | Shmem:进程没有消耗内存,内存哪去了?
09 分析篇 | 如何对内核内存泄漏做些基础的分析?
10 分析篇 | 内存泄漏时,我们该如何一步步找到根因?
TCP重传问题 (5讲)
11 基础篇 | TCP连接的建立和断开受哪些系统配置影响?
12 基础篇 | TCP收发包过程会受哪些配置项影响?
13 案例篇 | TCP拥塞控制是如何导致业务性能抖动的?
14 案例篇 | TCP端到端时延变大,怎样判断是哪里出现了问题?
15 分析篇 | 如何高效地分析TCP重传问题?
Linux内核技术实战课
15
15
1.0x
00:00/00:00
登录|注册

08 案例篇 | Shmem:进程没有消耗内存,内存哪去了?

邵亚方 2020-09-05
你好,我是邵亚方。
在前一节课,我们讲述了进程堆内存的泄漏以及因为内存泄漏而导致的 OOM 的危害。这节课我们继续讲其他类型的内存泄漏,这样你在发现系统内存越来越少时,就能够想到会是什么在消耗内存。
有的内存泄漏会体现在进程内存里面,这种相对好观察些;而有的内存泄漏就很难观察了,因为它们无法通过观察进程消耗的内存来进行判断,从而容易被忽视,比如 Shmem 内存泄漏就属于这种容易被忽视的,这节课我们重点来讲讲它。

进程没有消耗内存,内存哪去了?

我生产环境上就遇到过一个真实的案例。我们的运维人员发现某几台机器 used(已使用的)内存越来越多,但是通过 top 以及其他一些命令,却检查不出来到底是谁在占用内存。随着可用内存变得越来越少,业务进程也被 OOM killer 给杀掉,这给业务带来了比较严重的影响。于是他们向我寻求帮助,看看产生问题的原因是什么。
我在之前的课程中也提到过,在遇到系统内存不足时,我们首先要做的是查看 /proc/meminfo 中哪些内存类型消耗较多,然后再去做针对性分析。但是如果你不清楚 /proc/meminfo 里面每一项的含义,即使知道了哪几项内存出现了异常,也不清楚该如何继续去分析。所以你最好是记住 /proc/meminfo 里每一项的含义。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux内核技术实战课》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥9.9
立即订阅
登录 后留言

精选留言(10)

  • 一千零一夜
    /PROC/MEMINFO之谜:http://linuxperf.com/?p=142
    2020-09-05
    2
  • Linuxer
    赞!意犹未尽,爽!
    2020-09-05
    2
  • springchan
    老师您好,
    有一个疑问:tmpfs是一种基于内存的虚拟文件系统,存储空间是在虚拟内存里,重启机器后会丢失,但是我用mmap 在tmpfs下面映射文件以后,通过使用stat 查看tmpfs下面的文件,为什么会占用block 块呢?block 块不是硬盘的空间么?

    作者回复: tmpfs是存储在内存中,但是它是使用文件方式来管理的,所以也会有block的概念,它的block size跟page大小是一致的,也是4k,但是tmpfs不是块设备。

    2020-09-17
  • 欧阳
    老师好,看完这一讲有两个疑问想请教:
    (1)tmpfs的特点是快,那么与内存有什么不同呢?
    假设一个app只有白天可访问,晚上不提供服务。
    白天用tmpfs,晚上再来做耗时的部分:写磁盘,清理tmpfs。
    那这样的话,为什么白天不直接存储在内存就好,不必写入tmpfs吧?
    (2)tmpfs与mmap有什么区别和联系吗,除了mmap属于进程,tmpfs不属于进程之外。

    作者回复: 1. tmpfs是内存的一种使用形式,tmpfs里的内容都在内存中。
    文件内容在内存中可能会被回收掉,而tmpfs不用担心这个问题;如果你不想被回收,那就需要mlock它。所以tmpfs的优势是使用方便。
    2. mmap是接口,tmpfs是存储方式。二者位于不同的层,mmap也可以使用tmpfs,如果进程mmap方式打开tmpfs文件还没有unmap它,那这部分tmpfs内存是属于进程地址空间的。

    2020-09-10
  • qinsi
    看了下那个patch,为啥原始代码里要把负分给截断阿,是有什么特别的考虑吗

    作者回复: 没有特别的考虑,只是因为没有考虑到会存在大量进程设置为负分的这种场景。

    2020-09-09
  • KennyQ
    有几个问题:
    1. 哪些进程会去使用tmpfs?
    2. 如何使用tmpfs,是在启动进程的时候把代码嵌入进去?还是说有接口可以调用?
    3. tmpfs是怎么被挂载起来的?重启后是否会自动挂载?
    4. tmpfs如果被100个进程调用了,会挂载100次么?
    5. 启动tmpfs后是否会修改/etc/mtab?
    6. tmpfs使用是否有最佳实践?
    7. tmpfs是否可以在线扩缩容?

    作者回复: 1. 很多应用程序会把日志保存在tmpfs里,也有些应用会把它的运行时文件保存在tmpfs里。比如systemd就会把日志记录到tmpfs中。你可以用mount命令来查看你的系统tmpfs挂载路径,然后去这里面查看有哪些文件,你也可以看出来你的系统里有哪些应用会用到tmpfs.
    2. 最简单的使用方式是把tmpfs给mount到一个路径上 然后你的应用往里面写文件就可以使用它了。
    3. 通过mount命令来挂载,为了重启后也生效,你可以在启动脚本里来挂载。
    4. 不会,只需要挂载一次 然后所有进程都可以用了 使用方式上跟普通文件路径没有差异。
    5. 会的。
    6. tmpfs的目的是针对那些读写io频繁,但数据量不大的场景。既避免了io,又不浪费太多内存。如果你的业务有这种场景,你可以考虑。
    7. 可以的 remount可以改变它的大小。

    2020-09-06
  • 老酒馆
    精彩
    2020-09-06
  • ray
    老师您好,
    请问我们该怎么判断一个process会不会使用到tmpfs呢?

    谢谢老师的解答^^

    作者回复: 如果进程打开的tmpfs文件还没有close,那么从进程打开的fd里就能看到这些内存文件(比如通过lsof);如果还没有unmap()掉它从tmpfs里申请的内存,那么从进程的地址空间里是可以观察到这些tmpfs内存的。而如果进程已经close掉了它打开的tmpfs文件,那就无法通过进程来分析了,但是通常tmpfs文件里的文件名都会加上进程的一些相关标记,以方便观察是哪个应用创建的。所以我的建议是,你在使用tmpfs文件时,最好这些文件名能够跟你的业务有些关联。

    2020-09-06
  • jssfy
    这个patch很赞!请问老师这个mm oom的bug在centos 7下是否也有?

    作者回复: 对的 这个bug在centos7上也存在 可以backport到centos7上。

    2020-09-05
  • 飞翔
    我这里有一个这样的问题,服务器集群每隔一段时间就有机器进入死机状态,可以ping通,但是ssh连不上, 这时候就得联系现场人员去重启机器,很麻烦。怀疑是内存耗尽的原因,但是重启机器后,从message日子又看不到证据,oom是不是不一定会释放内存? 这种问题应该怎么定位呢?有什么解决方案呢?

    作者回复: 你的内核版本是什么?在老版本内核里,oom如果杀的进程阻塞在内核态的话,比如处于D状态 ,那这个进程的anon内存就没有办法释放;如果是新版本的话,oom会唤醒oom_reaper 然后这个reaper会释放阻塞的进程的内存。所以这类问题的解决方案是,backport oom reaper机制,或者升级内核。定位手段是,你可以使用sysrq -w来看是否这个被杀的进程处于d状态。

    2020-09-05
    2
收起评论
10
返回
顶部