第一个问题:内存回收和OOM

如何理解LRU内存回收

回收后的内存去哪了

OOM如何打分的,是利用虚拟内存还是实际内存?

如何估计应用程序的最小内存?

对于内存的回收方式,则是分为三种方式,一种是基于LRU算法,进行回收缓存

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

基于OOM机制,杀掉占用大量内存的进程

对于LRU的回收,则是维护了active和inactive两个双向链表

active记录了活跃的内存页,inactive则是不活跃的内存页

根据不活跃的页的靠后程度,进行回收

OOM的杀死,则是利用了oom_score,oom_score越大,进程越容易被系统杀死

OOM发生的时候,可以在dmesg中看到OOM的信息

dmesg | grep ‘Out of memory’

如果对某一个进程比较珍惜,则可以调整其oom_score_adj,减少OOM分值

说完第一个问题,我们已经说完了

对于内存回收后,则是重新放在未使用内存中

对于OOM触发的时机基于虚拟内存,进程在申请内存的时候,申请的虚拟内存加上服务器总使用内存之和大于总的物理内存还大,就会触发OOM

如何估计一个进程最小内存,最好还是在运行的时候检测

第二个问题:文件系统和磁盘的区别

Buffer和Cache之间,Buffer用于磁盘,Cache用于文件,按照这个细讲,磁盘是一个存储设备,是一个块设备,在此之上,建立文件系统共,挂载到系统的某个目录中,系统就可以通过挂载目录,读写文件

总体来说,磁盘可以是文件系统的载体

对于读写普通文件时候,IO会首先经过文件系统,然后由文件系统负责,来和磁盘进行交互,读写块设备文件时候,会跳过文件系统,直接和磁盘交互,就是所谓的裸I/O

第三个问题,如何统计所有进程的物理内存使用量

如何统计呢,是有一些思路的,比如将所有的RSS相加

但是,会导致不少地方重复计算,因为RSS是常驻内存,包含了共享内存

不过可以计算每个进程的PSS,将共享内存分到每个进程之后,加上进程本身非共享内存代销的和

# 使用grep查找Pss指标后,再用awk计算累加值

$ grep Pss /proc/[1-9]*/smaps | awk ‘{total+=$2}; END {printf “%d kB\n”, total }’

391266 kB

发表评论

邮箱地址不会被公开。 必填项已用*标注