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

服务器内存使用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.xdnf.cn/news/18442.html

相关文章:

  • 单片机驱动继电器接口
  • 图论Day6学习心得
  • 动态规划----8.乘积最大子数组
  • 从“怀疑作弊”到“实锤取证”:在线面试智能监考重塑招聘公信力
  • CMake1:概述
  • 通过自动化本地计算磁盘与块存储卷加密保护数据安全
  • 前端-JavaScript笔记(核心语法)
  • CentOS 系统 Java 开发测试环境搭建手册
  • C/C++嵌入式笔试核心考点精解
  • Kafka如何保证「消息不丢失」,「顺序传输」,「不重复消费」,以及为什么会发生重平衡(reblanace)
  • SpringWeb详解
  • Java FTPClient详解:高效文件传输指南
  • CSS3DRenderer+ CSS3DObject实现在 Three.js 中添加文本内容
  • Preprocessing Model in MPC 2 - 背景、基础原语和Beaver三元组
  • Java 学习笔记(基础篇6)
  • 分布式唯一 ID 生成方案
  • leetcode 3 无重复字符的最长子串
  • 将集合拆分成若干个batch,并将batch存于新的集合
  • C语言第十章内存函数
  • C语言:第18天笔记
  • 【自记】Power BI 中 ALLNOBLANKROW的适用场景举例
  • 疏老师-python训练营-day51复习日+退款开始
  • 计算机网络技术学习-day4《路由器配置》
  • SQL 中大于小于号的表示方法总结
  • 微软宣布开源大模型gpt-oss在Azure平台实现性能突破
  • Git 新手完全指南(二):在vscode中使用git
  • 官网SSO登录系统的企业架构设计全过程
  • UNet改进(33):基于CBAM原理与PyTorch实战指南
  • Ubuntu 上安装 MongoDB
  • Hyperledger Fabric官方中文教程-改进笔记(十三)-使用测试网络创建通道