在Linux运维中,内存不足和磁盘IO瓶颈是导致系统卡顿、服务崩溃的两大元凶。本文将带你吃透freedfiostat三大核心命令,从理论到实操,快速定位并解决内存与磁盘问题。

一、内存分析:free -h详解与OOM排查

内存是服务器的“临时仓库”,程序运行全靠它。当内存不足时,系统会触发OOM(Out of Memory)机制,强制杀死进程。掌握free命令是排查内存问题的第一步。

1.1 free -h 命令详解

在终端输入以下命令,查看内存使用情况:

free -h

其中 -h 参数表示以人类易读的单位(KB/MB/GB)显示。输出结果如下:

              total        used        free      shared  buff/cache   available
Mem:           15Gi       2.3Gi        10Gi       152Mi       2.7Gi        12Gi
Swap:         19Gi          0B        19Gi

各列含义:

  • total:物理内存总大小(15Gi)
  • used:已使用内存(2.3Gi),包括程序内核占用
  • free:完全空闲的内存(10Gi)
  • shared:共享内存(152Mi)
  • buff/cache:缓冲区+缓存(2.7Gi),重点解析见下文
  • available:真正可用内存(12Gi)= free + buff/cache可回收部分

⚠️ 新手误区:不要把“free”当成可用内存!真正能启动新程序的是“available”,因为buff/cache可被系统回收。

1.2 Buffer 与 Cache 的区别

一句话分清:Buffer 面向“写入”,Cache 面向“读取”

Buffer 是“临时存放要写入磁盘的数据”,Cache 是“临时存放从磁盘读取的数据”。

  • Buffer:写数据时,先暂存到Buffer,再批量写入磁盘(减少IO次数)
  • Cache:读数据时,将磁盘数据缓存到内存,下次直接读取(加速访问)

即使buff/cache占用很高,也无需担心,系统会在内存不足时自动回收。

1.3 OOM 现象与排查步骤

OOM(Out of Memory)是程序因申请不到内存被系统强制杀死,常见现象:程序突然退出、日志出现“Out of memory: Kill process”、top命令显示used接近total。

排查步骤

  1. 查看内存使用情况:
free -h  # 查看整体内存
top      # 实时查看进程内存占用,按M键按内存排序
  1. 用top找到内存占用最高的进程(PID和进程名)
  2. 查看OOM日志定位崩溃进程:
dmesg | grep -i oom  # 查看系统OOM日志,grep过滤相关内容
  1. 针对性解决:
    • 程序内存泄漏(如Java/Python)——修复代码或重启
    • 物理内存不足——升级内存或配置Swap
    • 异常进程——kill -9 杀掉并排查原因

二、磁盘IO分析:df、du、iostat 命令实操

磁盘是“永久仓库”,IO读写慢会导致程序加载缓慢、数据库延迟。三个命令覆盖空间查看、目录统计、IO瓶颈排查。

2.1 df -h:查看磁盘空间

当服务器提示“磁盘空间不足”时,首先使用:

df -h

输出示例:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40Gi   12Gi   26Gi  32% /
/dev/vdb1       100Gi   45Gi   50Gi  48% /data
tmpfs           7.5Gi     0  7.5Gi   0% /dev/shm

重点关注 Use% 列,超过90%就需要清理日志或临时文件。

2.2 du -sh:定位磁盘占用“元凶”

df只能看分区总览,du能精确到目录/文件大小。

核心命令

  • 统计当前目录总大小:
du -sh

输出类似 12Gi .

  • 统计指定目录:
du -sh /data
  • 按大小排序,找出最大目录:
du -sh * | sort -rh

其中 du -sh * 统计子目录,sort -rh 按大小逆序排列。

实用场景:发现/data分区使用率90%,用以下命令快速定位:

cd /data  # 进入/data分区
du -sh * | sort -rh  # 查看所有子目录大小,排序后找到最大的目录

如果发现 /data/logs 目录占用60Gi,进入后清理日志。 清理日志时不要直接删除正在写入的文件,用 echo "" > 日志文件名 清空内容。

2.3 iostat:排查磁盘IO瓶颈

磁盘空间充足但系统卡顿,可能是IO瓶颈。iostat能实时查看IO使用情况。

安装与使用

# CentOS/RHEL系统
yum install -y sysstat
# Ubuntu/Debian系统
apt-get install -y sysstat
iostat -x 1 3

参数说明:-x 显示详细统计,1 每秒刷新,3 刷新3次。

核心指标

  • %util:磁盘IO使用率,≤70%正常,≥80%表示瓶颈
  • rMB/s、wMB/s:读写速度,结合业务判断
  • await:IO请求等待时间,≤50ms正常,≥100ms表示响应慢

排查思路:如果%util≥80%且await≥100ms,用 iotop 找到IO占用最高的进程,针对性优化SQL或升级磁盘。

[AFFILIATE_SLOT_1]

三、挂载实操:mount + /etc/fstab 自动挂载

磁盘分区需要挂载到目录才能使用。临时挂载重启会失效,必须配置永久挂载。

3.1 mount 命令:临时挂载

语法

mount [设备路径] [挂载目录]

案例:挂载/dev/vdb1到/data目录

  1. 查看磁盘设备:
lsblk  # 查看所有磁盘设备,输出清晰,新手首选
  1. 创建挂载目录:
mkdir -p /data  # -p参数:如果目录不存在,自动创建
  1. 临时挂载:
mount /dev/vdb1 /data
  1. 验证:
df -h  # 查看挂载情况,若能看到/dev/vdb1挂载在/data目录,说明挂载成功

⚠️ 重启后挂载失效,核心业务目录不要用临时挂载!

3.2 /etc/fstab 配置:永久挂载

修改 /etc/fstab 文件,系统重启自动挂载。

配置步骤

  1. 查看设备UUID(推荐用UUID,比设备路径更稳定):
blkid /dev/vdb1

输出类似 /dev/vdb1: UUID="12345678-1234-1234-1234-1234567890ab" TYPE="ext4",复制UUID。

  1. 编辑/etc/fstab:
vim /etc/fstab
  1. 添加配置行:
UUID=12345678-1234-1234-1234-1234567890ab  /data  ext4  defaults  0  0

字段解析:UUID(设备标识)、挂载目录、文件系统类型(ext4/xfs)、defaults(默认选项)、0(不备份)、0(不检查)。

  1. 验证配置:
mount -a
  1. 再次验证挂载:
df -h  # 确认/dev/vdb1已挂载到/data目录

避坑提醒

  • 配置前先用 mount -a 验证,避免重启后无法启动
  • 不要删除原有配置
  • 卸载时先删除fstab配置,再执行 umount /data
[AFFILIATE_SLOT_2]

总结

本文覆盖Linux内存与磁盘IO三大核心模块:free -h 分析内存与OOM排查,df/du/iostat 定位磁盘空间与IO瓶颈,mount + /etc/fstab 实现永久挂载。所有命令均为运维高频用法,建议收藏,遇到卡顿问题直接对照排查。