一文明白 Linux 内存 Page Cache 和 Swap

携手创作,共同成长!这是我参与「掘金日新计划 · 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 手册来查看说明:

内存-2022-07-2916-06-21.png

  • Buffers :是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。

  • Cache: 是 Page Cache 页缓存 和 Slab 用到的内存,对应的是 /proc/meminfo 中的 CachedSReclaimable 之和。

    • Page Cache 页缓存:缓存从文件读取的数据。
    • Slab:用于记录可回收部分 和 不可回收部分。

由上,并结合平时开发经验,推测内存组成部分:堆内存、堆外内存、Page Cache、其他

内存-2022-07-2916-30-03.png

问题:在 64位系统下,虚拟地址空间中 内核空间 和 用户空间 均占 128T,可对应的空间在物理内存中占多少?

这其实没有一个明确的答案,因为 内核空间 和 用户空间 共享同一个物理内存。 但我们平时开发时(KafkaES)经常接触到 Page Cache,同时希望能分配更多内存给 Page Cache。 要么限制 Page Cache 的大小,要么限制应用程序的大小。 一般我们都选择限制应用程序,举个栗子: 安装 ES 在 8C16G 机子下,设置最大和最小堆内存为 8G,-Xms8g -Xmx8g目的就是留一半内存给 Page Cache


下面着重来介绍 Page CacheSwap

扫描二维码关注公众号,回复: 14417773 查看本文章

Page Cache 页缓存

Page cache:也叫页缓冲文件缓冲也叫 ES 中的 filesystem cache

问题:为什么需要 Page Cache ?

  • 回答:加速对文件内容的访问。减少磁盘I/O,提升应用的 I/O 速度。

举个栗子:写文件

调用 write(2)函数,写入 Page Cache后就返回,内核会自动刷盘(把 Page Cache 中数据写入磁盘)。

来看张神图,应用程序产生 Page Cache 的逻辑示意图:

pagecache-2022-07-2918-18-13.png

从图中可知:

  1. Page Cache 是内核管理的内存,属于内核不属于用户。
  2. 有两种方式可以产生 Page Cache:标准I/OBuffered I/O) 和 MMAPMemory-Mapped I/O
  3. Linux I/O 有 3 种方式:标准I/OMMAPDirect I/O

要分析此图,我们还需要先了解 Linux IO 栈:

  1. 虚拟文件系统(VFS :对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口。
  2. 块层(Block I/O :管理块设备的 IO 队列,对 IO 请求进行合并、排序。
  3. 设备驱动(Device Driver :操作存储介质。

猜你喜欢

转载自juejin.im/post/7125820067262464007