问题说明:IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件。但是发现删除该文件后,/分区的磁盘空间压根没有释放出来,使用率还是100%!这是为什么呢??

[root@linux-node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
58G 7.8G 47G 100% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vda1 190M 72M 108M 40% /boot

原因分析:
在Linux系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),也就是说只是删除了文件和系统目录结构的链接;如果文件在删除时是被打开的(有一个进程正在使用该文件,文件被进程锁定或者有进程一直在向这个文件写数据等)状态,那么进程将仍然可以读取该文件,也就是说没有删除掉文件在读取的状态,所以磁盘空间也就会一直被占用。  [ 在另一篇文章:https://www.cnblogs.com/kevingrace/p/8076488.html中(第"十一"部分)处也提到了这个问题 ]

一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除文件后,空间还没释放,就是因为有进程还在一直向这个文件写入内容,导致虽然删除了文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。

解决措施有以下几种:
1)通过lsof|grep deleted命令获取到已经被删除但是仍然被应用程序占用的文件列表,然后kill掉还在占用所删除文件的进程。需要注意的是:如果有很多进程都在使用所删除文件,那么采用第1种方式kill进程就有点麻烦了,而且风险也比较大。因为kill进程是通过截断proc文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。必须要确定不会对运行中的进程造成影响时才能使用,应用程序对这种方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题。
2)或停掉或重启使用这个所删除文件的应用,让OS自动回收磁盘空间。
3)也可以重启操作系统,不过这并不是最好的方法
4)对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件。通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志。
在线清空文件(比如/home/wangshibo.log)的方式:

a)# echo " " > /home/wangshibo.log
b)# cat /dev/null > /home/wangshibo.log
c)# > /home/wangshibo.log

还有一种磁盘空间使用问题的现象:明明使用df -h命令查看磁盘空间使用率不算高,还有很多空余空间,但是创建文件或写入数据时一直报错磁盘写满:" no space left on device"!这个参考:由索引节点(inode)爆满引发的问题

一般这种问题都是由于分区目录下deleted删除后的资源空间没有真正释放出来导致的, 具体处理流程如下:
-> 先df -lh查看一下磁盘使用状况, 发现/data分区下的Used已用空间很大, 但是实际查看并没有占用那么大的空间!
-> 找到被删除文件所在的分区, 比如/data分区
-> 查看被删除了的所有文件:lsof -n /data |grep deleted
-> 杀死这些文件的delete进程, 释放空间: lsof -n /data |grep deleted|awk '{print $2}'|xargs kill -9
-> 接着再运行lsof -n /data |grep delete,应该就没有结果了。
-> 注意: 刚杀死deleted进程时, df -h查看/data 分区, Used已用空间可能时瞬间显示过大, 但随着deleted进程杀死, 资源逐渐释放, /data分区下的Used已用空间会逐渐变小, Avail可用空间会逐渐变大)

大多数文件系统都会保留一部分空间留作紧急情况时用(比如硬盘空间满了),这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不致于马上就 crash,给监控系统和管理员一点时间去察觉。不过有时候这部分预留的硬盘空间不用的话有点浪费。

在Linux系统中,ext2、ext3、ext4文件系统上通常会默认预留5%的磁盘空间,比如磁盘如果是2TB,这就意味着有100GB的空间会被预留下来,这样的话会不会显得有点浪费了。可以通过"tune2fs"命令来改变5%的默认设置,比如只预留2%的空间。但是不建议设成0%,现实环境中这样做不安全。

[root@ss-server ~]# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/vda1 ext4 41151808 4962148 34076228 13% /
devtmpfs devtmpfs 1931468 0 1931468 0% /dev
tmpfs tmpfs 1941204 0 1941204 0% /dev/shm
tmpfs tmpfs 1941204 652 1940552 1% /run
tmpfs tmpfs 1941204 0 1941204 0% /sys/fs/cgroup
tmpfs tmpfs 388244 0 388244 0% /run/user/0 [root@ss-server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.8G 33G 13% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 620K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 380M 0 380M 0% /run/user/0 比如上面"/"分区是ext4文件系统,默认系统预留了5%也就是2G的空间。
现在可以通过"tune2fs"命令将系统预留空间改为2%。 [root@ss-server ~]# tune2fs -m 2 /dev/vda1
tune2fs 1.42.9 (28-Dec-2013)
Setting reserved blocks percentage to 2% (209704 blocks) 执行后,发现"/"分区腾出了1G的空间,这时系统预留空间也就是2%了。
[root@ss-server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.8G 34G 13% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 620K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 380M 0 380M 0% /run/user/0 注意:
Linux下只有ext2、ext3、ext4文件系统时,系统才会默认预留5%的磁盘空间。
如果文件系统是xfs、tmpfs、devtmpfs、overlay等,则系统默认不会预留磁盘空间。

Linux磁盘空间被占用问题 (分区目录占用空间比实际空间要大: 资源文件删除后, 空间没有真正释放)的更多相关文章

  1. Linux 磁盘原理与管理 (分区 挂载)

    目前硬盘与主机系统的联系主要有几种传输介面规格: IDE介面:         IDE介面插槽所使用的排线较宽,每条排线上面可以接两个IDE装置,由於可以接两个装置,那为了判别两个装置的主/从架构, ...

  2. 关于MySQL数据被删除后空间重用的问题实验

    以前知道,MySQL在通过delete语句删除数据后,空间并不会被腾出,而只是在数据文件中被标记为已删除,除非执行optimize table.前两天听说,虽然delete数据后硬盘空间不会被腾出,但 ...

  3. LINUX小技巧,如何在指定目录下搜索到含特定关键字的文件。

    先找出文件,然后将文件作为输入,找具体关键字 find /etc -name "*" | xargs grep "Hello"

  4. nginx 同一域名下分目录配置显示php,html,资源文件

    安装上nginx后 注意后nginx.conf 中的这么几行 error_log /var/log/nginx/error.log;  日志,这个很有用 include /etc/nginx/conf ...

  5. Linux文件删除空间未释放

    当系统空间使用量过大需要清理空间或者清理某个文件时,有时会出现执行了删除命令之后磁盘空间并没有释放,很多人首次遇到该情况时会比较困惑,在考虑是不是像windows系统的回收站一样,删除只是逻辑删除到回 ...

  6. Linux磁盘空间查看、磁盘被未知资源耗尽

    Linux系统中,当我们使用rm在Linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄, 那么Linux内核还是不会释放这个文件的磁盘空间,最后造成磁盘空间占用100%, ...

  7. LINUX文件删除,但磁盘空间未释放

    最近在进行系统压测,由于服务器节点太多,便写了个简单的脚本,在执行过程中发现,日志文件删除后,磁盘空间只释放了一小部分,任有大部分磁盘空间未释放. 使用lsof | grep delete命令,发现已 ...

  8. Linux quota命令参数及用法详解---Linux磁盘配额限制设置和查看命令

    功能说明:显示磁盘已使用的空间与限制. 语 法:quota [-quvV][用户名称...] 或 quota [-gqvV][群组名称...] 补充说明:执行quota指令,可查询磁盘空间的限制,并得 ...

  9. linux 磁盘控件找到大文件

    df -lh Used:已经使用的空间 Avail:可以使用的空间 Mounted on:挂载的目录 然后找到大文件 du是linux下用看查看磁盘的命令 下面我们先一个目录的来查看空间占用情况 du ...

随机推荐

  1. windows10 VM12 安装Mac OS X 10.11

    转载自:http://blog.csdn.net/j755ing/article/details/69400439 第一步: 下载 材料/工具: 下载 VMware Workstation 12 Pr ...

  2. Nginx安装成Windows服务

    因为有项目使用Nginx来做负载均衡,但是Nginx的Windows版本是不提供安装成服务的,所以服务器重启后Nginx并不会伴随启动和恢复.网上查了下,这里记录下解决方法,防止遗忘. 第一步:下载W ...

  3. JAVA获取本机IP和Mac地址

       在项目中,时常需要获取本机的Ip或是Mac地址,进行身份和权限验证,本文就是通过java代码获取ip和Mac. package com.svse.query;import java.net.In ...

  4. [零基础学python]为什么要开设本栏目

    这个栏目的名称叫做"零基础学Python". 如今网上已经有不少学习python的课程.当中也不乏精品.按理说,不缺少我这个基础类型的课程了.可是,我注意到一个问题.无论是课程还是 ...

  5. 安卓手机ADB驱动干什么的?

    Adb驱动是什么意思? /div> Adb是英文Android Debug Bridge的英文缩写,是debug工具,如果不是写IT的可能也很难理解debug的意思.说的直白一点就是Adb就是手 ...

  6. php获取两个数组相同的元素(交集)以及比较两个数组中不同的元素(差集)

    (一)php获取两个数组相同元素 array  array_intersect(array  $array1, array $array2, [, array $...]) array  array_ ...

  7. 【Odoo 8开发教程】第二章:Odoo生产环境部署设置

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/10792977.html 一:dbfilter 数据库访问规则设置 一个odoo实例可以连接到不同的数据库实例中 ...

  8. kubernetes statefulset kafka 部署后, 外部访问超时问题解决

    k8s 内部的kafka要映射到外网,直接把 kafka 通过 expose 把pod 映射成服务,使用nodeport 连接,出现超时问题, 解决思路: 1.  查看zk中,kafka的注册信息,P ...

  9. Spring配置文件和SpringMVC配置文件 web.xml配置文件 保存自用

    话不多说,最近在周末自己抽时间写一些框架做的系统,当所有东西都需要自己配置时候发现自己压根记不住这么多类和路径,所以日常总结就变得尤为重要了 db-config.properties 将配置文件常量提 ...

  10. MySQL数据备份之mysqldump使用(转)

    文章转自 :https://www.cnblogs.com/jpfss/p/7867668.html mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mys ...