22-答疑篇:Linux内存性能优化答疑
问题1: 内存回收与OOM
-
怎么理解LRU内存回收?
一旦系统发现内存紧张,系统会通过三种方式回收内存
- 基于 LRU(Least Recently Used)算法,回收缓存
- 基于Swap机制,回收不常访问的匿名页
- 基于OOM(Out of Memory)机制,杀掉占用大量内存的进程
缓存回收和Swap回收,实际上都是基于LRU算法,也就是优先回收不常访问的内存
LRU回收算法,实际上维护着active和inactive两个双向链表
- active记录活跃的内存页
- inactive记录非活跃的内存页
越接近链表尾部,就表示内存页越不常访问,在回收内存时,系统就可以根据活跃程度,优先回收不活跃的内存
活跃和非活跃的内存页,按照类型的不同,又分别分为文件页和匿名页,对应着缓存回收和Swap回收
可以从 /proc/meminfo 中,查询它们的大小
# grep 表示只保留包含 active 的指标(忽略大小写) # sort 表示按照字母顺序排序 [root@local_sa_192-168-1-6 ~]# cat /proc/meminfo | grep -i active | sort Active(anon): 167976 kB Active(file): 971488 kB Active: 1139464 kB Inactive(anon): 720 kB Inactive(file): 2109536 kB Inactive: 2110256 kB
-
回收后的内存又到哪里去了?
内存回收后,会被重新放到未使用内存中。这样,新的进程就可以请求、使用它们
-
OOM是按照虚拟内存还是实际内存来打分?
OOM触发的时机基于虚拟内存。
换句话说,进程在申请内存时,如果申请的虚拟内存加上服务器实际已用的内存之和,
比总的物理内存还大,就会触发OOM。
-
怎么估计应用程序的最小内存?
要确定一个进程或者容器的最小内存,最简单的方法就是让它运行起来,
再通过 ps 或 者 smap ,查看它的内存使用情况。
不过要注意,进程刚启动时,可能还没开始处理实 际业务,一旦开始处理实际业务,就会占用更多内存。
所以,要记得给内存留一定的余量
问题2: 文件系统与磁盘的区别
磁盘是一个存储设备(确切地说是块设备),可以被划分为不同的磁盘分区
而在磁盘或者磁盘分区上,还可以再创建文件系统,并挂载到系统的某个目录中
这样,系统就可以通过这个挂载目录,来读写文件
磁盘是存储数据的块设备,也是文件系统的载体
所以,文件系统确实还是要通过磁盘,来保证数据的持久化存储
Linux 中一切皆文件,可以通过相同的文件接口,来访问磁盘和文件(比如 open、read、write、close 等)
在读写普通文件时,I/O请求会首先经过文件系统,然后由文件系统负责,来与磁盘进行交互
而在读写块设备文件时,会跳过文件系统,直接与磁盘交互,也就是所谓的“裸 I/O”
这两种读写方式使用的缓存自然不同
文件系统管理的缓存,其实就是Cache的一部分
而裸磁盘的缓存,用的正是Buffer