加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

5分钟学会两年经验Linux运维都不懂的内核问题

发布时间:2019-09-10 19:59:08 所属栏目:Windows 来源:罗道文的私房菜
导读:副标题#e# 前言 之前在实习时,听了 OOM 的分享之后,就对 Linux 内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟,所以经过一个一段时间的积累,对内核内存有一定了解之后,今天才写下这篇博客,记录以及分享。 【OOM

之前在提及 OOM 时,说道 redis 因为 OOM 被杀死,如下:

5分钟学会两年经验Linux运维都不懂的内核问题

第二句后半部分,

  1. total-vm:186660kB, anon-rss:9388kB, file-rss:4kB 

把一个进程内存使用情况,用三个属性进行了说明,即所有虚拟内存,常驻内存匿名映射页以及常驻内存文件映射页。

其实从上述的分析,我们也可以知道一个进程其实就是文件映射和匿名映射:

  • 文件映射:代码段,数据段,动态链接库共享存储段以及用户程序的文件映射段;
  • 匿名映射:bbs段,堆,以及当 malloc 用 mmap 分配的内存,还有mmap共享内存段;

其实内核回收内存就是根据文件映射和匿名映射来进行的,在 mmzone.h 有如下定义:

5分钟学会两年经验Linux运维都不懂的内核问题

LRU_UNEVICTABLE 即为不可驱逐页 lru,我的理解就是当调用 mlock 锁住内存,不让系统 swap out 出去的页列表。

简单说下 linux 内核自动回收内存原理,内核有一个 kswapd 会周期性的检查内存使用情况,如果发现空闲内存定于 pages_low,则 kswapd 会对 lru_list 前四个 lru 队列进行扫描,在活跃链表中查找不活跃的页,并添加不活跃链表。

然后再遍历不活跃链表,逐个进行回收释放出32个页,知道 free page 数量达到 pages_high,针对不同的页,回收方式也不一样。

当然,当内存水平低于某个极限阈值时,会直接发出内存回收,原理和 kswapd 一样,但是这次回收力度更大,需要回收更多的内存。

文件页:

  1. 如果是脏页,则直接回写进磁盘,再回收内存。
  2. 如果不是脏页,则直接释放回收,因为如果是io读缓存,直接释放掉,下次读时,缺页异常,直接到磁盘读回来即可,如果是文件映射页,直接释放掉,下次访问时,也是产生两个缺页异常,一次将文件内容读取进磁盘,另一次与进程虚拟内存关联。

匿名页:因为匿名页没有回写的地方,如果释放掉,那么就找不到数据了,所以匿名页的回收是采取 swap out 到磁盘,并在页表项做个标记,下次缺页异常在从磁盘 swap in 进内存。

swap 换进换出其实是很占用系统IO的,如果系统内存需求突然间迅速增长,那么cpu 将被io占用,系统会卡死,导致不能对外提供服务,因此系统提供一个参数,用于设置当进行内存回收时,执行回收 cache 和 swap 匿名页的,这个参数为:

5分钟学会两年经验Linux运维都不懂的内核问题

意思就是说这个值越高,越可能使用 swap 的方式回收内存,最大值为100,如果设为0,则尽可能使用回收 cache 的方式释放内存。

5、总结

这篇文章主要是写了 linux 内存管理相关的东西:

首先是回顾了进程地址空间;

其次当进程消耗大量内存而导致内存不足时,我们可以有两种方式:第一是手动回收 cache;另一种是系统后台线程 swapd 执行内存回收工作。

最后当申请的内存大于系统剩余的内存时,这时就只会产生 OOM,杀死进程,释放内存,从这个过程,可以看出系统为了腾出足够的内存,是多么的努力啊。

【编辑推荐】

  1. Linux老鸟给出的Linux系统故障问题汇总,值得收藏
  2. Linux系统克隆工具之Top 6推荐
  3. 如何更改Linux终端颜色主题
  4. Linux 里的 exFAT 是微软的“特洛伊木马”
  5. Linux怎么设置环境变量
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读