linux pagecache与内存占用

本文介绍了Linux系统中的内存管理概念,包括free命令的使用及其显示字段的含义,如total、used、free等,并深入探讨了pagecache的重要性及如何通过/proc/sys/vm/drop_caches接口手动清理缓存。
部署运行你感兴趣的模型镜像
实验环境 CentOS Linux release 7.3.1611 (Core)  3.10.0-514.6.1.el7.x86_64
 
一、概念介绍
     linux系统中通常使用free命令来查看内存使用情况,free命令主要是从/proc/meminfo文件中读取的内存数据然后进行简单处理进行展示,根据查看free命令的手册了解到各个字段的含义。
total:系统总内存大小(分物理内存mem、交换分区swap)
used:已使用的内存(total - free - buffers - cache)
free:未使用的内存
shared:通常情况下是tmpfs(内存文件系统)使用的内存
buffers:内核缓冲区使用的内存
cache:page cache和slab所占用的内存之和
buff/cache:buffers + cache
available:在不进行swap的前提下还有多少内存可用于创建新的进程。这个跟free、buff/cache字段中的数字有所不同,这里的剩余内存是free加上可以被回收(有些slab、cache正在使用,不能回收)的page cache、mem slab的值的总和。
     上述的page cache是系统读写磁盘文件时为了提高性能而将一部分文件缓存到内存中。这种做法虽然提高了磁盘I/O性能,但是也极大的占用了物理内存,特别当系统内存紧张时更容易出现问题。
 
二、实际用途
     linux系统会经常执行一些写日志、生成备份文件的工作,当这些文件比较大时相应的cache就会占用大量的系统内存,而且这些类型的cache并不会被经常访问,所以系统会定期将这些cache flush到磁盘中。但是如果系统未及时的将这些cache flush到磁盘中的话,就会占用大量的内存导致出现swap的情况,这样会很影响系统的整体性能。
     /proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。有一个内核配置接口 /proc/sys/vm/drop_caches 可以允许用户手动清理cache来达到释放内存的作用,这个文件有三个值:1、2、3。具体介绍如下
Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
- To free pagecache:
- * echo 1 > /proc/sys/vm/drop_caches
 
- To free dentries and inodes:
- * echo 2 > /proc/sys/vm/drop_caches
 
- To free pagecache, dentries and inodes:
- * echo 3 > /proc/sys/vm/drop_caches
 
- As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.
- This tunable was added in 2.6.16.
根据上面介绍,在执行上述命令需要先执行sync命令将page cache刷新到磁盘中,然后在通过该drop_caches接口进行缓存清理。
     另外,在编写处理大文件的代码时,避免整个文件全部读取到内存中,这样会导致占用大量的内存,极端情况下会出现linux 系统的OOM导致的正常进程被终止。尽量将文件分割成小文件再进行处理,文件使用完毕后尽早close。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 解决Linux环境下Oracle部署过程中缓存占用过多内存的问题 在Linux环境中部署Oracle数据库时,可能会遇到由于缓冲区高速缓存(Buffer Cache)和其他内存结构导致的高内存使用率问题。为了有效管理并减少这种现象的影响,可以采取以下措施: #### 调整SGA和PGA大小 通过调整System Global Area (SGA) 和 Program Global Area (PGA),能够优化Oracle实例对物理RAM的需求。对于运行于RHEL/OEL上的集群环境而言,最低所需的RAM量为2.5GB用于支持Grid Infrastructure以及Oracle RAC[^1]。 如果发现系统存在过高的内存消耗情况,则应考虑适当降低`sga_target`参数值来减小共享全局区域(SGA)所占空间;同样也可以修改`pga_aggregate_target`以控制程序全局区域(PGA)的最大容量。需要注意的是,在做出任何更改之前应当充分评估性能影响,并确保不会因为资源不足而引发其他潜在风险。 ```sql ALTER SYSTEM SET sga_target=800M SCOPE=BOTH; ALTER SYSTEM SET pga_aggregate_target=400M SCOPE=BOTH; ``` #### 使用AMM自动内存管理功能 启用Automatic Memory Management(AMM)可以让操作系统动态分配给Oracle进程所需的工作集,从而更好地平衡可用性和响应时间之间的关系。当启用了此特性之后,就不必手动指定具体的SGA/PGA目标尺寸了——它们会根据当前工作负载的变化自适应调节。 要开启这项服务,请编辑初始化文件(`init.ora`)或SPFILE中的相应条目如下所示: ```properties memory_max_target=<total_memory_size> memory_target=<desired_initial_allocation> ``` 其中 `<total_memory_size>` 表示整个系统的最大允许总量,而 `<desired_initial_allocation>` 则指定了初始期望分配的数量。例如设置成 `memory_max_target=4G memory_target=3G` 就意味着总共可使用的内存量不超过4GB,启动时默认申请3GB作为起始配置。 #### 配置大页机制 利用透明的大页面(Transparent Huge Pages, THP),有助于提高访问效率进而缓解因频繁交换带来的压力。具体做法是在/etc/default/grub 文件里加入 kernel 参数 `transparent_hugepage=madvise` 或者直接关闭THP (`never`) 来防止不必要的开销。 更新GRUB引导加载器后记得执行命令刷新配置使之生效: ```bash sudo grub2-mkconfig -o /boot/grub2/grub.cfg reboot ``` 此外还可以借助操作系统的工具如numactl来进行更精细的过程绑定节点亲缘性设定,进一步改善多核架构下的表现效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值