当前位置: 首页 > news >正文

服务器内存使用buff/cache的原理

在 Linux 系统中,内存管理机制高度优化,会根据资源需求动态分配内存。内存中的 buffers(缓冲区)cached(缓存) 是系统的核心优化手段,目的是最大限度利用内存提升性能。以下是详细机制解析:

一、内存类别定义

通过 free -hcat /proc/meminfo 查看内存时,内存被分为以下类别:

内存类别用途优先级
Used应用程序(如 MySQL、Redis)实际使用的内存最高
Free完全未被使用的内存(通常很少,系统会尽量避免空闲内存浪费)最低
Buffers临时存储待写入磁盘的块数据(如未落盘的 I/O 操作)中等
Cached缓存从磁盘读取的文件内容,加速后续访问(包括程序二进制文件、库文件、常用数据)中等
Available系统可用内存(包括可立即回收的 buff/cache-

二、buffers 和 cached 的作用机制

1. Buffers(缓冲区)
  • 设计目标:优化磁盘写入性能
  • 运作逻辑
    • 当进程向磁盘写入数据时,数据先暂存到 buffers,待磁盘空闲时批量写入。
    • 若多次写入同一磁盘块,buffers 会合并多次操作,减少磁盘 I/O 次数。
  • 典型场景
    • 数据库(如 MySQL)的日志(binlog/redo log)写入磁盘前的临时存储。
    • 文件系统元数据(如 ext4 的 Journal)的更新操作。
2. Cached(缓存)
  • 设计目标:优化文件读取性能
  • 运作逻辑
    • 从磁盘读取文件时,文件内容存入 cached,后续访问直接从内存读取。
    • 系统会优先缓存高频访问文件(如二进制程序、配置文件、数据库热点数据)。
  • 典型场景
    • Redis 频繁读取的 RDB/AOF 文件。
    • MySQL 的 InnoDB 表数据文件的重复访问。
    • Nginx/Apache 服务的静态文件(HTML/JS/CSS)。

三、内存回收机制

Linux 内核通过 LRU(最近最少使用)算法 动态管理内存分配:

  1. 内存充足时
    buff/cache 尽可能占用更多内存,最大化 I/O 性能。
  2. 应用程序需要内存时
    内核按优先级回收内存:
    • 直接释放 cached 中低频使用的缓存文件。
    • 回写并释放 buffers 中的未写入磁盘数据。
    • 若仍不足,触发 OOM Killer 终止占用内存最多的进程(极端情况)。

四、为什么不需要手动清理 buff/cache

  1. 性能敏感
    主动清理(如 echo 3 > /proc/sys/vm/drop_caches)会强制丢弃缓存的磁盘数据,导致后续磁盘 I/O 骤增。
  2. 自动优化
    系统已优先保证应用程序的内存需求。例如:
                 total        used        free      shared  buff/cache   available
    Mem:           15Gi       2.0Gi       886Mi       161Mi        12Gi        13Gi
    Swap:         2.0Gi       202Mi       1.8Gi
    • 关键指标是 available:表示应用程序可用的内存总量(含可回收缓存),远大于实际 used 内存,无需干预。

五、何时需要关注内存问题?

关注以下场景而非 buff/cache

  1. Swap 使用率高(超过总量 10%):
    使用 vmstat 1 监控 si(Swap In)、so(Swap Out)值,频繁 Swap 表示物理内存不足。
  2. OOM Killer 触发
    检查 dmesg | grep -i oom,若频繁杀死进程需扩容内存。
  3. 应用程序内存泄漏
    如 MySQL 的 InnoDB_buffer_pool 配置过大或 Redis 未设置 maxmemory

六、总结

  • buff/cache 是 Linux 内存利用率最大化的设计,无需手动清理。
  • 关注 available 和 Swap 使用率 作为内存健康指标。
  • 内存优化的核心是 合理配置应用程序(如 MySQL 的 innodb_buffer_pool_size),而非调整系统缓存机制。
http://www.lryc.cn/news/626426.html

相关文章:

  • k8s笔记01
  • 自建开发工具IDE(一)之拖找排版—仙盟创梦IDE
  • 跨域问题解决方法
  • 三分钟速通SSH登录
  • IDEA:控制台中文乱码
  • IDEA切换分支时,提示:Git Checkout Problem
  • 用通俗易懂的语言解释前后端分离和不分离的区别及其优缺点
  • 【Java】深入浅出Spring中的@Autowired:自动注入的奥秘
  • 【数据结构】直接选择排序
  • 九、Java类核心语法:构造器、this、封装与static详解
  • rsync 工具
  • Linux 文本处理三剑客:awk、grep、sed 完全指南
  • Redis 安装教程
  • Linux的i节点(inode) 和 数据块(Block)相关操作详解
  • 中小型企业是否需要使用高防服务器
  • 服务器硬件电路设计之 SPI 问答(三):SPI 信号完整性守护与时钟频率的硬件设计羁绊
  • 阿里云ECS服务器的公网IP地址
  • 服务器硬件电路设计之 SPI 问答(一):解密 SPI—— 从定义到核心特性
  • 对称加密算法
  • TDengine IDMP 运维指南(数据导入导出)
  • AI大模型×政务热线:数造科技打造企业动态画像的“实时监测引擎”
  • 【自记】Power BI 中 DISTINCT 和 ALLNOBLANKROW 的区别说明
  • Java:将视频上传到腾讯云并通过腾讯云点播播放
  • 通过uniapp将vite vue3项目打包为android系统的.apk包,并实现可自动升级功能
  • 【考研408数据结构-04】 栈与队列:受限的线性表
  • CentOS7.9中安装Harbor以及配置https
  • 【Linux】系统部分——磁盘存储结构与文件系统
  • 初试Docker Desktop工具
  • 如何能成功在centos7下安装nodejs18+以上版本
  • TDengine IDMP 运维指南(5. 使用 Helm 部署)