
# 为什么Linux云服务器df和du统计磁盘空间的大小不一致？
#### 问题描述
Linux云服务器执行df和du命令查看磁盘使用空间的大小不一致。
如下图所示，使用**df -h** 命令查看磁盘使用空间，比**du -sh**命令统计得到的要大。
![](https://support.huaweicloud.com/trouble-ecs/zh-cn_image_0000001879846164.png "点击放大")
#### 可能原因
一般来说不会出现删除文件后空间不释放的情况，但是也存在例外，比如文件进程锁定，或者有进程一直在向这个文件写数据。
Linux系统中的一个文件在文件系统中存放分为两个部分：数据部分和指针部分，指针位于文件系统的meta-data中，在将数据删除后，这个指针就从meta-data中清除了，而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后，文件数据部分占用的空间就可以被覆盖并写入新的内容，之所以出现删除文件后，空间还没有释放，就是因为进程还在一直向这个文件写入内容，导致虽然删除了文件，但是由于进程锁定，文件对应的指针部分并未从meta-data中清除，而由于指针并未删除，系统内核就认为文件并未被删除，因此通过df命令查询空间并未释放。
当一个文件被删除后，在文件系统目录中已经不可见了，所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄，那么这个文件就不会真正在磁盘中被删除，分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。
#### 处理方法
1. 执行以下命令，切换到/opt目录。 **cd /opt**
   
2. 执行以下命令，查看所有已被删除但还被进程占用的文件。 **lsof \| grep deleted**
   ![](https://support.huaweicloud.com/trouble-ecs/zh-cn_image_0000001925725529.png "点击放大")
   从回显结果可以看出，/var/lib/docker/mongdb/log/mongdb占用190G，"deleted"状态说明这个日志文件已经被删除，但是由于进程还在一直向此文件写入数据，因此空间并未释放。
   
3. 执行以下命令，清除文件。 **echo \>"/var/log/docker/mongdb/log/mongdb"**
   通过这种方法，磁盘空间不但可以马上释放，也可以保证进程继续向文件写入日志。
   
 
