内存中的buffer和cache

您所在的位置:网站首页 cache读命中 内存中的buffer和cache

内存中的buffer和cache

2024-05-26 21:43| 来源: 网络整理| 查看: 265

目录

一、free命令

二、buffer和cache的数据来源及含义

1、数据来源

2、Buffers、Cached 和 SReclaimable

3、其他注意点

三、如何利用Buffer 和 Cache优化程序的运行效率?

1、缓存命中率

2、指定文件的缓存大小

四、总结

一、free命令

提到查看linux主机内存,我们总会想到free命令也一般用该命令,如下面的输出:

[root@localhost ~]# free total used free shared buff/cache available Mem: 3861292 283220 3424792 11848 153280 3375380 Swap: 2097148 0 2097148 [root@localhost ~]#

free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存,比如总内存、已用内存、缓存、可用内存等。其中缓存是 Buffer 和 Cache 两部分的总和 。

有关于free命令的使用,可自行百度,一搜一大堆。

Mem 行(第二行)是内存的使用情况。Swap 行(第三行)是交换空间的使用情况。total 列显示系统总的可用物理内存和交换空间大小。used 列显示已经被使用的物理内存和交换空间。free 列显示还有多少物理内存和交换空间可用使用。shared 列显示被共享使用的物理内存大小。buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。available 列显示还可以被应用程序使用的物理内存大小。 二、buffer和cache的数据来源及含义 1、数据来源

从字面上来说,Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储。那么,这两种“临时存储”有什么区别吗?free出来的数据是来自哪里呢?

用 man free,就可以找到对应指标的详细说明:

buffers Memory used by kernel buffers (Buffers in /proc/meminfo) cache Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo) buff/cache Sum of buffers and cache

从 free 的手册中,你可以看到 buffer 和 cache 的说明。

buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。(有遇到过些系统是Cached 与 Slab之和,具体还以自己系统为准)

这里的说明告诉我们,这些数值都来自 /proc/meminfo,但更具体的 Buffers、Cached 和 SReclaimable 的含义又是什么呢?往下看。

2、Buffers、Cached 和 SReclaimable

/proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从 /proc 中查询内核的运行状态和配置选项,查询进程的运行状态、统计数据等,也可以通过 /proc 来修改内核的配置。proc 文件系统同时也是很多性能工具的最终数据来源。比如 free 就是通过读取/proc/meminfo,得到内存的使用情况。继续说回/proc/meminfo,既然 Buffers、Cached、SReclaimable 这几个指标不容易理解,还得继续查 proc 文件系统,获取它们的详细定义。

