• 邵亚方
    置顶
    2020-10-11
    课后作业答案: - 进程调用 mlock() 来保护内存,然后进程没有运行 munlock() 就退出了,在进程退出后,这部分内存还被保护吗,为什么? 这部分内容就不被保护了,评论区里有人已经给出了文档里的解释: Memory locks are not inherited by a child created via fork(2) and are automatically removed (unlocked) during an execve(2) or when the process terminates. https://man7.org/linux/man-pages/man2/mlock.2.html
    
    10
  • 奔跑的熊
    2020-10-02
    老师您好,如何观察单个应用的page cache?

    作者回复: 通过lsof可以查看某个应用打开的文件,然后再使用fincore可以看这些文件有多少内容在pagecache。 或者应用程序里直接调用mincore也可以查看page cache有多少。

    共 2 条评论
    18
  • Geek_162e2a
    2020-08-28
    思考题: 在进程退出之后,此部分内存不会再被保护 为什么呢,文档是这么说的������ Memory locks are not inherited by a child created via fork(2) and are automatically removed (unlocked) during an execve(2) or when the process terminates. https://man7.org/linux/man-pages/man2/mlock.2.html

    作者回复: 是的 赞!

    共 2 条评论
    9
  • ray
    2020-08-28
    老师您好,请问 如果使用echo 2 > /proc/sys/vm/drop_caches释放slab objects (includes dentries and inodes)也会释放掉page cache,那这条指令和单纯释放page cache的echo 1 > /proc/sys/vm/drop_caches指令的区别又在哪里呢? 谢谢老师的解答^^

    作者回复: echo 2会去尝试释放所有可以回收的slab,但是它释放inode的过程中也会释放inode的page cache,其实这个行为在我看来是不合理的,如果inode上面有page cache就不应该被释放,目前内核社区也在针对这个行为做改进,预计它很快会被修改。另外还有很多inode是不可以被释放的,那这部分inode里的page cache也不会被释放。 echo 1则只是释放page cache,而不去释放slab,而且在释放pagecache的过程中也不会去考虑inode的情况,也就是说echo 2中有些不会释放的pagecache在这种方式里会被释放。

    
    4
  • 从远方过来
    2020-08-27
    老师,我有几个疑问: 1. 扫描比例是怎么设置的?和zoneinfo里面的min,low,high有什么的联系么? 2. “回收到足够的内存” 是指回收到high水位还是满足这一次内存分配就停止了?

    作者回复: 1. 扫描比例是在内核里面配置好的 用户无法调整,第一次扫描1/12,第二次扫描1/11,一直到最后一次扫描全部。通过调整内存水位最终就会体现在zoneinfo里的min low high里面,这几个值也是内核根据内存情况来动态调整的。 2. 如果是直接回收,那只需要会收到满足需求的内存就可以了;如果是kswapd回收,那会一直回收到high水位。

    
    2
  • Linuxer
    2020-11-03
    请问一下邵老师,我看memory cgroup中相关的参数是这些 memory.kmem.limit_in_bytes,memory.kmem.max_usage_in_bytes,memory.usage_in_bytes,memory.soft_limit_in_bytes,memory.memsw.usage_in_bytes.memory.memsw.max_usage_in_bytes请问跟文章中memory.max, memory.high这些是怎么对应的呢?

    作者回复: 这是cgroup1的memcg参数,memory.high和memory.max在原生内核里只在cgroup2中有,如果你们用的是cgroup1 就无法使用这几个参数了。我们在自己的内核里在cgroup1里也添加了high max这些参数,你们也可以考虑添加下。

    
    1
  • 青鸟飞鱼
    2020-09-20
    老师,你好,有个疑问,memory cgroup 来对它们进行保护,如何保证我要保护的数据是放在里面的呢?

    作者回复: 把进程放在memory cgroup中,然后进程读写的文件内容都属于这个memory cgroup中;如果进程读写文件后,再把它放在memory cgroup中,那么文件内容不会属于这个memory cgroup。所以要注意顺序。

    
    1
  • 坚
    2020-09-02
    老师好,我查看了一下 zoneinfo 其中 pages free=4497,但是min low hight 分别为5 6 7 ,三者设置得这么接近,有这么小,是否会有什么问题呢?

    作者回复: 这要看具体是什么zone,如果是dma zone的话,由于本身这个zone里的内存较少,所以水位小也是正常的。 min low high其实是等差数列,这个差值就主要是由zone的大小来决定的。

    
    1
  • 好说
    2020-08-27
    老师,对于io密集型的业务,基本上大部分都是读磁盘,当带宽达到一定量级之后服务器的load会很高,但是当我执行echo "1">/proc/sys/vm/drop_caches后,服务器load会非常明显的下降,然后过一会就又会升上去,请问老师造成这种现象的原因是什么呢,或者老师可以提示一些排查思路吗

    作者回复: 这应该是应用在申请内存时触发了直接回收引起的。drop cache之后,就有很多的可用内存,应用就无需回收,但是运行久了,page cache就会积压,导致接下来的内存申请会进行直接回收。 你可以在load高时通过sar -B来观察看看pgscand是否有不为0的情况。

    
    1
  • 唐江
    2021-05-20
    inode被回收是什么意思?

    作者回复: inode本身也是slab的一种,在内存不足时,就会去尝试回收slab,回收slab的时候就可能会回收到inode。

    
    