linux服务器磁盘满的排查与处理及预防措施
摘要: 当服务器磁盘使用率达100%时,会导致服务异常(日志写入失败、程序崩溃等)。处理流程: 排查原因: 使用df -h定位满的分区,du -sh逐层分析大目录(如/var/log)。 检查大文件(find / -size +1G)、已删除但被占用的文件(lsof | grep deleted)。 清理释放: 删除临时文件、旧日志(> file.log截断),迁移大文件至其他存储。 重启占
当服务器磁盘容量满了(磁盘使用率 100%),可能导致服务异常(如无法写入日志、无法创建文件、程序崩溃等)。排查和处理需遵循 “先定位原因,再安全处理” 的原则,以下是详细流程:
一、排查:定位磁盘满的原因
1. 查看整体磁盘使用情况
首先确认哪个分区满了,使用 df 命令查看各分区使用率:
|
df -h # 以人类可读的单位(G/M)显示分区使用情况 |
输出示例(关注 Use% 列,找到使用率 100% 的分区,如 /dev/sda1):
|
Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 50G 0G 100% / tmpfs 3.9G 0 3.9G 0% /dev/shm |
2. 定位占用空间的大目录
针对满的分区(如根目录 /),逐步定位占用空间的目录。使用 du 命令从顶层目录向下排查:
查看根目录下各子目录的大小(需 root 权限,避免权限不足):
|
du -sh /* 2>/dev/null # 忽略错误输出,显示根目录下各目录的总大小(-s汇总,-h人类可读) |
输出中数值较大的目录(如 /var、/home、/data)是重点排查对象。
进入大目录,继续深入排查(以 /var 为例):
|
cd /var du -sh * 2>/dev/null # 查看/var下各子目录大小 |
常见大目录:/var/log(日志)、/var/lib(数据库 / 缓存)、/tmp(临时文件)等。
3. 定位大文件或冗余文件
找到大目录后,进一步定位具体的大文件(通常是占用空间的 “元凶”):
查找单个分区内大于 1G 的文件(以根分区 / 为例):
|
find / -type f -size +1G 2>/dev/null # 忽略错误,查找所有大于1G的文件 |
按大小排序显示前 20 个大文件:
|
find / -type f -size +100M 2>/dev/null -exec du -sh {} \; | sort -rh | head -n 20 |
4. 检查特殊情况
已删除但进程仍占用的文件:有时文件被删除,但进程仍在写入(如日志文件),磁盘空间不会释放。需用 lsof 查看:
|
lsof | grep deleted # 查找已删除但被进程占用的文件 |
输出中会显示占用文件的进程 ID(PID),重启对应进程即可释放空间。
分区挂载问题:如果某目录下挂载了新分区,但挂载前该目录已有文件,挂载后原文件会被隐藏,导致 “实际占用空间但看不到”。可先卸载分区(如 umount /mnt),再检查原目录大小。
日志 / 缓存堆积:应用程序(如 Nginx、MySQL)的日志未轮转,或缓存文件(如 /var/cache)未清理,可能持续占用空间。
二、处理:根据原因清理或释放空间
1. 清理无用文件(优先安全操作)
临时文件:/tmp 目录下的文件通常可删除(注意:不要删除正在使用的临时文件,可删除几天前的旧文件):
|
find /tmp -type f -mtime +7 -delete # 删除7天前的临时文件 |
旧日志文件:/var/log 下的旧日志(如 .gz 压缩的历史日志)若无需保留,可直接删除;正在写入的日志(如 messages、nginx/access.log)不可直接删除,需截断(保留文件但清空内容):
|
> /var/log/nginx/access.log # 截断日志文件(安全,不影响进程写入) |
建议后续配置日志轮转(如 logrotate),自动压缩 / 删除旧日志。
冗余备份 / 安装包:/backup、/var/cache/apt/archives(Debian/Ubuntu)或 /var/cache/yum(CentOS)中的旧备份、安装包,确认无用后删除:
|
rm -f /var/cache/apt/archives/*.deb # 清理旧deb包 |
2. 归档或迁移大文件
对于有用但暂时不用的大文件(如历史备份、旧数据),可迁移到其他存储(如外接硬盘、NAS):
|
# 示例:将大文件迁移到外接硬盘(假设挂载在/mnt/ext_disk) mv /data/old_backup.tar.gz /mnt/ext_disk/ |
3. 释放被占用的文件
若排查到 “已删除但进程占用” 的文件,重启对应进程释放空间(需确认进程重启无风险):
|
# 假设lsof显示PID 1234占用了已删除的文件 kill -HUP 1234 # 平滑重启(如Nginx/Apache),或 kill -9 1234(强制终止,谨慎使用) |
4. 调整配置(长期优化)
日志轮转:配置 logrotate 自动轮转日志(如每天 / 每周压缩、保留 30 天),避免日志无限增长。
清理缓存:部分应用的缓存(如 PHP opcode 缓存、浏览器缓存)可手动清理:
|
# 示例:清理系统页缓存(临时释放空间,不影响数据) sync && echo 3 > /proc/sys/vm/drop_caches |
扩容分区:若磁盘本身容量不足,可通过增加硬盘、扩容分区(如 LVM 逻辑卷)解决(需谨慎操作,建议先备份数据)。
三、预防:避免再次满盘
监控磁盘空间:用 df -h 结合监控工具(如 Prometheus + Grafana),设置阈值告警(如使用率 > 85% 时报警)。
定时清理脚本:通过 crontab 设置计划任务,定期清理临时文件、旧日志(如每天凌晨执行)。
规范文件存储:明确大文件(如备份、视频)的存储路径,避免随意存放在系统分区。
注意事项
操作前备份重要文件,避免误删系统关键文件(如 /bin、/lib 下的文件)。
不要直接删除正在写入的文件(如数据库文件、运行中的日志),可能导致应用异常。
若涉及系统分区(如 /),清理时优先保留 bin、etc、lib 等系统目录,避免破坏系统运行。
通过以上步骤,可逐步定位并解决服务器磁盘满的问题,同时建立长期管理机制预防复发。
遇到权限问题无法清空日志文件:
使用 truncate 命令(无需直接写入文件)
truncate 命令可直接将文件大小设置为 0,适用于权限受限的场景:
清空文件(需 root 权限)
truncate -s 0 /app/xxl-job-admin-1.8.2/logs/xxl-job-admin.log
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)