内存回收

系统会通过三种方式回收内存。这三种方式分别是 :

1.基于 LRU(Least Recently Used)算法,回收缓存;

2.基于 Swap 机制,回收不常访问的匿名页;

3.基于 OOM(Out of Memory)机制,杀掉占用大量内存的进程。

前两种方式,缓存回收和 Swap 回收,实际上都是基于 LRU 算法,也就是优先回收不常
访问的内存。

LRU 回收算法,实际上维护着 active 和 inactive 两个双向链表,其中:

    active 记录活跃的内存页;
    inactive 记录非活跃的内存页。

越接近链表尾部,就表示内存页越不常访问。这样,在回收内存时,系统就可以根据活跃
程度,优先回收不活跃的内存。
活跃和非活跃的内存页,按照类型的不同,又分别分为文件页和匿名页,对应着缓存回收
和 Swap 回收。
可以从 /proc/meminfo 中,查询它们的大小

# grep 表示只保留包含 active 的指标(忽略大小写)
# sort 表示按照字母顺序排序
$ cat /proc/meminfo | grep -i active | sort

第三种方式,OOM 机制按照 oom_score 给进程排序。oom_score 越大,进程就越容易
被系统杀死。

    一个进程消耗的内存越大,oom_score 就越大;
    一个进程运行占用的 CPU 越多,oom_score 就越小


当系统发现内存不足以分配新的内存请求时,就会尝试直接内存回收。这种情况下,如果
回收完文件页和匿名页后,内存够用了,当然皆大欢喜,把回收回来的内存分配给进程就
可以了。但如果内存还是不足,OOM 就要登场了。
OOM 发生时,你可以在 dmesg 中看到 Out of memory 的信息,从而知道是哪些进程
被 OOM 杀死了。比如,你可以执行下面的命令,查询 OOM 日志

 dmesg | grep -i "Out of memory

如果不希望应用程序被 OOM 杀死

1.可以调整进程的 oom_score_adj,减小OOM 分值,进而降低被杀死的概率。

2.或者,你还可以开启内存的 overcommit,允许进程申请超过物理内存的虚拟内存(这儿实际上假设的是,进程不会用光申请到的虚拟内存)。

3.管理员可以通过 /proc 文件系统,手动设置进程的oom_adj ,从而调整进程的 oom_score。

oom_adj 的范围是 [-17, 15],数值越大,表示进程越容易被 OOM 杀死;数值越小,表
示进程越不容易被 OOM 杀死,其中 -17 表示禁止 OOM

例如: 把sshd 进程的 oom_adj 调小为 -16

       echo -16 > /proc/$(pidof sshd)/oom_adj

思考:

回收后的内存又到哪里去了?
    内存回收后,会被重新放到未使用内存中。这样,新的进程就可以请求、使用它们。

OOM 是按照虚拟内存还是实际内存来打分?
    OOM 触发的时机基于虚拟内存。换句话说,进程在申请内存时,如果申请的虚拟内存
加上服务器实际已用的内存之和,比总的物理内存还大,就会触发 OOM。

怎么估计应用程序的最小内存?
      要确定一个进程或者容器的最小内存,最简单的方法就是让它运行起来,再通过 ps 或
者 smap ,查看它的内存使用情况。不过要注意,进程刚启动时,可能还没开始处理实
际业务,一旦开始处理实际业务,就会占用更多内存。所以,要记得给内存留一定的余
量。

 

交换分区( Swap)

Swap其实就是把一块磁盘空间当成内存来用。

它可以把进程暂时不用的数据存储到磁盘中(这个过程称为换出)

当进程访问这些内存时,再从磁盘读取这些数据到内存中(这个过程称为换入)
Swap 把系统的可用内存变大了。注意:通常只在内存不足时,才会发生 Swap 交换。并且由于磁盘读写的速度远比内存慢,Swap 会导致严重的内存性能问题



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值