用数据观测Page Cache

news2024/11/27 9:43:55

与 Page Cache 有关的场景:

服务器的 load 飙高;
服务器的 I/O 吞吐飙高;
业务响应时延出现大的毛刺;
业务平均访问时延明显增加

上边这些问题,很可能是由于 Page Cache管理不到位引起的,因为 Page Cache 管理不当除了会增加系统 I/O 吞吐外,还会引起业务性能抖动。
在这里插入图片描述

通过上图可以看到,红色的部分就是Page Cache,而它是内核管理的内存,属于内核。观察Page Cache可以使用free这个命令,也可以读取/proc/meminfo/proc/vmstat这两个文件。
cat /proc/meminfo可以看一下文件里边的内容:

[root@Sea1 ~]# cat /proc/meminfo
MemTotal:       16266392 kB
MemFree:         6835992 kB
MemAvailable:   14248884 kB
Buffers:            2088 kB
Cached:          8005488 kB
SwapCached:            0 kB
Active:          5181348 kB
Inactive:        3308564 kB
Active(anon):    1017616 kB
Inactive(anon):   277244 kB
Active(file):    4163732 kB
Inactive(file):  3031320 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                24 kB
Writeback:             0 kB
AnonPages:        482340 kB
Mapped:            97068 kB
Shmem:            812524 kB
Slab:             620676 kB
SReclaimable:     556080 kB
SUnreclaim:        64596 kB
KernelStack:        4032 kB
PageTables:         7456 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8133196 kB
Committed_AS:    2494392 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       36284 kB
VmallocChunk:   34359695100 kB
HardwareCorrupted:     0 kB
AnonHugePages:    270336 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      294764 kB
DirectMap2M:    13336576 kB
DirectMap1G:     5242880 kB

在这里插入图片描述

可以得出下边的公式(上图中,两边公式之和都是8007576):

Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem + SwapCached

等式两边的内容就是我们常说的Page Cache,两边都有 SwapCached,之所以要把它放在等式里,就是说它也是 Page Cache 的一部分。

接下来分析一下这些项的具体含义。
等式右边这些项把BuffersCached做了一下细分,分为了 Active(file)Inactive(file) Shmem,因为Buffers更加依赖于内核实现,在不同内核版本中它的含义可能有些不一致,而等式右边和应用程序的关系更加直接,所以从等式右边来分析。
在 Page Cache 中,Active(file)+Inactive(file) 是 File-backed page(与文件对应的内存页),是你最需要关注的部分。因为你平时用的mmap()内存映射方式和buffered I/O来消耗的内存就属于这部分,最重要的是,这部分在真实的生产环境上也最容易产生问题。
SwapCached是在打开了 Swap 分区后,把Inactive(anon)+Active(anon) 这两项里的匿名页给交换到磁盘(swap out),然后再读入到内存(swap in)后分配的内存。由于读入到内存后原来的Swap File还在,所以 SwapCached 也可以认为是 File-backed page,即属于Page Cache。这样做的目的也是为了减少 I/O。
除了SwapCachedPage Cache中的Shmem是指匿名共享映射这种方式分配的内存(free命令中shared这一项),比如 tmpfs(临时文件系统),这部分在真实的生产环境中产生的问题比较少。

free命令也可以用来查看系统中有多少 Page Cache,可以根据buff/cache来判断存在多少 Page Cache。如果你对 free命令有所了解的话,肯定知道free命令也是通过解析 /proc/meminfo 得出这些统计数据的,这些都可以通过 free 工具的源码来找到。free 命令的源码是开源,你可以去看下procfs里的 free.c 文件,源码是最直接的理解方式,会加深你对 free 命令的理解。
在这里插入图片描述

buff/cache的计算公式是buff/cache = Buffers + Cached + SReclaimable
这里你要注意,你在做比较的过程中,一定要考虑到这些数据是动态变化的,而且执行命令本身也会带来内存开销,所以这个等式未必会严格相等,不过你不必怀疑它的正确性。
在这里插入图片描述

从这个公式中,你能看到free命令中的buff/cache是由BuffersCachedSReclaimable这三项组成的,它强调的是内存的可回收性,也就是说,可以被回收的内存会统计在这一项。其中SReclaimable是指可以被回收的内核内存,包括dentryinode等。

