1. 问题现象与初步判断
那天凌晨2点,我正赶一个紧急项目,突然发现Coco Server服务无法启动。系统日志里赫然出现"kernel panic"报错,紧接着是一串VFS无法挂载根文件系统的错误信息。作为运维老兵,我立刻意识到这很可能与存储空间有关——毕竟在Linux系统中,磁盘空间耗尽引发的连锁反应远比Windows系统来得更猛烈。
快速执行df -h命令后,发现根分区使用率显示100%。但奇怪的是,按照日常数据量估算,不应该这么快就耗尽空间。这里有个细节值得注意:当Linux系统磁盘使用率达到95%以上时,某些服务会出现异常行为,而达到100%时,连基本命令都可能无法执行。这就是为什么Coco Server直接panic而不是优雅退出。
2. 深度空间分析与定位
2.1 精准查找大文件
常规的du -sh *在根目录下执行效果不佳,改用更专业的排查命令组合:
# 按文件大小降序显示前20名 find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -n 20 # 特殊处理可能被删除但仍占空间的文件 lsof -nP | grep '(deleted)'通过这个组合拳,发现/var/log目录下的kafka日志文件单个就达到80GB——原来最近调试时忘记关闭debug日志级别。这里有个血泪教训:所有日志组件必须配置滚动策略和自动清理,特别是调试结束后一定要记得调整日志级别。
2.2 隐藏的空间杀手
除了显性的大文件,还需要检查这些容易被忽视的空间占用源:
- Docker的overlay2存储(
docker system df -v) - 未清理的yum/rpm缓存(
/var/cache/yum) - 系统自动生成的core dump文件
- 陈旧的系统快照(
snapper list)
在我的案例中,还发现残留的Docker镜像占用了12GB空间。建议将docker的data-root配置到独立分区,避免污染根分区。
3. 应急处理与空间释放
3.1 立即释放空间的操作
当磁盘完全写满时,很多命令会报"No space left"错误。此时需要先用这些技巧腾出基本操作空间:
# 清空系统消息日志(先备份) cat /dev/null > /var/log/messages # 删除所有已停止的容器 docker container prune -f # 清理yum缓存 yum clean all --enablerepo='*'重要提示:不要直接rm大文件!当磁盘满时,删除操作可能无法立即释放inode。更安全的做法是用
truncate -s 0 filename先清空内容。
3.2 长期空间管理方案
建立系统化的空间监控体系:
- 配置prometheus+alertmanager监控各分区使用率
- 为/var/log等重要目录设置独立分区
- 编写定期清理脚本(示例):
#!/bin/bash # 清理30天前的日志 find /var/log -type f -name "*.log" -mtime +30 -delete # 清理临时文件 rm -rf /tmp/*4. Coco Server的恢复策略
4.1 服务启动异常排查
清出空间后,Coco Server仍启动失败。通过journalctl发现其依赖的某个PID文件被残留:
# 检查服务状态 systemctl status coco-server.service -l # 手动清理残留进程 ps -ef | grep coco-server | awk '{print $2}' | xargs kill -9 rm -f /var/run/coco-server.pid4.2 预防性配置调整
修改Coco Server的systemd单元文件,增加以下关键参数:
[Service] Restart=on-failure RestartSec=5s StartLimitInterval=100s MemoryLimit=1G5. 进阶排查工具与技巧
5.1 磁盘健康检查
空间问题解决后,建议对硬盘做全面检测:
# 查看SMART状态 smartctl -a /dev/sda # 检查文件系统错误 fsck -y /dev/sda15.2 性能监控方案
部署以下工具建立长期监控:
- iotop:实时磁盘IO监控
- ncdu:交互式磁盘使用分析
- vmstat 1:系统资源概览
6. 架构层面的改进建议
- 日志收集方案改用ELK或Loki,避免本地存储
- 关键服务配置资源限制(cgroups)
- 为容器化服务设置存储驱动为zfs或btrfs
- 建立自动化空间预警机制(比如通过Telegraf采集)
这次事故让我深刻体会到:存储空间管理不是简单的"磁盘满了就删文件",而是需要从应用设计、监控预警、应急处理多个维度建立完整体系。特别是对于像Coco Server这类有状态服务,更要考虑:
- 日志轮转策略(logrotate配置示例)
- 临时文件清理机制
- 核心转储文件管理
- 容器存储隔离方案
最后分享一个救命技巧:在/etc/fstab中添加tmpfs /tmp tmpfs defaults,size=1G 0 0,将/tmp挂载为内存文件系统,至少能保证系统在磁盘满时仍有基本操作空间。