五点多醒了,一看手机,收到了一堆网站磁盘告警信息,显示磁盘的占用情况82%,85%,…92%(每半个小时报警一次)。
赶快打开电脑,登上服务器,查看磁盘占用情况。
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 36G 4G 92% /
sudo du -h -x --max-depth=1 /
28G /tmp
发现磁盘挂载点/
下的/tmp/
目录的磁盘使用量突然升高了。下面又数千个类似下面的文件,然后为了接下来分析原因就将这些文件移动到了其他目录下。
-rw-r--r-- 1 root root 7168 Jul 11 05:42 /tmp/cachegrind.out.8268
-rw-r--r-- 1 root root 7174 Jul 11 05:45 /tmp/cachegrind.out.8852
-rw-r--r-- 1 root root 7179 Jul 11 05:45 /tmp/cachegrind.out.8863
移动完后,磁盘的占用情况降下来了,总算不再报警了。(磁盘占用情况高于80%会触发报警)
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 28G 11G 73% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 1.5M 7.8G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vdb1 2.0T 843G 1.1T 45% /data
tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs 1.6G 0 1.6G 0% /run/user/1001
tmpfs 1.6G 0 1.6G 0% /run/user/1002
sudo du -h -x --max-depth=1 /
1.4M /tmp
138M /root
4.8M /opt
4.0K /media
2.2G /var
362M /srv
233M /etc
207M /home
4.0K /mnt
176M /boot
2.7G /usr
16K /lost+found
6.0G /
但是另外一个问题出现了,发现df
和dh
输出的 /
占用情况并不一致。
不一致是df
和dh
再计算磁盘使用情况有些区别。
由于文件描述符的原因, 应用程序正在使用的文件是可以被移动或删除,因为这些文件描述符在 proc filesystem 中仍旧是打开的。
这些文件描述符仍打开的文件是会被 df
统计的,但是不会被 du
统计。 Why do “df” and “du” commands show different disk usage?
使用lsof | grep '(deleted)'
查看上面已经被删除的文件。
mysqld 9419 9440 mysql 11u REG 253,1 0 528185 /var/tmp/ibBAVemN (deleted)
mysqld 9419 9440 mysql 15u REG 253,1 0 528186 /var/tmp/ibAOIAAG (deleted)
mysqld 9419 9449 mysql 8u REG 253,1 0 528182 /var/tmp/ibDYMqGe (deleted)
mysqld 9419 9449 mysql 9u REG 253,1 0 528183 /var/tmp/ibgSNVP7 (deleted)
mysqld 9419 9449 mysql 10u REG 253,1 0 528184 /var/tmp/ib3b2qZ0 (deleted)
mysqld 9419 9449 mysql 11u REG 253,1 0 528185 /var/tmp/ibBAVemN (deleted)
mysqld 9419 9449 mysql 15u REG 253,1 0 528186 /var/tmp/ibAOIAAG (deleted)
php 15240 root 3w REG 253,1 7273961987 429422 /tmp/cachegrind.out.19714 (deleted)
php 15240 root 7w REG 253,1 5924639750 429424 /tmp/cachegrind.out.19725 (deleted)
php 15240 root 12wW REG 253,1 881868346 401811 /tmp/cachegrind.out.15240 (deleted)
通过上面的PID,可以定位到是哪个进程仍在使用
ps -aef | grep 15257
root 15257 19724 0 Jul10 ? 00:03:43 /etc/opt/remi/php73/bin/php artisan horizon:work
杀掉上面的进程 kill -9 15257
就可以收回打开的文件占用的空间。
磁盘占用过多的问题解决了,下面就该去定位问题产生的原因了…