掌握了 Page Cache 具体由哪些部分构成之后,在它引发一些问题时,你就能够知道需要去观察什么。比如说,应用本身消耗内存(RSS)不多的情况下,整个系统的内存使用率还是很高,那不妨去排查下是不是 Shmem(共享内存) 消耗了太多内存导致的。

如果不用内核管理的 Page Cache,那有两种思路来进行处理:

第一种,应用程序维护自己的 Cache 做更加细粒度的控制,比如 MySQL 就是这样做的,你可以参考MySQL Buffer Pool ,它的实现复杂度还是很高的。对于大多数应用而言,实现自己的 Cache 成本还是挺高的,不如内核的 Page Cache 来得简单高效。
第二种,直接使用 Direct I/O 来绕过 Page Cache,不使用 Cache 了,省的去管它了。

我们看一个具体的例子来解释为什么需要Page Cache。首先,我们来生成一个 1G 大小的新文件,然后把 Page Cache 清空,确保文件内容不在内存中,以此来比较第一次读文件和第二次读文件耗时的差异。具体的流程如下:
1.dd if=/dev/zero of=/root/dd.out bs=4096 count=262144生成一个1G 的文件。
2.sync && echo 3 > /proc/sys/vm/drop_caches先执行一下 sync 来将脏页同步到磁盘再去drop cache,这样的话,清空 Page Cache。
在这里插入图片描述
第一次读取文件的耗时如下:

[root@Sea1 ~]# time cat /root/dd.out &> /dev/null

real    0m6.705s
user    0m0.010s
sys     0m0.414s

第二次读取文件的耗时如下:

[root@Sea1 ~]# time cat /root/dd.out &> /dev/null

real    0m0.233s
user    0m0.007s
sys     0m0.226s

在这里插入图片描述
通过这样详细的过程你可以看到,第二次读取文件的耗时远小于第一次的耗时,这是因为第一次是从磁盘来读取的内容,磁盘 I/O 是比较耗时的,而第二次读取的时候由于文件内容已经在第一次读取时被读到内存了,所以是直接从内存读取的数据,内存相比磁盘速度是快很多的。这就是 Page Cache 存在的意义:减少 I/O,提升应用的 I/O 速度

此文章为9月Day 24学习笔记,内容来源于极客时间《Linux 内核技术实战课》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将数据包装成一个图数据结构(torch_geometric)

import torch from torch_geometric.data import Datax torch.tensor([[0, 1], [2, 3], [4, 5]], dtypetorch.float) # 节点特征矩阵(三个节点,每个节点两个特征) edge_index torch.tensor([[0, 1, 1, 2], [1, 0, 2, 1]], dtypetorch.long…

chrome插件-入门

chrome插件的作用 1、屏蔽网页上的广告,提高浏览速度和减少视觉干扰 2、捕捉和编辑网页截图 3、改善在社交媒体平台上的体验,例如提供额外的功能,或自定义外观和布局 4、网页翻译 5、保存和组织网页书签和笔记 6、管理日程安排,设…

第十章 异常

python使用异常的特殊对象管理程序执行期间发生的错误。每当发生错误时,python会创建异常对象。如果编写了处理该异常的代码,程序将继续运行;如果未处理,程序将显示traceback。 异常是使用try-except代码块处理的。使用try-excep…

pytorch3D Windows下安装经验总结

一、说明及准备工作 最近在安装pytorch3D的时候遇到了很多问题,查了很多博客,但发现讲的都不太全,所以特将自己的及收集到的安装过程经验总结如下。我是在Anaconda中虚拟环境下安装的。 1.1准备工作 官方安装教程如下:https://…

CSS基础介绍2

CSS使用三种方式 方式1&#xff1a;在标签的style属性上设置CSS样式&#xff08;行内样式&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>在标签的style属性上设置CSS样式</title>…

第七章 用户和组管理

7.1 Linux中的用户和组的分类 用户类别 超级用户&#xff08;0&#xff09; root 系统用户(1-999) 一般用户(1000-60000) 组类别 管理组 root 基本组&#xff08;默认组/主组&#xff09; 附加组&#xff08;额外组&#xff09; 7.2 用户管理 7.2.1 添加新用户 语法 useradd 【…

通过java向jar写入新文件

