标签搜索

free命令详解

mrui
2025-09-13 / 0 评论 / 9 阅读 / 正在检测是否收录...

执行free -h命令时,通常会看到这样的输出
mh1ol9lx.png
其中:

  • total是总内存,这个最直观
  • used包括了应用程序和缓存使用的内存
  • free是完全空闲的内存,通常很小
  • buff/cache是可以释放的缓存内存
  • available是真正可用的内存,这个最重要
  • shared是共享内存,通常不用太关注

total:系统总内存

total就是系统的总物理内存大小,比如8G内存条,这里显示的就是8G(会扣掉一些被内核占用的部分)。

used:已使用内存

used包括了:

  • 应用程序实际使用的内存
  • 内核使用的内存
  • 缓冲区和缓存使用的内存

有时看到used很高,不代表应用程序真的用了那么多内存。很可能是Linux把大量内存用作了文件缓存。

具体查看内存使用情况
  1. /proc/meminfo看详细分解

    cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable|Buffers|Cached|SReclaimable)"

    mh1osfnv.png

  • Buffers就是缓冲区使用的内存
  • Cached就是页面缓存使用的内存
  • SReclaimable是可回收的内核数据结构
  • 把这几个加起来,基本就是free命令里buff/cache那一列的值。

如果Cached特别大,说明系统缓存了很多文件;如果Buffers很大,可能是有大量的磁盘IO操作。

  1. ps命令查看进程内存使用

    # 按内存使用量排序显示进程
    ps aux --sort=-%mem | head -10
    
    # 或者用这个更直观的格式
    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -10
    
    # 某个应用的总内存使用,比如统计所有java进程的内存使用
    ps aux | grep java | awk '{sum+=\$6} END {print "Total memory: " sum/1024 " MB"}'

    mh1ovf6i.png

free:真正空闲的内存

free显示的是完全没有被使用的内存。注意,这里不包括被用作缓冲区和缓存的内存,因为这些内存在需要的时候是可以立即释放给应用程序使用的。

如果经常看到free的值很小,这是正常现象。Linux的设计哲学就是"空闲的内存是浪费的内存",系统会尽可能地把空闲内存用作文件缓存,提高系统性能。

shared:共享内存

shared显示的是被多个进程共享的内存大小。这部分内存主要包括:

  • 共享内存段(System V shared memory)
  • tmpfs文件系统使用的内存
  • 一些其他的共享内存区域

在日常运维中,一般特别关注这个数值。除非某个应用大量使用了共享内存,否则这个值通常不会很大。

比如一些使用Redis的系统,如果Redis配置了大量的共享内存,这个值会比较高。但大多数情况下,这个数字都不是重点关注对象。

buff/cache:缓冲区和缓存

这个是Linux内存管理的精髓所在。buff/cache包括:

  • 缓冲区(buffers):用于缓存磁盘块设备的数据
  • 页面缓存(page cache):用于缓存文件内容

Linux会把空闲内存用作文件缓存,这样当程序再次读取相同文件时,就可以直接从内存中获取,而不需要再次访问磁盘。这大大提高了系统的IO性能。

关键是,这部分内存在应用程序需要时可以立即释放。所以虽然它们被标记为"已使用",但实际上是可用的。

buff/cache的调整和优化
  1. 手动清理缓存(谨慎使用)
    注意:生产环境别随便清理,会影响性能。

    # 清理页面缓存
    echo 1 > /proc/sys/vm/drop_caches
    
    # 清理所有缓存
    sync && echo 3 > /proc/sys/vm/drop_caches
  2. 调整缓存策略

    控制swap使用倾向

    # 查看当前值
    cat /proc/sys/vm/swappiness
    
    # 调整为10(让系统优先回收缓存而不是使用swap)
    echo "vm.swappiness = 10" >> /etc/sysctl.conf

    控制缓存回收压力

    # 调整目录和inode缓存回收
    echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf
  3. 不同场景的优化建议

数据库服务器

vm.swappiness = 1
vm.vfs_cache_pressure = 150

文件服务器

vm.swappiness = 10  
vm.vfs_cache_pressure = 50

调整完要用sysctl -p生效,然后观察系统表现。大多数情况下默认设置就够用了,没事别瞎调。

available:真正可用的内存

这个是最重要的指标!available显示的是应用程序可以使用的内存总量,包括:

  • free的内存
  • 可以立即释放的buff/cache内存
  • 一些其他可回收的内存
  • 简单来说,available = free + 可回收的buff/cache

这个数值才是真正需要关注的。只有当available很低的时候,才说明系统内存真的不够用了。判断系统内存是否充足,主要就看这个available值。只要它保持在一个合理的水平,就不用担心内存问题。

0

评论 (0)

取消