首页 > 系统相关 >Linux中Cache内存占用过高解决办法

Linux中Cache内存占用过高解决办法

时间:2023-08-29 15:22:10浏览次数:54  
标签:kB 缓存 buffer Cache cache 内存 Linux 内核

https://zhuanlan.zhihu.com/p/200833204

一、概述

在日常运维中,我们会发现主机内存使用告警,为什么Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做Cache Memory。

有时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存free显示很少,我们可以使用cat /proc/meminfo 或free -m查看内存信息,还有一项 Cached Memory:

[root@localhost ~]# free -m

total used free shared buff/cache available

Mem: 7815 1410 4959 32 1445 4101

Swap: 2047 0 2047

[root@localhost ~]# cat /proc/meminfo

MemTotal: 8003408 kB

MemFree: 5080476 kB

MemAvailable: 4201416 kB

Buffers: 1068 kB

Cached: 1386772 kB

SwapCached: 0 kB

Active: 2234760 kB

Inactive: 422508 kB

Active(anon): 1285588 kB

Inactive(anon): 17228 kB

Active(file): 949172 kB

Inactive(file): 405280 kB

Unevictable: 0 kB

Mlocked: 0 kB

SwapTotal: 2097148 kB

SwapFree: 2097148 kB

Dirty: 8 kB

Writeback: 0 kB

AnonPages: 1269464 kB

Mapped: 48816 kB

Shmem: 33388 kB

Slab: 127600 kB

SReclaimable: 92416 kB

SUnreclaim: 35184 kB

KernelStack: 3456 kB

PageTables: 7600 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 6098852 kB

Committed_AS: 1486200 kB

VmallocTotal: 34359738367 kB

VmallocUsed: 25856 kB

VmallocChunk: 34359710204 kB

HardwareCorrupted: 0 kB

AnonHugePages: 1118208 kB

CmaTotal: 0 kB

CmaFree: 0 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

DirectMap4k: 83968 kB

DirectMap2M: 5154816 kB

DirectMap1G: 3145728 kB

1、基本概念

第一列
Mem 内存的使用信息
Swap 交换空间的使用信息
第一行
total 系统总的可用物理内存大小
used 已被使用的物理内存大小
free 还有多少物理内存可用
shared 被共享使用的物理内存大小
buff/cache 被 buffer 和 cache 使用的物理内存大小
available 还可以被应用程序使用的物理内存大小

free 与 available 的区别
free 是真正尚未被使用的物理内存数量。
available 是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法)

2、缓存机制介绍

在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。
缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。
CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。

二、缓存区分buffers和cached区别

内核在保证系统能正常使用物理内存和数据量读写情况下来分配缓冲区大小。
buffers用来缓存metadata及pages,可以理解为系统缓存,例如,vi打开一个文件。
cached是用来给文件做缓存,可以理解为数据块缓存,例如,dd if=/dev/zero of=/tmp/test count=1 bs=1G 测试写入一个文件,就会被缓存到缓冲区中,当下一次再执行这个测试命令时,写入速度会明显很快。

具体解释:

buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

1、什么是page cache?
Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

2、什么是buffer cache?
Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

三、Swap用途

Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:
swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大

四、释放缓存区内存的方法

1、清理pagecache(页面缓存)

[root@localhost ~]#echo 1 > /proc/sys/vm/drop_caches 或者 [root@localhost ~]# sysctl -w vm.drop_caches=1

2、清理dentries(目录缓存)和inodes

[root@localhost ~]# echo 2 > /proc/sys/vm/drop_caches 或者 [root@localhost ~]# sysctl -w vm.drop_caches=2

3、清理pagecache、dentries和inodes

[root@localhost ~]# echo 3 > /proc/sys/vm/drop_caches 或者 [root@localhost ~]# sysctl -w vm.drop_caches=3

这个文件可以设置的值分别为1、2、3。它们所表示的含义为:

echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。

echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。

echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。 

上面三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效即可!
另外,可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存

[root@localhost ~]# sync  

五、注意事项  

关于清除缓存的操作在大多数情况下都不会对系统造成伤害,只会有助于释放不用的内存。
但是如果在执行这些操作时正在写数据,那么实际上在数据到达磁盘之前就将它从文件缓存中清除掉了,这可能会造成很不好的影响。那么如果避免这种事情发生呢?
因此,这里不得不提一下/proc/sys/vm/vfs_cache_pressure这个文件,告诉内核,当清理inoe/dentry缓存时应该用什么样的优先级。