文章目录 原始需求分析实施步骤引入依赖核心编码运行效果 原始需求 有网友提问&#xff1a; 我想在程序中动态地向同一个jar包中添加文件&#xff0c;比如&#xff0c;我的可执行jar包是test.jar,我要在它运行时生成一些xml文件并将这些文件添加到test.jar中,请问如何实现&…

路由模式和打包优化

1. 路由模式-将路由改成history模式 hash模式带#&#xff0c;#后面的地址变化不会引起页面的刷新history没有#&#xff0c;地址变化会引起页面刷新&#xff0c;更符合页面地址的规范&#xff08;开发环境不刷新-webpack配置&#xff09;将路由模式修改成history模式-代码位置(s…

钉钉h5微应用调试 整理

钉钉 H5微应用整理 1.申请H5微应用2.登录3.调试 1.申请H5微应用 https://open.dingtalk.com/ 登录钉钉开发平台。 应用appId、CorpId都可以在网站上自行查找 应用首页地址&#xff08;指手机端显示地址&#xff09; pc端首页地址&#xff08;指电脑端显示地址&#xff09; 我这…

Spring Cloud Gateway学习(1)—— Gateway 的基本概念 引入依赖需要注意的事项 +解决方案 全局网关的入门使用案例

前言 Spring Cloud Gateway 基于 Spring Boot 2&#xff0c;是 Spring Cloud 的全新项目。Gateway 旨在提供一种简单而有效的途径来转发请求&#xff0c;并为它们提供横切关注点。 gateway相当于所有服务的门户&#xff0c;将客户端请求与服务端应用相分离&#xff0c;客户端…

力扣 -- 10. 正则表达式匹配

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool isMatch(string s, string p) {int ms.size();int np.size();//处理后续映射关系s s;//处理后续映射关系p p;vector<vector<bool>> dp(m1,vector<bool>(n1));//初始化dp[0][0]true…

走进Spring的世界 —— Spring底层核心原理解析(一)

文章目录 前言一、Spring中是如何创建一个对象二、Bean的创建过程三、推断构造方法四、AOP大致流程五、Spring事务 前言 ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("config.xml"); UserService userService (UserService) cont…

pytorch第一天(tensor数据和csv数据的预处理)lm老师版

tensor数据&#xff1a; import torch import numpyx torch.arange(12) print(x) print(x.shape) print(x.numel())X x.reshape(3, 4) print(X)zeros torch.zeros((2, 3, 4)) print(zeros)ones torch.ones((2,3,4)) print(ones)randon torch.randn(3,4) print(randon)a …

koa基础应用

不要把koa想得太复杂&#xff0c;他就是一个Node框架而已。 在本地应用安装好Node和koa后&#xff0c;先实现一下简单的服务app.js&#xff0c;代码如下&#xff1a; const Koa require(koa) const app new Koa(); app.use(async (context) > {context.body hello Koa …

CCF CSP认证 历年题目自练Day17

CCF CSP认证 历年题目自练Day17 题目一 试题编号&#xff1a; 201803-1 试题名称&#xff1a; 跳一跳 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   近来&#xff0c;跳一跳这款小游戏风靡全国&#xff0c;受到不少玩家的喜爱…

【Linux】——基操指令(二)

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 目录 前言 man指令 cp 指令 mv指令 echo指令 cat指令 more指令 less指令 head和tail指令 head指令 tail指令 前言 上篇文章给大家讲解了Linux环境下的一点基操指令&#xf…

Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

云原生开发:从容器到微服务的全栈指南

文章目录 什么是云原生开发&#xff1f;1. 容器化2. 微服务架构 云原生开发的优势1. 可伸缩性2. 高可用性3. 灵活性4. 快速交付 云原生开发的1. 学习曲线2. 复杂性3. 运维挑战 云原生开发的最佳实践1. 自动化部署2. 监控和日志3. 安全性4. 弹性设计5. 文档和培训 未来展望结论 …

聊聊并发编程——并发容器和阻塞队列

目录 一.ConcurrentHashMap 1.为什么要使用ConcurrentHashMap&#xff1f; 2.ConcurrentHashMap的类图 3.ConcurrentHashMap的结构图 二.阻塞队列 Java中的7个阻塞队列 ArrayBlockingQueue&#xff1a;一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue&#xf…