服务器磁盘告警处理全攻略:从df -h到du、find、ncdu的完整排查流程
在Linux服务器运维过程中,磁盘空间告警是最常见的问题之一。当磁盘使用率达到阈值时,系统性能会明显下降,甚至导致服务不可用。本文将介绍一套完整的磁盘告警排查流程,从基础的df -h命令开始,逐步深入到du、find和ncdu等工具的使用,帮助运维人员快速定位并解决磁盘空间不足的问题。
一、磁盘告警的初步诊断:df -h命令
当收到磁盘告警通知时,第一步是使用df -h命令查看文件系统的整体使用情况。该命令以人类可读的格式显示各个挂载点的磁盘空间使用情况。
df -h
输出示例:
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 100G 95G 5G 95% /
tmpfs 7.8G 1.2G 6.6G 16% /dev/shm
/dev/sdb1 500G 300G 200G 60% /data
重点关注已用百分比接近或超过90%的挂载点。在上面的示例中,根分区/的使用率已经达到95%,需要立即处理。如果发现某个挂载点空间不足,可以进一步使用df -i检查inode使用情况,因为inode耗尽也会导致磁盘告警。
df -i
二、定位大文件目录:du命令的使用
确定需要清理的挂载点后,使用du命令查看该目录下各个子目录的空间占用情况。推荐使用以下命令组合:
du -sh /var/* | sort -rh | head -20
该命令会列出/var目录下所有子目录的总大小,并按从大到小排序,显示前20个。这样可以快速定位占用空间最大的目录。
如果需要更详细的层级信息,可以使用:
du -h --max-depth=2 /var | sort -rh | head -30
对于日志文件较多的目录,如/var/log,可以单独查看:
du -sh /var/log/* | sort -rh | head -10
三、查找特定大文件:find命令实战
当目录层级较深时,使用find命令直接查找超过指定大小的文件会更高效。以下是一些常用的find命令示例:
查找大于100MB的文件:
find / -type f -size +100M -exec ls -lh {} ;
查找最近7天内修改过的大文件:
find /data -type f -size +50M -mtime -7 -exec ls -lh {} ;
查找并删除超过30天的日志文件(谨慎操作):
find /var/log -type f -name "*.log" -mtime +30 -exec rm -f {} ;
查找空文件或空目录:
find /data -type f -empty -delete
find /data -type d -empty -delete
注意:使用-exec rm删除文件前,务必先使用不带-delete的find命令确认文件列表,避免误删重要数据。
四、交互式磁盘分析工具:ncdu
对于需要交互式浏览磁盘占用情况的场景,ncdu(NCurses Disk Usage)是一个非常实用的工具。它提供了类似图形界面的交互式界面,可以方便地浏览目录树和文件大小。
安装ncdu:
# Debian/Ubuntu
apt-get install ncdu
# CentOS/RHEL
yum install ncdu
# 使用包管理器直接安装
# 也可以从源码编译安装
使用ncdu扫描目录:
ncdu /
在ncdu界面中,可以使用方向键浏览目录,按d键删除选中的文件或目录,按q键退出。ncdu还支持导出扫描结果:
ncdu -o /tmp/disk_usage.json /
# 之后可以离线查看
ncdu -f /tmp/disk_usage.json
五、清理常见占用空间的文件类型
在定位到占用空间较大的文件后,通常需要清理以下几类文件:
1. 系统日志文件
系统日志通常位于/var/log目录下,包括syslog、messages、auth.log等。可以使用logrotate工具进行日志轮转,或者手动清理:
cat /dev/null > /var/log/syslog
cat /dev/null > /var/log/messages
注意:不要直接删除日志文件,而应使用cat /dev/null >方式清空,否则可能导致进程无法写入日志。
2. 软件包缓存
包管理器会缓存下载的软件包,占用大量空间:
# apt (Debian/Ubuntu)
apt-get clean
# yum (CentOS/RHEL)
yum clean all
# dnf (Fedora)
dnf clean all
3. 临时文件
/tmp目录下的临时文件可以定期清理:
find /tmp -type f -atime +7 -delete
4. 核心转储文件
程序崩溃产生的core dump文件可能非常大,可以查找并删除:
find / -type f -name "core.*" -size +100M -exec ls -lh {} ;
六、预防措施与监控建议
为了避免磁盘告警频繁发生,建议采取以下预防措施:
- 配置日志轮转策略,定期压缩和清理日志文件
- 设置磁盘空间监控告警,在达到80%使用率时提前通知
- 定期使用
ncdu或du命令检查磁盘空间使用趋势 - 对于大文件,考虑使用
rsync或scp迁移到其他存储设备 - 使用
cron定时任务自动清理临时文件
示例cron任务,每天凌晨2点清理7天前的临时文件:
0 2 * * * find /tmp -type f -atime +7 -delete
七、总结
磁盘告警处理是Linux运维的基本技能。通过df -h快速定位问题分区,使用du和find查找大文件,配合ncdu进行交互式分析,可以高效地解决磁盘空间不足的问题。同时,建立完善的监控和预防机制,能够减少磁盘告警的发生频率,保障服务器稳定运行。
FAQ
Q1: df -h显示磁盘已满,但du统计的总大小远小于磁盘容量,为什么?
这种情况通常是因为有进程正在写入已删除的文件。文件被删除后,如果仍有进程持有文件句柄,空间不会立即释放。可以使用lsof | grep deleted命令查找此类进程,重启相关进程或服务即可释放空间。
Q2: 如何查找并清理Docker容器产生的磁盘占用?
Docker容器日志和镜像可能占用大量空间。可以使用docker system df查看占用情况,使用docker system prune清理悬空镜像和停止的容器。日志文件通常位于/var/lib/docker/containers/目录下,可以设置日志轮转或限制日志大小。
Q3: ncdu扫描大目录时速度很慢,有什么优化方法?
可以排除不需要扫描的目录,例如:ncdu / --exclude /proc --exclude /sys --exclude /dev。另外,首次扫描后可以使用ncdu -o导出结果,后续使用ncdu -f加载,避免重复扫描。
Q4: 清理磁盘空间后,如何确认空间是否真正释放?
重新运行df -h查看对应挂载点的已用空间是否下降。如果空间没有释放,检查是否有进程仍占用已删除的文件,使用lsof | grep deleted查找并处理。
