Linux 磁盘空间常见问题处理方法

1. 分区容量满的处理

1.1   登录服务器,使用 df -h查看磁盘使用率,其中的 mounted on指的是挂载的目录。

[root@hecs-293015 ~]# df -h
Filesystem Size   Used Avail Use%  Mounted on
devtmpfs   1.9G   0    1.9G  0%    /dev
tmpfs      1.9G   8.0K 1.9G  1%    /dev/shm
tmpfs      1.9G   25M  1.9G  2%    /run
tmpfs      1.9G   0    1.9G  0%    /sys/fs/cgroup
/dev/vda1  40G    36G  3G    98%   /
tmpfs      379M   0    379M  0%    /run/user/0

可以看得到/目录下使用量已经达到了98%剩余空间只有3G了。

1.2循环执行du  –sh *指令,看下哪个目录大,进入该目录,直到找到最精确的的文件或目录

[root@hecs-293015 /]# du -sh *
0 bin
143M boot
204M CloudResetPwdUpdateAgent
1004K CloudrResetPwdAgent
8.0K dev
.........

2. 使用 df 和 du 查看磁盘空间大小不一致

2.1 故障现象
磁盘空间被写满,尝试删除无用文件释放空间时,输入 df -lh 查看命令,但还是占满,是由于Linux系统中虽然删除了磁盘中的文件,但是由于进程还在运行当中所以无法释放磁盘空间,这种情况就会出现磁盘空间无故被占用。

2.2 指令du和df 的区别

du 命令对统计文件逐个进行 fstat 系统调用,获取文件大小。它的数据是基于文件获取,可以跨多个分区操作。

[root@hecs-293015 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 16K 1.9G 1% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/vda1 40G 5.4G 32G 15% /
tmpfs 379M 0 379M 0% /run/user/0

df 命令使用 statfs 系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。

[root@hecs-293015 ~]# du -sh
9.7M .

用户删除了大量的文件后,du 就不会在文件系统目录中统计这些文件。如果此时还有运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df 仍会统计这个被删除的文件。

通过 lsof 查询处于 deleted 状态的文件,被删除的文件在系统中被标记为 deleted 。如果系统有大量 deleted 状态的文件,会导致 du 和 df统计结果不一致。

5.3解决方案

5.3.1使用df -Th 命令查询磁盘使用情况,执行df -h 查看 ECS Linux 实例文件系统使用率,可以看到 /磁盘占用了约5.8G,

[root@hecs-293015 ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 17k 2.0G 1% /dev/shm
tmpfs tmpfs 2.0G 9.0M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda1 ext4 43G 5.8G 35G 15% /
tmpfs tmpfs 398M 0 398M 0% /run/user/0

5.3.2使用du命令查询磁盘实际用量,进入到 / 目录执行 du -sh ,显示空间总占用量约 5.4 G,即df 和du查看到的结果不一致。

[root@hecs-293015 /]# du -sh
5.4G .

5.3.3根据lsof查询文件被删除但是没有被杀死的进程

[root@hecs-293015 /]# lsof +L1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
mysqld 2044 mysql 5u REG 253,1 0 0 1049279 /tmp/ibFLzczt (deleted)
mysqld 2044 mysql 6u REG 253,1 0 0 1050317 /tmp/iblHeWJL (deleted)
mysqld 2044 mysql 7u REG 253,1 0 0 1050318 /tmp/ibF92FU3 (deleted)
mysqld 2044 mysql 8u REG 253,1 0 0 1050320 /tmp/ib1F0bjE (deleted)
mysqld 2044 mysql 12u REG 253,1 0 0 1050314 /tmp/ibpauVdX (deleted)
php-fpm 2111 root 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2136 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2137 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2138 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2139 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2140 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2345 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2352 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)
php-fpm 2415 www 3u REG 253,1 0 0 1048707 /tmp/.ZendSem.6esnNb (deleted)

5.3.4根据 lsof 列出的 pid,kill 相应进程或者重启相应的服务

[root@hecs-293015 /]# kill -9 2044

使用kill命令删除进程即可,其中-s 9 制订了传递给进程的信号是9,即强制,尽快终止进程。

5.3.5重启实例。重启实例系统会退出现有的进程,开机后重新加载,过程中会释放调用的 deleted 文件的句柄
登陆官网控制台,找到弹性云服务器,点击重启或执行reboot

[root@hecs-293015 /]# reboot

 


云野 » Linux 磁盘空间常见问题处理方法

发表回复