尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux服务器inode爆满?三步定位并清理日志/缓存文件(附排查脚本)

Linux服务器inode爆满?三步定位并清理日志/缓存文件(附排查脚本) Linux服务器inode爆满三步定位并清理日志/缓存文件附排查脚本当你在Linux服务器上执行文件操作时突然遇到No space left on device的报错但df -h显示磁盘空间充足这种矛盾现象往往意味着inode资源耗尽。作为运维人员遇到这种情况不必慌张本文将带你用三步法快速定位问题根源并提供自动化清理方案。inode是Linux文件系统的核心元数据结构每个文件或目录都会占用一个inode。当大量小文件如日志、缓存积累时即使磁盘空间剩余很多inode耗尽也会导致系统无法创建新文件。这种情况在Web服务器、邮件系统和持续集成的环境中尤为常见。1. 诊断inode使用情况首先确认是否真的是inode耗尽导致的问题。执行以下命令查看各分区的inode使用率df -i典型输出示例Filesystem Inodes IUsed IFree IUse% Mounted on /dev/vda1 2621440 90366 2531074 4% / tmpfs 466667 1 466666 1% /run/user/0重点关注IUse%接近或达到100%的分区。如果发现某个分区inode使用率异常高就需要进一步分析该分区下的文件分布。快速定位高文件数目录for d in /*; do echo $d $(find $d 2/dev/null | wc -l); done | sort -n -k2这个命令会输出根目录下各子目录的文件总数按数量排序。2/dev/null参数用于忽略无权限访问的目录报错。2. 逐层分析文件热点根据上一步的结果锁定文件数异常高的目录后需要深入分析具体是哪些类型的文件占用了大量inode。以下是几种常见场景和对应的分析方法2.1 日志文件堆积Web服务器如Nginx、Apache和应用程序日志是inode消耗大户。检查常见日志目录# 查看/var/log目录大小 du -sh /var/log # 统计各日志文件数量 find /var/log -type f | wc -l2.2 临时缓存文件许多应用程序会产生缓存文件例如包管理器缓存/var/cache/apt/archives/(Debian/Ubuntu)或/var/cache/yum(CentOS/RHEL)Docker缓存/var/lib/docker/overlay2/Composer缓存~/.composer/cache/检查这些目录的文件数量find /var/cache -type f | wc -l2.3 会话和临时文件PHP等应用的会话文件和系统临时文件也可能堆积# PHP会话文件 ls /var/lib/php/sessions | wc -l # 系统临时文件 ls /tmp | wc -l3. 安全清理策略定位到问题目录后清理时需要特别注意避免影响正在运行的服务。以下是几种安全的清理方法3.1 按时间清理旧文件使用find命令清理超过指定天数的文件例如30天# 清理指定目录下30天前的文件 find /path/to/directory -type f -mtime 30 -delete注意先使用-ls代替-delete预览将被删除的文件确认无误后再执行实际删除3.2 按类型清理特定文件针对日志文件可以按扩展名清理# 清理30天前的.log文件 find /var/log -name *.log -mtime 30 -delete3.3 自动化清理脚本将上述步骤整合为一个可复用的排查清理脚本#!/bin/bash # inode_cleaner.sh - 自动排查并清理inode占用 # 1. 检查inode使用情况 echo Inode使用情况 df -i # 2. 分析根目录下各子目录文件数 echo -e \n 目录文件数统计 for d in /*; do [ -d $d ] echo $d $(find $d 2/dev/null | wc -l) done | sort -n -k2 # 3. 交互式清理 read -p 输入要清理的目录路径: target_dir if [ -d $target_dir ]; then echo 即将清理 $target_dir 下30天前的文件 find $target_dir -type f -mtime 30 -ls read -p 确认删除以上文件(y/n) confirm [ $confirm y ] find $target_dir -type f -mtime 30 -delete else echo 目录不存在 fi使用说明将脚本保存为inode_cleaner.sh添加执行权限chmod x inode_cleaner.sh以root身份运行sudo ./inode_cleaner.sh4. 预防inode耗尽的长期方案除了应急清理外更关键的是建立预防机制日志轮转配置配置logrotate定期压缩和删除旧日志示例Nginx日志轮转配置(/etc/logrotate.d/nginx)/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate invoke-rc.d nginx rotate /dev/null 21 endscript }监控告警设置添加inode使用率监控到现有监控系统如Zabbix、Prometheus使用crontab定期检查# 每天检查inode使用率 echo 0 0 * * * df -i | awk \NR1{print $5,$6}\ /var/log/inode_usage.log | sudo tee /etc/cron.d/inode_check应用程序优化为频繁创建小文件的应用配置专用分区考虑使用数据库替代文件系统存储大量小数据在实际运维中我曾遇到一个典型案例一个电商网站在促销活动后突然无法上传新产品图片。检查发现是inode耗尽根源在于未配置日志轮转导致3个月的访问日志积累了数百万个小文件。通过本文的排查方法我们不仅解决了当务之急还建立了日志管理规范避免了问题再次发生。
返回列表