问题描述
在云服务器ECS Linux系统内创建文件时,出现类似如下空间不足提示:
- 磁盘分区空间使用率达到百分之百。
- 磁盘分区inode使用率达到百分之百。
- 僵尸文件:已删除文件因句柄被占用未释放导致相应空间未释放。
挂载点覆盖:在原有文件系统的相应目录下已经存在大量文件。挂载了新磁盘后,导致使用 df 命令能统计到相关空间使用,而使用 su 命令统计不到。
处理办法
不同的原因需要通过不同的方法解决:
- inode容量满
- 修改inode数量
- 僵尸文件分析删除
- 挂载点覆盖
分区容量满
如果是分区容量满导致磁盘空间满,按以下步骤操作:
- 运行 df -h 查看磁盘使用率。返回结果如下图所示。注意:返回结果里 Mounted on 下显示的是挂载目录。
[root@qz_lan03 ~]# df -h /member-sh Filesystem Size Used Avail Use% Mounted on /dev/sda2 96G 95G 0 100% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda1 969M 99M 820M 11% /boot /dev/sda5 818G 2.4G 774G 1% /data
2.查看项目一级目录的文件大小,日志已经被删除 [root@qz_lan03 ~]# du -h —max-depth=1 /root/member-sh/ 224K /root/member-sh/log 32K /root/member-sh/config 137M /root/member-sh/D: 8.0K /root/member-sh/disconf 137M /root/member-sh/
3.查看 一个已经被删除但是仍然被应用程序占用的文件列表,发现删除的文件正在被使用 [root@qz_lan03 member-sh]# lsof |grep deleted java 19464 root 1w REG 8,2 70949862040 3292909 /root/member-sh/log/member-service-rd_20170411135530.log (deleted) java 19464 root 2w REG 8,2 70949862040 3292909 /root/member-sh/log/member-service-rd_20170411135530.log (deleted) java 19464 root 100w REG 8,2 25014294067 3292954 /root/member-sh/D:/logs/member_service.log (deleted) java 20098 root 1w REG 8,2 55711 3292912 /root/member-sh/log/member-h5-web-rd_20170411140310.log (deleted) java 20098 root 2w REG 8,2 55711 3292912 /root/member-sh/log/member-h5-web-rd_20170411140310.log (deleted) java 20178 root 1w REG 8,2 72947 3292917 /root/member-sh/log/member-web-rd_20170411140333.log (deleted) java 20178 root 2w REG 8,2 72947 3292917 /root/member-sh/log/member-web-rd_20170411140333.log (deleted) java 20178 root 96w REG 8,2 15827 3292930 /root/member-sh/D:/logs/member_web.log (deleted)
问题原因:
如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。
解决方法:
<br />kill对应的进程,或重启对应的服务
<br />总结:清理日志文件,需要重启对象的服务
<a name="LnaEC"></a>
### inode容量满
1、问题:<br />在创建新目录和文件是提示“no space left on device”!按照以前的情况,很有可能是服务器空间又被塞满了,通过命令查看,发现还有剩余。<br />再用df -i查看了一下/分区的索引节点(inode),发现已经用满(已用=100%),导致系统无法创建新目录和文件。<br /><br />2、问题原因分析:
Inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是 Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。 inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。<br />而这台服务器的Block虽然还有剩余,但inode已经用满,因此在创建新目录或文件时,系统提示磁盘空间不足。<br />Inode的数量是有限制的,每个文件对应一个Inode,那么如何查看inode的最大数量呢?
可以看到Inode的总量,已经使用的Inode数量,和剩余数量。
3、解决:<br />1)查找满的目录:
```shell
[root@abc sbin]# for i in /*; do echo $i; find $i | wc -l; done
/bin
121
...
/sys
8145
/tmp
7
/usr
56840
/var
8019
然后找到inode占用最多额目录下,再用上面命令查看。
2)删除文件占用多的目录:
进入目录直接rm -rf 可能会卡死,可以使用下面方式:
find dir -type f -name '*' | xargs rm
或者
cd dir
ls | xargs rm -f
4、拓展:
系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
解决办法:
将crontab里面的命令后面加上 > /dev/null 2>&1 或者crontab里面的命令后面加上 > /dev/null
僵尸文件分析删除
如果磁盘和inode都没有问题,则需要查看是否存在未被清除句柄的僵死文件。这些文件实际上已经被删除,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间。如果这些文件过多,会占用很大的磁盘空间。
按以下步骤查看并删除僵尸文件:
- 远程连接Linux实例。
- 运行以下命令安装lsof。
- yum install lsof-y
- 运行以下命令查看僵尸文件占用情况。返回结果示例如下图所示。
- lsof|grep delete|more
- 采用以下方法释放句柄,以清除僵尸文件: