在Linux运维中,内存不足和磁盘IO瓶颈是导致系统卡顿、服务崩溃的两大元凶。本文将带你吃透free、df、iostat三大核心命令,从理论到实操,快速定位并解决内存与磁盘问题。
一、内存分析: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。
排查步骤:
- 查看内存使用情况:
free -h # 查看整体内存
top # 实时查看进程内存占用,按M键按内存排序
- 用top找到内存占用最高的进程(PID和进程名)
- 查看OOM日志定位崩溃进程:
dmesg | grep -i oom # 查看系统OOM日志,grep过滤相关内容
- 针对性解决:
- 程序内存泄漏(如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或升级磁盘。
三、挂载实操:mount + /etc/fstab 自动挂载
磁盘分区需要挂载到目录才能使用。临时挂载重启会失效,必须配置永久挂载。
3.1 mount 命令:临时挂载
语法:
mount [设备路径] [挂载目录]
案例:挂载/dev/vdb1到/data目录
- 查看磁盘设备:
lsblk # 查看所有磁盘设备,输出清晰,新手首选
- 创建挂载目录:
mkdir -p /data # -p参数:如果目录不存在,自动创建
- 临时挂载:
mount /dev/vdb1 /data
- 验证:
df -h # 查看挂载情况,若能看到/dev/vdb1挂载在/data目录,说明挂载成功
⚠️ 重启后挂载失效,核心业务目录不要用临时挂载!
3.2 /etc/fstab 配置:永久挂载
修改 /etc/fstab 文件,系统重启自动挂载。
配置步骤:
- 查看设备UUID(推荐用UUID,比设备路径更稳定):
blkid /dev/vdb1
输出类似 /dev/vdb1: UUID="12345678-1234-1234-1234-1234567890ab" TYPE="ext4",复制UUID。
- 编辑/etc/fstab:
vim /etc/fstab
- 添加配置行:
UUID=12345678-1234-1234-1234-1234567890ab /data ext4 defaults 0 0
字段解析:UUID(设备标识)、挂载目录、文件系统类型(ext4/xfs)、defaults(默认选项)、0(不备份)、0(不检查)。
- 验证配置:
mount -a
- 再次验证挂载:
df -h # 确认/dev/vdb1已挂载到/data目录
避坑提醒:
- 配置前先用
mount -a验证,避免重启后无法启动 - 不要删除原有配置
- 卸载时先删除fstab配置,再执行
umount /data
总结
本文覆盖Linux内存与磁盘IO三大核心模块:free -h 分析内存与OOM排查,df/du/iostat 定位磁盘空间与IO瓶颈,mount + /etc/fstab 实现永久挂载。所有命令均为运维高频用法,建议收藏,遇到卡顿问题直接对照排查。
浙公网安备 33010602011771号