拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux磁盘空间不足排查与Zabbix磁盘监控实战

一、前言在Linux服务器运维过程中磁盘空间不足是一种非常常见的故障。当服务器磁盘使用率过高时可能会出现以下问题日志无法正常写入MySQL数据库异常Nginx、Tomcat等服务运行异常程序无法创建临时文件Docker无法正常运行Kubernetes组件出现异常严重时可能导致业务服务不可用因此在Linux运维中需要掌握一套完整的磁盘排查方法。本文通过实际服务器环境演示Linux磁盘空间不足的排查过程并使用Zabbix实现磁盘使用率监控和告警。本文主要涉及以下命令df du sort head find rm同时使用Zabbix实现磁盘监控 磁盘告警 故障模拟 Problem状态 故障恢复 Resolved状态二、df命令查看磁盘使用情况当发现服务器运行异常怀疑磁盘空间不足时首先使用df -hdf用于查看文件系统的磁盘空间使用情况。-h表示使用人类容易阅读的单位例如MB、GB。执行df -h可能看到Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 9.2G 29G 25% /各字段含义如下字段含义Filesystem文件系统Size总容量Used已使用空间Avail可用空间Use%使用率Mounted on挂载点例如/dev/vda1 40G 9.2G 29G 25% /表示根分区总容量为40GB目前使用9.2GB剩余29GB使用率25%。三、查看指定文件系统如果只想查看根分区df -h /实际执行[rootk8s-master ~]# df -h / Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 9.2G 29G 25% /这里可以快速判断根分区是否存在空间不足的问题。在实际生产环境中一般需要重点关注Use%如果达到80%、90%甚至95%以上就需要进一步排查。具体阈值需要根据企业监控规范和业务情况确定。四、按照磁盘使用率进行排序当服务器存在多个文件系统时可以对磁盘使用率进行排序。使用df -h | sort -k5 -hr | head -5命令拆解如下。1. df -h查看磁盘空间df -h2. sort对结果进行排序sort3. -k5按照第5列进行排序sort -k5df -h输出结果中的第5列通常就是Use%也就是磁盘使用率。4. -h让sort能够识别人类可读的数值。5. -r倒序排列-r这样可以让使用率较高的文件系统排在前面。6. head -5只显示前5行head -5因此df -h | sort -k5 -hr | head -5可以快速查看磁盘使用率较高的文件系统。五、发现磁盘空间异常后使用du定位目录df只能告诉我们哪个文件系统空间不足。但是它不能直接告诉我们到底是哪个目录占用了大量空间。这时候使用du。例如du -xh --max-depth1 / 2/dev/null | sort -hr | head -10参数说明du用于统计文件和目录的磁盘空间使用情况。-x限制在当前文件系统内不跨越其他文件系统。-h使用人类可读的单位。--max-depth1只查看一级目录。2/dev/null将错误信息丢弃避免因为权限不足导致输出混乱。执行后可能得到31G / 23G /tmp 4.7G /usr 2.2G /var 923M /root 599M /boot 103M /opt 26M /etc 24K /home 16K /lostfound从结果可以发现/tmp 23G /usr 4.7G /var 2.2G /root 923M其中/tmp占用了23GB是当前最大的目录。因此继续检查du -xh --max-depth1 /tmp 2/dev/null | sort -hr | head -10六、du -sh查看目录总大小进入/tmpcd /tmp执行du -sh结果23G .这里的.代表当前目录。也就是说当前/tmp目录总共占用了23GB。但是这个命令只能告诉我们目录总大小。如果想继续定位到底是哪一个文件占用了大量空间需要继续使用du -ah /tmp七、查看具体文件大小使用du -ah /tmp 2/dev/null | sort -hr | head -20其中-a表示显示文件和目录。这与前面的du -xh --max-depth1有所不同。前面的命令主要用于查看目录层级的空间占用而du -ah可以进一步看到具体文件。例如可能得到23G /tmp/zabbix-disk-test.img 23G /tmp 100M /tmp/example.log 20M /tmp/cache这样就可以定位到具体的大文件。八、使用find查找大文件除了du之外还可以使用find查找大文件。例如查找根文件系统中大于1GB的文件find / -xdev -type f -size 1G -exec ls -lh {} \; 2/dev/null参数说明find /从根目录开始搜索。-xdev不跨越其他文件系统。-type f只搜索普通文件。-size 1G查找大于1GB的文件。-exec ls -lh {} \;对找到的文件执行ls -lh显示详细信息。2/dev/null隐藏权限不足等错误信息。这个命令在实际运维中非常实用。九、Linux磁盘空间故障排查思路当服务器出现磁盘空间不足时可以按照以下顺序进行排查第一步查看文件系统df -h确定哪个分区使用率过高。第二步查看一级目录du -xh --max-depth1 / 2/dev/null | sort -hr | head -10确定哪个目录占用空间最大。第三步继续深入例如发现/var比较大du -xh --max-depth1 /var 2/dev/null | sort -hr | head -10如果发现15G /var/log那么继续du -xh --max-depth1 /var/log 2/dev/null | sort -hr | head -10第四步定位具体大文件du -ah /var/log 2/dev/null | sort -hr | head -20或者find /var/log -type f -size 1G -exec ls -lh {} \;最终确定具体文件以后再分析这个文件是否可以清理。十、实际案例Zabbix磁盘监控除了故障发生以后人工排查还应该通过监控系统提前发现问题。本次实验使用Zabbix监控k8s-master服务器。服务器根分区信息总容量40G 已使用9.2G 剩余29G 使用率25%首先在Zabbix中创建监控项。监控项名称根分区磁盘使用率键值vfs.fs.size[/,pused]信息类型浮点数单位%这个监控项用于获取根分区/的磁盘使用率。十一、创建磁盘告警触发器进入数据采集 → 主机 → k8s-master → 触发器创建触发器。名称根分区磁盘使用率超过80%严重性一般严重触发条件vfs.fs.size[/,pused] 80其核心逻辑就是当根分区磁盘使用率超过80%时Zabbix产生Problem事件。十二、模拟磁盘空间不足为了测试Zabbix告警在测试环境中可以创建一个临时文件。例如dd if/dev/zero of/tmp/zabbix-disk-test.img bs1M count23000 statusprogress这个命令会向/tmp创建一个较大的测试文件。创建完成后检查df -h /当根分区使用率超过80%以后等待Zabbix完成数据采集。进入监测 → 问题可以看到磁盘告警。例如根分区磁盘使用率超过80%状态问题这说明Zabbix的监控链路已经正常工作。十三、定位造成磁盘占用的文件出现磁盘告警以后可以使用Linux命令进行故障排查。首先df -h /确认根分区使用率。然后du -xh --max-depth1 / 2/dev/null | sort -hr | head -10发现31G / 23G /tmp 4.7G /usr 2.2G /var继续检查du -ah /tmp 2/dev/null | sort -hr | head -20最终可以定位到测试文件/tmp/zabbix-disk-test.img这就完成了一次完整的磁盘故障定位。十四、删除测试文件并验证恢复确认测试文件不属于业务数据以后可以删除rm -f /tmp/zabbix-disk-test.img然后重新检查df -h /磁盘使用率会恢复到正常水平。例如Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 9.2G 29G 25% /Zabbix重新采集到正常数据以后之前的Problem会自动恢复为已解决这样就完成了完整的告警测试。十五、Zabbix磁盘监控完整过程本次实验验证了以下几个环节Zabbix Agent采集磁盘使用率 Zabbix监控项保存数据 触发器判断磁盘使用率 磁盘超过80% 产生Problem Linux命令定位占用空间 清理测试文件 磁盘使用率恢复 Zabbix检测到恢复 Problem变成已解决这比单纯安装Zabbix更加接近实际运维工作。十六、生产环境清理磁盘时的注意事项磁盘满以后不能直接看到大文件就删除。在执行rm之前需要确认文件是什么哪个程序产生的是否正在被使用是否属于业务数据是否已经完成备份是否允许删除删除后是否会影响业务例如日志文件达到几十GB时不应该直接执行rm -rf /var/log/*而应该先确认日志来源并结合日志轮转、压缩、保留周期等策略进行处理。尤其是/var/lib/mysql /var/lib/docker /var/lib/containerd /var/lib/kubelet这些目录通常包含重要的业务数据、容器数据或者Kubernetes相关数据更不能直接删除。十七、常用命令总结查看磁盘空间df -h查看根分区df -h /按使用率排序df -h | sort -k5 -hr | head -5查看一级目录大小du -xh --max-depth1 /查看最大的目录du -xh --max-depth1 / 2/dev/null | sort -hr | head -10查看目录中的具体文件du -ah /tmp 2/dev/null | sort -hr | head -20查找大文件find / -xdev -type f -size 1G -exec ls -lh {} \; 2/dev/null删除指定文件rm -f 文件名删除后验证磁盘df -h十八、总结Linux磁盘空间不足的排查最重要的不是记住几个命令而是建立正确的排障思路。首先使用df -h确定哪个文件系统空间不足。然后使用du逐层定位占用空间较大的目录。如果还需要进一步定位具体文件可以使用du -ah或者find找到文件以后不要立即删除而是先确认文件用途和业务影响。最后使用df -h验证磁盘空间是否恢复。同时通过Zabbix配置磁盘监控可以在磁盘真正影响业务之前发现问题。本次实验最终实现了磁盘监控 磁盘使用率超过80% Zabbix产生Problem Linux定位异常文件 清理测试数据 磁盘恢复正常 Zabbix自动恢复为已解决
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门