shutil.disk_usage() 自动扣除 reserved blocks,返回当前用户实际可写入字节数;应针对目标路径调用,关注 .free 字段,前置阈值检查并嵌入写入入口点,配合事件驱动监控与安全清理机制。

用 shutil.disk_usage() 获取准确的可用空间
直接读取 /proc/mounts 或调用 os.statvfs() 容易忽略 reserved blocks(尤其是 ext4 默认保留 5% 给 root),导致预判偏差。Linux 下普通用户写入失败常因“看似有空间,实则不可用”。shutil.disk_usage() 自动扣除 reserved space,返回的是当前用户实际可写入的字节数。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 始终对目标路径(而非根路径)调用
shutil.disk_usage(path),例如监控日志目录就传"/var/log",不是"/" - 结果中关注
.free字段,不是.total或.used - 在容器环境里,若挂载的是 bind mount,确保传入的是容器内路径(如
"/data"),且该路径已实际挂载完成再调用
写入前做阈值检查,别等 OSError: No space left on device 才响应
等到 open() 或 write() 抛出 OSError: No space left on device 就晚了——文件可能已部分写入、状态不一致,或触发上游重试风暴。必须前置拦截。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 设定硬性阈值,比如剩余
< 512 * 1024 * 1024(512MB)时拒绝新写入,而不是用百分比(小磁盘下 5% 可能才 200MB,不够缓冲) - 检查逻辑要嵌入到写入入口点:日志函数、数据落盘方法、上传回调等,而非只在程序启动时查一次
- 检查后若不满足,抛出自定义异常(如
DiskSpaceError)并记录警告,避免静默降级
配合 atexit 和信号捕获做安全清理
即使做了前置检查,极端情况下(如多进程并发写入、NFS 瞬间延迟反馈)仍可能触发磁盘满。此时需防止残留临时文件、锁文件或半成品数据污染后续运行。
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
atexit.register()注册清理函数,删除已创建但未完成写入的临时文件(匹配*.tmp或*.part模式) - 对关键路径(如数据库 WAL 目录)注册
signal.SIGTERM和signal.SIGINT处理器,确保中断时也能清理 - 避免在清理逻辑中再执行耗时操作(如压缩归档),只做原子性删除或重命名
轮询间隔与告警联动不能只靠 time.sleep()
单纯用 time.sleep(60) 轮询磁盘,既浪费 CPU(空转),又无法响应突发写入高峰。更糟的是,告警若只依赖轮询结果,会滞后数分钟。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
watchdog库监听目标目录的FileCreatedEvent和FileModifiedEvent,事件驱动式触发空间复查,比固定轮询更及时 - 告警必须带上下文:剩余空间、所在挂载点、触发时间、最近写入的文件名(取自
os.listdir()排序后末几位) - 首次低于阈值时发 warning,持续 3 次低于阈值再升为 critical,并自动抑制重复告警(用文件或 Redis 记 last_alert_time)
监控本身不解决磁盘满,它只是刹车片。真正关键的是:阈值是否贴合业务写入节奏、清理逻辑是否覆盖所有临时态路径、告警信息能否让运维一眼定位到是哪个服务在狂写——这些细节没对齐,再多的 disk_usage() 调用也只是纸上谈兵。

