vfs_cache_pressure=100 这个是默认值,内核会尝试重新声明dentries和inodes,并采用一种相对于页面缓存和交换缓存比较”合理”的比例。

减少vfs_cache_pressure的值,会导致内核倾向于保留dentry和inode缓存。

增加vfs_cache_pressure的值,(即超过100时),则会导致内核倾向于重新声明dentries和inodes

 

总之,vfs_cache_pressure的值:

小于100的值不会导致缓存的大量减少

超过100的值则会告诉内核你希望以高优先级来清理缓存。

其实无论vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。

如果将此值设置为10000,系统将会将缓存减少到一个合理的水平。

释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

/proc是一个虚拟文件系统,可以通过对它的读写操作作为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。也就是说我们可以通过调整/proc/sys/vm/drop_caches来释放内存。

drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存

 

标签:kB,缓存,buffer,Cache,cache,内存,Linux,内核
From: https://www.cnblogs.com/tomato-haha/p/17664909.html

相关文章

  • Linux中的内存回收[二]
    https://zhuanlan.zhihu.com/p/72998605Linux中的内存回收[一]在NUMA系统中,如果使用页面cache所带来的的收益超过数据存储在不同zone/node的损失,那么可以选择在当前zone内存不足时不进行回收(以保留页面cache),而是使用其他zone/node的空闲内存。反之,如果数据的locality更加重要,......
  • linux下给硬盘分区为xfs格式
    linux下给硬盘分区为xfs格式  1、lsblk-f这个命令是查看系统可以识别出的所有分区的文件系统类型2查看fdisk-l   3、把vdb分区 Thepartitiontablehasbeenaltered表示分区表已经更改 5、lsblk查看已经分出来的区 6、mkfs.xfs-f/dev/vdb把vdb格式......
  • RISCV-MINI cache小记
    该cache映射策略为直接映射,采用写回(writeback)方式。需要注意的细节在于cpu-cache通过mask信号判断访存是读还是写,显然mask全0时为读。下图FSM中省略了dirty会影响状态转移,比如WriteCache到WriteBack,当cache块为dirty时才会触发aw.fire(io.nasti.aw.valid:=is_dirty)。简单解释:......
  • linux基本学习
     转自:https://mp.weixin.qq.com/s/4dZ3mbu287pC6mdGOczGAA狂神说java目录管理绝对路径和相对路径我们知道Linux的目录结构为树状结构,最顶级的目录为根目录/。其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。在开始本教程前我们需要先知道什么是绝对路......
  • Linux高性能服务器编程阅读1:
    Linux:所有东西都是文件。socket也是可读,可写,可控制,可编程的文件描述符。I/O高级函数:1.pipe()和dup()/dup2()pipe()函数创建的两个文件描述符fd[0]和fd[1]分别构成管道的两端,往fd[1]中写入的数据可以从fd[0]中读出。且,fd[1]只能写入数据,fd[0]只能读出数据,不能颠倒。dup和dup2......
  • 01 linux 定时任务之关机
    定时关机例:设置在每天03:00定时关机在Linux系统终端执行以下代码 sudo-s#进入rootsudogedit/etc/crontab#编辑/etc/crontab 在打开的窗口添加以下内容,保存并退出  0003***root/sbin/shutdown-hnow#......
  • linux之将程序改为系统启动&开机自动启动
    1.sudovim/etc/systemd/system/django_ops.service2.填入以下内容[Unit]Description=MyCustomServiceAfter=network.target[Service]ExecStart=/data/soft/django_ops/django_ops.shRestart=always[Install]WantedBy=multi-user.targetViewCode3.所用脚本内......
  • 内存对齐的相关问题
    文章目录一、sizeof与strlen区别二、内存对齐1、面试题--->什么是内存对齐?2、内存对齐的规则3、面试题--->为什么要使用内存对齐(提高访问内存速度)?4、如何修改内存对齐参数三、判断两个结构体是否相等一、sizeof与strlen区别sizeof是运算符,结果在编译时计算,不能返回动态分配的内......
  • Linux 中的内存(cache,buffer,)
    在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。内存查看当我们使用free-h命令时,会显示如下的信息t......
  • linux swap 内存交换分区 详细介绍
    目录1、什么是SWAP,到底是干嘛的?为什么要进行内存回收?会回收的两种内存2、swappiness到底是用来调节什么的?那么这个swappiness到底起到了什么作用呢?3、kswapd什么时候会进行swap操作?4、什么是内存水位标记?(watermark)相关参数设置swap的相关操纵命令5、swap分区的优先级......