如何定位托管服务器存储占用持续增长的根源?
如何定位托管服务器存储占用持续增长的根源?
兄弟,我太懂你这种看着存储蹭蹭上涨却找不到源头的焦虑了!结合你的情况,给你分享几个实战好用的工具和排查思路,都是踩坑后总结出来的干货:
一、实时抓现行:追踪动态文件变化
- inotifywait:这个工具能实时盯紧文件系统的一举一动,比如文件创建、写入、删除操作。你可以先把可疑目录(比如日志、临时文件目录)纳入监控,命令这么用:
inotifywait -m -r -e create,modify,delete /path/to/target/dir-m是持续监控不退出,-r递归监控子目录,-e指定要盯的事件类型。一旦有文件被写入或创建,立刻就能看到,方便当场抓“元凶”。 - fatrace:这个工具更全面,能记录系统里所有进程的文件I/O操作。安装后直接跑
fatrace,它会输出所有读写动作,你可以过滤只看写入操作:
这样就能精准定位到哪个进程在疯狂写文件。fatrace | grep W
二、按时间维度排查:找近期变大的文件
- find命令精准定位:如果你不知道什么时候文件涨的,可以找最近一段时间修改或创建的大文件。比如找24小时内修改过、大小超过1G的文件:
要是想找几小时内的,把find / -type f -mtime -1 -size +1G -exec ls -lh {} \;-mtime -1换成-mmin -60(60分钟内)就行,更精准。 - ncdu交互式对比:比你用的
du -ms|sort -rn直观多了,它是树形结构展示目录占用,还能交互式操作。你可以隔几个小时扫一次,对比差异:- 第一次扫描导出结果:
ncdu -o scan_initial.txt - 过段时间再扫一次:
ncdu -o scan_later.txt - 对比两次结果:
ncdu -d scan_initial.txt scan_later.txt
这样增长最快的目录或文件就一目了然了。
- 第一次扫描导出结果:
三、排查容易被忽略的“隐形”占用
- 临时文件与缓存:很多程序会在
/tmp、/var/tmp或者自身缓存目录生成临时文件,要是程序崩溃没清理,就会越积越大。先看看这些目录的大小:ls -lh /tmp,也可以用tmpwatch自动清理过期临时文件(操作前确认哪些文件可以删)。 - 日志文件“爆仓”:日志绝对是存储增长的重灾区!比如Web服务器、应用程序的日志,可能因为某个循环错误,每分钟生成几百M日志。先看
/var/log下的文件大小,再用tail -f实时看日志内容,有没有重复的错误信息。另外检查下logrotate配置,是不是日志轮转失效了,导致日志文件一直变大没分割。 - 已删除但未释放的文件:有时候文件删了,但进程还在占用它,磁盘空间不会释放。用这个命令找这类文件:
找到对应的进程后,重启它就能释放空间了。比如某个服务的日志文件被删了但服务没重启,就会出现这种情况。lsof | grep deleted
四、长期监控:摸清增长规律
- 定时记录存储情况:用cron加个定时任务,每天记录各目录的占用情况,方便对比变化:
# 每天凌晨2点记录根目录各子目录的占用 0 2 * * * du -ms / | sort -rn > /var/log/disk_usage_$(date +%Y%m%d).log - 磁盘I/O监控:用
dstat或iostat监控磁盘写入速率,看什么时候写入量突然飙升,结合时间点去排查当时的进程活动:# 带时间戳显示磁盘读写情况 dstat -t -d
按照这些方法一步步排查,应该很快就能找到那个偷偷吃你存储空间的“元凶”!
备注:内容来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