/proc/meminfo This file reports statistics about memory usage on the system. It is used by free(1) to report the amount of free and used memory (both physical and swap) on the system as well as the shared memory and buffers used by the kernel. Each line of the file consists of a parameter name, followed by a colon, the value of the parameter,and an option unit of measurement (e.g., "kB"). The list below describes the parameter names and the format specifier required to read the field value. Except as noted below, all of the fields have been present since at least Linux 2.6.0. Some fileds are displayed only if the kernel was configured with various options; those dependencies are noted in the list. Buffers %lu Relatively temporary storage for raw disk blocks that shouldn't get tremendously large (20MB or so). Cached %lu In-memory cache for files read from the disk (the page cache). Doesn't include SwapCached. SwapCached %lu Memory that once was swapped out, is swapped back in but still also is in the swap file. (If memory pressure is high, these pages don't need to be swapped out again because they are already in the swap file. This saves I/O.) SReclaimable %lu (since Linux 2.6.19) Part of Slab, that might be reclaimed, such as caches. SUnreclaim %lu (since Linux 2.6.19) Part of Slab, that cannot be reclaimed on memory pressure.

通过这个文档,我们可以看到:

Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。 3、其他注意点

文档上只提到,Cache 是文件读的缓存

写文件时会用到 Cache 缓存数据,而写磁盘则会用到 Buffer 来缓存数据。读文件时数据会缓存到 Cache 中,而读磁盘时数据会缓存到 Buffer 中。

虽然文档提供了对 Buffer 和 Cache 的说明,但是仍不能覆盖到所有的细节:

Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。这样,我们就回答了案例开始前的两个问题。

简单来说,Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

Buffer 和 Cache 分别缓存磁盘和文件系统的读写数据。

从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。 三、如何利用Buffer 和 Cache优化程序的运行效率? 1、缓存命中率

该处的“缓存”,通指数据在内存中的临时存储。

所谓缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。用来衡量缓存使用的好坏,评估提升程序的运行效率的效果。

命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。

在现在所有的高并发系统中,缓存是必不可少,更是必不可缺的核心模块,主要作用就是把经常访问的数据(也就是热点数据),提前读入到内存中。这样,下次访问时就可以直接从内存读取数据,而不需要经过硬盘,从而加快应用程序的响应速度。

这些独立的缓存模块通常会提供查询接口,方便我们随时查看缓存的命中情况。不过 Linux 系统中并没有直接提供这些接口,主要通过cachestat 和 cachetop 查看查看系统缓存命中情况。

cachestat 提供了整个操作系统缓存的读写命中情况。cachetop 提供了每个进程的缓存命中情况。 注: cachestat 和 cachetop工具都是 bcc 软件包的一部分,它们基于 Linux 内核的 eBPF(extended Berkeley Packet Filters)机制,来跟踪内核中管理的缓存,并输出缓存的使用和命中情况。使用前要安装 bcc 软件包,bcc-tools 需要内核版本为 4.1 或者更新的版本 1、Ubuntu 系统中安装: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD echo "deb https://repo.iovisor.org/apt/xenial xenial main" | sudo tee /etc/apt/sources.list.d/iovisor.list sudo apt-get update sudo apt-get install -y bcc-tools libbcc-examples linux-headers-$(uname -r) 2、CentOS:需要手动升级内核后再安装:参考文章:https://blog.csdn.net/weixin_43769772/article/details/107089407 yum update -y rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm yum remove -y kernel-headers kernel-tools kernel-tools-libs yum --enablerepo=elrepo-kernel install -y kernel-ml kernel-ml-devel kernel-ml-headers # 更新 Grub 后重启 grub2-mkconfig -o /boot/grub2/grub.cfg grub2-set-default 0 reboot uname -r yum install -y bcc-tools export PATH=$PATH:/usr/share/bcc/tools

运行 cachestat 和 cachetop 命令:

(1)cachestat 的运行界面,它以 1 秒的时间间隔,输出了 3 组缓存统计数据:

cachestat 1 3 TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB 2 0 2 1 17 279 2 0 2 1 17 279 2 0 2 1 17 279

cachestat 的输出其实是一个表格。每行代表一组数据,而每一列代表不同的缓存统计指标。这些指标从左到右依次表示:

TOTAL ,表示总的 I/O 次数;MISSES ,表示缓存未命中的次数;HITS ,表示缓存命中的次数;DIRTIES, 表示新增到缓存中的脏页数;BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位;CACHED_MB 表示 Cache 的大小,以 MB 为单位。

(2)cachetop 的运行界面

cachetop 11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT% 13029 root python 1 0 0 100.0% 0.0%

输出跟 top 类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。

HITS ,表示缓存命中的次数;MISSES ,表示缓存未命中的次数;DIRTIES, 表示新增到缓存中的脏页数;READ_HIT ,表示读的缓存命中率;WRITE_HIT ,表示写的缓存命中率。 2、指定文件的缓存大小

使用 pcstat 这个工具,来查看文件在内存中的缓存大小以及缓存比例。pcstat 是一个基于 Go 语言开发的工具,所以安装它之前,你首先应该安装 Go 语言。

安装完 Go 语言,再运行下面的命令安装 pcstat:

$ export GOPATH=~/go $ export PATH=~/go/bin:$PATH $ go get golang.org/x/sys/unix $ go get github.com/tobert/pcstat/pcstat

运行 pcstat 来查看文件的缓存情况了。比如,下面就是一个 pcstat 运行的示例,它展示了 /bin/ls 这个文件的缓存情况:

pcstat /bin/ls +---------+----------------+------------+-----------+---------+ | Name | Size (bytes) | Pages | Cached | Percent | |---------+----------------+------------+-----------+---------| | /bin/ls | 133792 | 33 | 0 | 000.000 | +---------+----------------+------------+-----------+---------+

输出中,Cached 就是 /bin/ls 在缓存中的大小,而 Percent 则是缓存的百分比。你看到它们都是 0,这说明 /bin/ls 并不在缓存中。

接着,如果你执行一下 ls 命令,再运行相同的命令来查看的话,就会发现 /bin/ls 都在缓存中了:

ls pcstat /bin/ls +---------+----------------+------------+-----------+---------+ | Name | Size (bytes) | Pages | Cached | Percent | |---------+----------------+------------+-----------+---------| | /bin/ls | 133792 | 33 | 33 | 100.000 | +---------+----------------+------------+-----------+---------+ 四、总结

Buffer 和 Cache 分别缓存磁盘和文件系统的读写数据, 可以极大提升系统的 I/O 性能。

从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。

通常,我们用缓存命中率,来衡量缓存的使用效率。命中率越高,表示缓存被利用得越充分,应用程序的性能也就越好。

可以用 cachestat 和 cachetop 这两个工具,观察系统和进程的缓存命中情况。其中,cachestat 提供了整个系统缓存的读写命中情况。cachetop 提供了每个进程的缓存命中情况。

不过要注意,Buffers 和 Cache 都是操作系统来管理的,应用程序并不能直接控制这些缓存的内容和生命周期。

所以,在应用程序开发中,一般要用专门的缓存组件,来进一步提升性能。比如,程序内部可以使用堆或者栈明确声明内存空间,来存储需要缓存的数据,或使用 Redis 这类外部缓存服务,优化数据的访问效率。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3