80%的 Linux 运维都不懂的内核题目
当 overcommit_memory 为1时,则永久都应承 overmemory 内存申请,即不管你多大的假造内存申请都应承,可是当体系内存耗尽时,这时就会发生oom,即上述的redis例子,在 overcommit_memory=1 时,是不会发生oom 的,由于物理内存足够。 当 overcommit_memory 为2时,永久都不能超出某个限制额的内存申请,这个限制额为 swap+RAM* 系数(/proc/sys/vm/overcmmit_ratio,默认50%,可以本身调解),假如这么多资源已经用光,那么后头任何实行申请内存的举动城市返回错误,这凡是意味着此时没法运行任何新措施 以上就是 OOM 的内容,相识道理,以及怎样按照本身的应用,公道的配置OOM。 3、体系申请的内存都在哪? 我们相识了一个历程的地点空间之后,是否会好奇,申请到的物理内存都存在哪了?也许许多人认为,不就是物理内存吗? 我这里说申请的内存在哪,是由于物理内存有分为cache和平凡物理内存,可以通过 free 呼吁查察,并且物理内存尚有分 DMA,NORMAL,HIGH 三个区,这里首要说明cache和平凡内存。 通过第一部门,我们知道一个历程的地点空间险些都是 mmap 函数申请,有文件映射和匿名映射两种。 3.1 共享文件映射 我们先来看下代码段和动态链接库映射段,这两个都是属于共享文件映射,也就是说由统一个可执行文件启动的两个历程是共享这两个段,都是映射到统一块物理内存,那么这块内存在哪了?我写了个措施测试如下: 我们先看下当前体系的内存行使环境: 当我在当地新建一个1G的文件:
然后挪用上述措施,举办共享文件映射,此时内存行使环境为: 我们可以发明,buff/cache 增添了或许1G,因此我们可以得出结论,代码段和动态链接库段是映射到内核cache中,也就是说当执行共享文件映射时,文件是先被读取到 cache 中,然后再映射到用户历程空间中。 3.2 私有文件映射段 对付历程空间中的数据段,其必需是私有文件映射,由于假如是共享文件映射,那么统一个可执行文件启动的两个历程,任何一个历程修改数据段,都将影响另一个历程了,我将上述测试措施改写成匿名文件映射: 在执行措施执行,必要先将之前的 cache 开释掉,不然会影响功效
接着执行措施,看下内存行使环境: 从行使前和行使后比拟,可以发明 used 和 buff/cache 别离增添了1G,声名当举办私有文件映射时,起首是将文件映射到 cache 中,然后假如某个文件对这个文件举办修改,则会从其他内存平分派一块内存先将文件数据拷贝至新分派的内存,然后再在新分派的内存长举办修改,这也就是写时复制。 这也很好领略,由于假犹如一个可执行文件开启多个实例,那么内核先将这个可执行的数据段映射到 cache,然后每个实例假若有修改数据段,则都将分派一个一块内存存储数据段,事实数据段也是一个历程私有的。 通过上述说明,可以得出结论,假如是文件映射,则都是将文件映射到 cache 中,然后按照共享照旧私有举办差异的操纵。 3.3 私有匿名映射 像 bbs 段,堆,栈这些都是匿名映射,由于可执行文件中没有响应的段,并且必需是私有映射,不然假如当前历程 fork 出一个子历程,那么父子历程将会共享这些段,一个修改城市影响到互相,这是不公道的。 ok,此刻我把上述测试措施改成私有匿名映射 这时再来看下内存的行使环境 我们可以看到,只有 used 增进了1G,而 buff/cache 并没有增添;声名,在举办匿名私有映射时,并没有占用 cache,其拭魅这也是有原理,由于就只有当前历程在行使这块这块内存,没有须要占用名贵的 cache。 3.4 共享匿名映射 当我们必要在父子历程共享内存时,就可以用到 mmap 共享匿名映射,那么共享匿名映射的内存是存放在哪了?我继承改写上述测试措施为共享匿名映射 。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |