1.排查是哪些大文件占用该系统根空间

find / -xdev -size +1G -exec ls -l {} \;
find / -type f -size +1G -exec du -h {} \; # 选其一即可
# 命令作用是:查询根目录(/)下超过1G大小的文件

2.解决Linux系统删除文件后空间并没有释放的问题

一、现象描述

操作系统:CentOS 6.8 x64   使用 df -h 命令,看见 / 根目录下磁盘空间已满(100%),于是手动清理大日志文件。

[root@local ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rootvg-LogVol00 59G 59G 0 100% /
/dev/sda1 190M 13M 168M 8% /boot
tmpfs 2.0G 0 2.0G 0% /dev/shm

  

通过 du -sh 命令,找到占用大量空间的日志文件,于是使用 rm -rf 删除了它。

[root@local ~]# cd /var/nginx/logs/
[root@local ~]# rm -rf t-access.log t-error.log

 然后 查看磁盘空间的使用情况,发现 / (根目录)的空间并没有发生变化。但是可以看到 Used 发生了变化。

[root@local ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rootvg-LogVol00 59G 56G 0 100% /
/dev/sda1 190M 13M 168M 8% /boot
tmpfs 2.0G 0 2.0G 0% /dev/shm

这是怎么回事呢?

二、原因 未释放磁盘空间的原因:   在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的文件夹结构上解除链接(unlink),然而假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。而我删除的是nginx的访问日志文件,在删除的时候该文件正在被使用。

三、解决办法   首先获得一个已经被删除的可是仍然被应用程序占用的文件列表。操作如下:

[root@local ~]# lsof |grep deleted
nginx 4399 root 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
nginx 4399 root 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
nginx 4401 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
nginx 4401 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
nginx 4402 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
nginx 4402 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
nginx 4403 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
nginx 4403 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
nginx 4404 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
nginx 4404 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)

  

 从输出的结果可以看到 /var/nginx/logs/t-access.log 和 t-error.log 还在被使用中,所以导致未释放空间。 那么如何让进程释放呢? 方法1:直接 kill 掉相应的进程,或者停掉使用这个文件的应用,让操作系统自己主动回收磁盘空间。   由于还有其他项目正在使用该应用(nginx服务),所以不能停掉nginx服务,于是使用 kill 命令删除相应的进程。

[root@local ~]# kill -9 4399
[root@local ~]# kill -9 4401
[root@local ~]# kill -9 4402
[root@local ~]# kill -9 4403
[root@local ~]# kill -9 4404

再次,查看磁盘空间的使用情况,发现空间已经被回收了。

[root@local ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rootvg-LogVol00 59G 56G 0 95% /
/dev/sda1 190M 13M 168M 8% /boot
tmpfs 2.0G 0 2.0G 0% /dev/shm

方法2:以后清理正在被读写的大日志文件时,直接使用 echo "" > xxx.log 命令,即直接将文件置空,并不影响服务的使用,文件大小也被控制下来,磁盘空间也释放了。

说明:   当Linux打开一个文件的时候,Linux内核会为每个进程在/proc/ 『/proc/nnnn/fd/文件夹(nnnn为pid)』建立一个以其pid为名的文件夹用来保存进程的相关信息,而其子文件夹fd保存的是该进程打开的全部文件的fd(fd:file descriptor)。   kill进程是通过截断proc文件系统中的文件能够强制要求系统回收分配给正在使用的的文件。这是一项高级技术,仅到管理员确定不会对执行中的进程造成影响时使用。应用程序对这样的方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题。

四、删除原理   一般来说,不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程在使用这个文件,例如输出日志文件,要了解这个问题,就需要知道Linux下文件的存储机制和存储结构。   一个文件在文件系统中由两个部分构成:数据和指针。指针位于文件系统的meta-data中,数据被删除后,指针被清除,而数部分还是存储在磁盘中,只不过数据对应的指针被清除后,文件数据部分占用的空间就可以被覆盖了。之所以出现删除大文件后,空间还没有释放,就是因为有进程一直在使用这个文件的指针,日志文件的服务还在运行,导致虽然删除了日志大文件,但文件对应的指针部分由于被进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统就认为文件并未被删除,所以使用 df 命令查看还是 100%。

centos 释放磁盘空间的更多相关文章

  1. Mysql InnoDB彻底释放磁盘空间

    Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长. 如果需要彻底释放磁盘空间,则需要先导出数据,然后删除数据文件,最后导入数据. ...

  2. [记录]一则清理MySQL大表以释放磁盘空间的案例

    一则清理MySQL大表以释放磁盘空间的案例 一.基本情况: 1.dbtest库554G,先清理st_online_time_away_ds(37G)表的数据,保留半年的数据: 1)删除的数据:sele ...

  3. MySQL删除数据几种情况以及是否释放磁盘空间【转】

    MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table tabl ...

  4. mongodb拷贝数据库copyDatabase()。实现释放磁盘空间的方法。

    下面我们一起来看看关于mongodb拷贝数据库copyDatabase().实现释放磁盘空间的方法,希望文章对各位同学会有所帮助. db.copyDatabase("from",& ...

  5. 利用lsof命令查找已经删除的文件来释放磁盘空间

    测试环境一台服务器/目录空间使用率达到97%,但是通过du -sh *发现实际空间没用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh *发现共实际使 ...

  6. (转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化

    硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放.[delete后用:alter table table_name move    truncate后用:alter tab ...

  7. maven私服nexus清理释放磁盘空间

    应用背景: 自建的maven私服(或者叫私仓)nexus在使用过程中,因很多服务不断迭代更新上传jar包至nexus中,底层存放在一个叫Blob Stores的存储中,最近发现该存储已增大至好几百G, ...

  8. Linux系统中查找、删除重复文件,释放磁盘空间。

    在Linux系操作系统中查找并删除重复文件的方法的确有很多,不过这里介绍的是一款非常简单实用的软件FSlint.FSlint是一个重复文件查找工具,可以使用它来清除不必要的重复文件,笔者经常使用它来释 ...

  9. mongodb 释放磁盘空间

    db.copyDatabase("from","to","127.0.0.1:16161"); 将127.0.0.1上的from库.拷贝到t ...

  10. 【mongo】drop不释放磁盘空间

    用drop删除mongo的collection后,其size归零,但是storage仍然是原大小,磁盘空间没有被释放. 要用下面命令释放无用的磁盘空间 mongod -repair

随机推荐

  1. 微信小程序中supabase在线数据库使用指南

    在微信小程序中使用supabase在线数据库可以无需后端和服务器完成个人小项目的开发.本文记录我的使用过程,在阅读本文前,建议您先满足以下条件: 持有可用于开发的微信小程序 了解kexue上网 第一步 ...

  2. java 分批次读取大文件的三种方法

    1. java 读取大文件的困难java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&quo ...

  3. Java线程池详解:高效并发编程的核心利器

    Java线程池详解:高效并发编程的核心利器 在高并发的Java应用中,频繁创建和销毁线程是非常消耗系统资源的操作.线程池作为Java并发编程的核心组件,不仅能够复用线程.降低系统开销,还能有效控制并发 ...

  4. GitHub MCP Server - 无缝集成GitHub API的自动化工具

    GitHub MCP Server GitHub MCP Server是一个Model Context Protocol(MCP)服务器,提供与GitHub API的无缝集成,使开发者和工具能够实现高 ...

  5. Java源码分析系列笔记-6.ReentrantLock

    目录 1. 是什么 1.1. synchronized vs ReentranLock 2. 实现原理 2.1. uml图 3. 公平锁 3.1. 如何使用 3.2. 原理分析 3.2.1. 构造方法 ...

  6. [Java/字节流/BytesReader] 核心源码精讲: ByteArrayInputStream(字节数组输入流)

    概述 : ByteArrayInputStream(字节数组输入流) 简介 字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中. java.io.ByteArra ...

  7. linux0.01代码阅读

    代码地址: https://cdn.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz 代码目录: main函数: 代码中的命名解释: CMO ...

  8. Elastic学习之旅 (3) ES必备基本概念

    大家好,我是Edison. 上一篇:快速安装ELK ES都有哪些基本概念 在学习ES时,需要掌握一些必备概念,有了这些基本概念,后续的学习才会轻松.我们可以从下图中了解,ES都有哪些基本概念. 从上图 ...

  9. Jfinal启动报错-文件找不到

  10. C# 列出所有双色球的组合

    using System; class Program { static void Main(string[] args) { int[] redBalls = new int[33]; for (i ...