携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
前言
先来看下本机系统内存使用情况:数值默认单位为 KB
# 笔记本本机 16G 内存,Ubuntu 18
$ free
total used free shared buff/cache available
Mem: 16306984 13655780 1205560 576992 1445644 1748628
Swap: 2097148 1620224 476924
# -h 适配可读的单位。-m 即 MB 为单位
$ free -h
total used free shared buff/cache available
Mem: 15G 13G 320M 649M 1.6G 1.0G
Swap: 2.0G 1.6G 435M
Total
(全部) : 总内存大小- Used(已用) : 已使用的内存大小,包含共享内存
- Free(未用) : 未使用内存的大小
- Shared(共享): 共享内存的大小
Buff/Cache
(缓存):块设备缓存区 和 文件缓存大小Available
(可用) : 新进程可用内存的大小(未使用内存 + 可回收的内存)Swap
(交换区) :把这些不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用。
关于 Buff/Cache
,可以通过 man free
手册来查看说明:
-
Buffers
:是内核缓冲区用到的内存,对应的是/proc/meminfo
中的Buffers
值。 -
Cache
: 是Page Cache
页缓存 和Slab
用到的内存,对应的是/proc/meminfo
中的Cached
与SReclaimable
之和。Page Cache
页缓存:缓存从文件读取的数据。Slab
:用于记录可回收部分 和 不可回收部分。
由上,并结合平时开发经验,推测内存组成部分:堆内存、堆外内存、Page Cache
、其他
问题:在 64位系统下,虚拟地址空间中 内核空间 和 用户空间 均占 128T,可对应的空间在物理内存中占多少?
这其实没有一个明确的答案,因为 内核空间 和 用户空间 共享同一个物理内存。 但我们平时开发时(
Kafka
、ES
)经常接触到Page Cache
,同时希望能分配更多内存给Page Cache
。 要么限制Page Cache
的大小,要么限制应用程序的大小。 一般我们都选择限制应用程序,举个栗子: 安装ES
在 8C16G 机子下,设置最大和最小堆内存为 8G,-Xms8g -Xmx8g
。目的就是留一半内存给Page Cache
。
下面着重来介绍 Page Cache
与 Swap
。
Page Cache
页缓存
Page cache
:也叫页缓冲 或 文件缓冲,也叫 ES
中的 filesystem cache
。
问题:为什么需要 Page Cache
?
- 回答:加速对文件内容的访问。减少磁盘
I/O
,提升应用的I/O
速度。
举个栗子:写文件
调用
write(2)
函数,写入Page Cache
后就返回,内核会自动刷盘(把Page Cache
中数据写入磁盘)。
来看张神图,应用程序产生 Page Cache
的逻辑示意图:
从图中可知:
Page Cache
是内核管理的内存,属于内核不属于用户。- 有两种方式可以产生
Page Cache
:标准I/O
(Buffered I/O
) 和MMAP
(Memory-Mapped I/O
) Linux I/O
有 3 种方式:标准I/O
、MMAP
和Direct I/O
要分析此图,我们还需要先了解 Linux IO
栈:
- 虚拟文件系统(
VFS
) :对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口。 - 块层(
Block I/O
) :管理块设备的IO
队列,对IO
请求进行合并、排序。 - 设备驱动(
Device Driver
) :操作存储介质。