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