5分钟学会两年经验Linux运维都不懂的内核问题
之前在提及 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 一样,但是这次回收力度更大,需要回收更多的内存。 文件页:
匿名页:因为匿名页没有回写的地方,如果释放掉,那么就找不到数据了,所以匿名页的回收是采取 swap out 到磁盘,并在页表项做个标记,下次缺页异常在从磁盘 swap in 进内存。 swap 换进换出其实是很占用系统IO的,如果系统内存需求突然间迅速增长,那么cpu 将被io占用,系统会卡死,导致不能对外提供服务,因此系统提供一个参数,用于设置当进行内存回收时,执行回收 cache 和 swap 匿名页的,这个参数为: 意思就是说这个值越高,越可能使用 swap 的方式回收内存,最大值为100,如果设为0,则尽可能使用回收 cache 的方式释放内存。 5、总结 这篇文章主要是写了 linux 内存管理相关的东西: 首先是回顾了进程地址空间; 其次当进程消耗大量内存而导致内存不足时,我们可以有两种方式:第一是手动回收 cache;另一种是系统后台线程 swapd 执行内存回收工作。 最后当申请的内存大于系统剩余的内存时,这时就只会产生 OOM,杀死进程,释放内存,从这个过程,可以看出系统为了腾出足够的内存,是多么的努力啊。 【编辑推荐】
点赞 0 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 了解在Windows 11中卸载更新的不同办法
- 微软新款Surface Pro X设备或认证免费升级至Windows 11
- 微软发Windows Server 2022新款 ISO镜像开放下载
- 微软发布Windows 7 10 11紧急更新 修复很多问题、快升级
- 如何在Windows上重启Apache? “Apache -k restart”给出错
- Windows – PowerShell DSC组资源 – “找不到具有提供名称
- win10禁止安装一切软件怎么处理
- 微软正将 Windows 11 MR 混合现实新性能推送给 Windows 10
- 微软发布 Windows10 11微软锁屏画报应用
- 大神手把手教你怎么优化win10开机速度慢