加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

80%的 Linux 运维都不懂的内核问题

发布时间:2018-12-11 06:51:08 所属栏目:业界 来源:luodw
导读:媒介 之前在演习时,听了 OOM 的分享之后,就对 Linux 内核内存打点布满乐趣,可是这块常识很是复杂,没有必然蕴蓄,不敢写下,担忧误人后辈,以是颠末一个一段时刻的蕴蓄,对内核内存有必然相识之后,记录以及分享。 【OOM - Out of Memory】内存溢出 内
副问题[/!--empirenews.page--]

 媒介

之前在演习时,听了 OOM 的分享之后,就对 Linux 内核内存打点布满乐趣,可是这块常识很是复杂,没有必然蕴蓄,不敢写下,担忧误人后辈,以是颠末一个一段时刻的蕴蓄,对内核内存有必然相识之后,记录以及分享。

80%的 Linux 运维都不懂的内核题目

【OOM - Out of Memory】内存溢出
内存溢出的办理步伐:
1、等比例缩小图片
2、对图片回收软引用,实时举办 recycle( ) 操纵。
3、行使加载图片框架处理赏罚图片,如专业处理赏罚图片的 ImageLoader 图片加载框架,尚有XUtils 的 BitMapUtils 来处理赏罚。

这篇文章首要是说明白单个历程空间的内存机关与分派,是从全局的视角说明下内查对内存的打点;

下面首要从以下方面先容 Linux 内存打点:

  • 历程的内存申请与分派;
  • 内存耗尽之后 OOM;
  • 申请的内存都在哪?
  • 体系接纳内存;

1、历程的内存申请与分派

之前有篇文章先容 hello world 措施是怎样载入内存以及是怎样申请内存的,我在这,再次声名下:同样,照旧先给出历程的地点空间,我认为对付任何开拓职员这张图是必需记着的,尚有一张就是操纵 disk ,memory 以及 cpu cache 的时刻图。

80%的 Linux 运维都不懂的内核题目

当我们在终端启动一个措施时,终端历程挪用 exec 函数将可执行文件载入内存,此期间码段,数据段,bbs 段,stack 段都通过 mmap 函数映射到内存空间,堆则要按照是否有在堆上申请内存来抉择是否映射。

exec 执行之后,此时并未真正开始执行历程,而是将 cpu 节制权交给了动态链接库装载器,由它来将该历程必要的动态链接库装载进内存。之后才开始历程的执行,这个进程可以通过 strace 呼吁跟踪历程挪用的体系函数来说明。

80%的 Linux 运维都不懂的内核题目

这是我上篇博客熟悉 pipe 中的措施,从这个输出进程,可以看出和我上述描写的同等。

当第一次挪用 malloc 申请内存时,通过体系挪用 brk 嵌入到内核,起首会举办一次判定,是否有关于堆的 vma,假如没有,则通过 mmap 匿名映射一块内存给堆,并成立 vma 布局,挂到 mm_struct 描写符上的红黑树和链表上。

然后回到用户态,通过内存分派器(ptmaloc,tcmalloc,jemalloc)算法将分派到的内存举办打点,返回给用户所必要的内存。

假如用户态申请大内存时,是直接挪用 mmap 分派内存,此时返回给用户态的内存照旧假造内存,直到第一次会见返回的内存时,才真正举办内存的分派。

着实通过 brk 返回的也是假造内存,可是颠末内存分派器举办切割分派之后(切割就必需会见内存),全都分派到了物理内存

当历程在用户态通过挪用 free 开释内存时,假如这块内存是通过 mmap 分派,则挪用 munmap 直接返回给体系。

不然内存是先返回给内存分派器,然后由内存分派器同一返还给体系,这就是为什么当我们挪用 free 接纳内存之后,再次会见这块内存时,也许不会报错的缘故起因。

虽然,当整个历程退出之后,这个历程占用的内存城市偿还给体系。

2、内存耗尽之后OOM

在演习时代,有一台测试机上的 mysql 实例常常被 oom 杀死,OOM(out of memory)即为体系在内存耗尽时的自我挽救法子,他会选择一个历程,将其杀死,开释出内存,很明明,哪个历程占用的内存最多,即最也许被杀死,但究竟是这样的吗?

本日早上去上班,恰恰遇到了一路 OOM,溘然发明,OOM 一次,天下都宁静下来了,哈哈,测试机上的 redis 被杀死了。

80%的 Linux 运维都不懂的内核题目

OOM 要害文件 oom_kill.c,内里先容了当内存不足时,体系怎样选择最应该被杀死的历程,选择身分有挺多的,除了历程占用的内存外,尚有历程运行的时刻,历程的优先级,是否为 root 用户历程,子历程个数和占用内存以及用户节制参数 oom_adj 都相干。

当发生 oom 之后,函数 select_bad_process 会遍历全部历程,通过之条件到的那些身分,每个历程城市获得一个 oom_score 分数,分数最高,则被选为杀死的历程。

我们可以通过配置 /proc/<pid>/oom_adj 分数来过问体系选择杀死的历程。

80%的 Linux 运维都不懂的内核题目

这是内核关于这个oom_adj调解值的界说,最大可以调解为15,最小为-16,假如为-17,则该历程就像买了vip会员一样,不会被体系遣散杀死了,因此,假如在一台呆板上有跑许多处事器,且你不但愿本身的处事被杀死的话,就可以配置本身处事的 oom_adj 为-17。

虽然,说到这,就必需提到另一个参数 /proc/sys/vm/overcommit_memory,man proc 声名如下:

80%的 Linux 运维都不懂的内核题目

意思就是当 overcommit_memory 为0时,则为开导式oom,即当申请的假造内存不是很浮夸的大于物理内存,则体系应承申请,可是当历程申请的假造内存很浮夸的大于物理内存,则就会发生 OOM。

(编辑:河北网)

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

热点阅读