80%的 Linux 运维都不懂的内核题目
说到这,可以小结下,历程空间中代码段,数据段,动态链接库(共享文件映射),mmap 共享匿名映射都存在于 cache 中,可是这些内存页都有被历程引用,以是是不能开释的,基于 tmpfs 的 ipc 历程间通讯机制的生命周期是随内核,因此也是不能通过 drop_caches 开释。 固然上述说起的cache不能开释,可是后头有提到,当内存不敷时,这些内存是可以 swap out 的。 因此 drop_caches 能开释的就是当从磁盘读取文件时的缓存页以及某个历程将某个文件映射到内存之后,历程退出,这时映射文件的的缓存页假如没有被引用,也是可以被开释的。 4.4 内存自动开释方法 当体系内存不足时,操纵体系有一套自我清算内存,并尽也许的开释内存机制,假如这套机制不能开释足够多的内存,那么只能 OOM 了。 之前在说起 OOM 时,说道 redis 由于 OOM 被杀死,如下: 第二句后半部门,
把一个历程内存行使环境,用三个属性举办了声名,即全部假造内存,常驻内存匿名映射页以及常驻内存文件映射页。 着实从上述的说明,我们也可以知道一个历程着实就是文件映射和匿名映射:
着实内核接纳内存就是按照文件映射和匿名映射来举办的,在 mmzone.h 有如下界说: LRU_UNEVICTABLE 即为不行遣散页 lru,我的领略就是当挪用 mlock 锁住内存,不让体系 swap out 出去的页列表。 简朴说下 linux 内核自动接纳内存道理,内核有一个 kswapd 会周期性的搜查内存行使环境,假如发明空闲内存定于 pages_low,则 kswapd 会对 lru_list 前四个 lru 行罗列办扫描,在活泼链表中查找不活泼的页,并添加不活泼链表。 然后再遍历不活泼链表,逐个举办接纳开释出32个页,知道 free page 数目到达 pages_high,针对差异的页,接纳方法也纷歧样。 虽然,当内存程度低于某个极限阈值时,会直接发出内存接纳,道理和 kswapd 一样,可是这次接纳力度更大,必要接纳更多的内存。 文件页: 假如是脏页,则直接回写进磁盘,再接纳内存。 假如不是脏页,则直接开释接纳,由于假如是io读缓存,直接开释掉,下次读时,缺页非常,直接到磁盘读返来即可,假如是文件映射页,直接开释掉,下次会见时,也是发生两个缺页非常,一次将文件内容读取进磁盘,另一次与历程假造内存关联。 匿名页: 由于匿名页没有回写的处所,假如开释掉,那么就找不到数据了,以是匿名页的接纳是采纳 swap out 到磁盘,并在页表项做个标志,下次缺页非常在从磁盘 swap in 进内存。 swap 换进换出着实是很占用体系IO的,假如体系内存需求溘然间敏捷增添,那么cpu 将被io占用,体系会卡死,导致不能对外提供处事,因此体系提供一个参数,用于配置当举办内存接纳时,执行接纳 cache 和 swap 匿名页的,这个参数为: 意思就是嗣魅这个值越高,越也许行使 swap 的方法接纳内存,最大值为100,假如设为0,,则尽也许行使接纳 cache 的方法开释内存。 5、总结 这篇文章首要是写了 linux 内存打点相干的对象: 起首是回首了历程地点空间; 其次当历程耗损大量内存而导致内存不敷时,我们可以有两种方法:第一是手动接纳 cache;另一种是体系靠山线程 swapd 执行内存接纳事变。 最后当申请的内存大于体系剩余的内存时,这时就只会发生 OOM,杀死历程,开释内存,从这个进程,可以看出体系为了腾出足够的内存,是何等的全力啊。 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |