html tool

2015年7月23日星期四

linux显示磁盘满了,但实际挂载的目录未满

参考地址一:http://blog.lizhigang.net/archives/600 (java占用释放)
参考地址二:http://www.ha97.com/5067.html(Oracle层面的解释)
【popexizhi】
df对磁盘空间的占用统计,du对文件及其目录的统计,linux下支持文件被占用时rm,mv,如果应用还在对rm,mv的文件写入,df一定比du占用的空间大。

-----------地址二的原文--------------------------
2、异常情况下,df计算的USED空间会比du大很多。
这也是之前碰到的问题,df查看结果文件系统100%使用了,而du的结果是还有6GB空闲的,就这么个问题硬件厂商一个SUPPORT居然不知道怎么解释,这也是让我好奇晚上回来查查看究竟的原因,结果GOOGLE一下就有了。
原因在于du是以文件名、目录名为依据计算空间使用的,而df是以硬盘块使用情况来计算空间使用的。
当一个应用程序正在写一个大文件的时候,我们RM或者MV了这个文件(UNIX是允许这么干的,WINDOWS在这一点上傻有傻福),应用程序会占有句柄,并根据句柄所指磁盘位置直接写磁盘,而不会检查该文件是否被删除
因此就会产生上述的问题。具体到Oracle层面,可能发生这种情况的有:Oracle因为某种原因在生成很大的TRACE文件,可能导致oracle等目录满,如果此时直接RM或MV掉该TRACE文件会发现空间并不会释放,进而可能导致Oracle数据库DOWN机。
解决办法:使用“> tracefile.trc”命令清空掉该文件,如果需要保留TRACE文件便于事后分析问题,可以使用CP先复制该文件到其他地方,然后清空掉原来的文件。

-----------地址一的原文-------------------------
直接上图:
QQ图片20130704203619

问题:    df -h发现/dev/xvda3挂载的硬盘100% Use了,但是这个挂载的硬盘指向的目录  /data下缺只有9.3G的东西,其他的空间被什么东西占满了?????

仔细回想了下,前几天由于磁盘报警直接rm -rf了一个44G大小的文件,难道linux删除的文件也占着空间??不对啊   这不是windows。。。。。。
使劲想啊找啊,终于找到了。。。。我的log文件是通过一个java的程序输出的,在未重启的情况下我直接删除掉了输出的LOG文件。这样的话导致inode节点不被释放,空间一直被占用。

解决方法很简单,重启一下这个java的进程即可恢复正常。

--------------------------------------------
inode节点介绍:(参见:http://baike.baidu.com/link?url=VKUIARbVVM1X927a65vGBC8Fi1n32rPZ2geS3qLgfYtIe0Kp8pdBbXcU_zyxjX1jqWb6FPq8TeEPaZfBifJ8gwrrZL6W3bZhPfF7s7FYU2e)
inode 是 UNIX 操作系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。
有时,人们使用了一些不同的术语,如 inode索引编号 (inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。inode 指的是数据结构;而索引编号实际上是 inode 的标识编号,因此也称其为inode 编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。下一个部分将介绍 inode 中的其他一些属性。
inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。

例如,使用 vi 来编辑一个文件。当您键入 vi 时,在 inode 表中找到 inode 编号之后,才允许您打开该 inode 。在 vi 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入 :wq 时,将关闭并释放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止.
--------------------------------------------------
关于df和du的输出差别原文解释如下:

Problem Definition
------- ----------
This section gives the technical explanation of why du and df sometimes report
different totals of disk space usage.
When a program that is running in the background writes to a file while the
process is running, the file to which this process is writing is deleted.
Running df and du shows a discrepancy in the amount of disk space usage. The
df command shows a higher value.
Explanation Summary
----------- -------
When you open a file, you get a pointer. Subsequent writes to this file
references this file pointer. The write call does not check to see if the file
is there or not. It just writes to the specified number of characters starting
at a predetermined location. Regardless of whether the file exist or not, disk
blocks are used by the write operation.
The df command reports the number of disk blocks used, while du goes through the
file structure and reports the number of blocks used by each directory. As
far as du is concerned, the file used by the process does not exist, so it does
not report blocks used by this phantom file. But df keeps track of disk blocks
used, and it reports the blocks used by this phantom file.


没有评论:

发表评论