Linux 离奇磁盘爆满,如何解决?| 原力计划
nanshan 2024-11-14 16:45 27 浏览 0 评论
作者 | 一得的跋涉
责编 | 伍杏玲
出品 | CSDN博客
对于 Linux 磁盘满的问题,我们通常的处理思路是用 du 查找可清理的大文件,然后临时删掉让磁盘使用率先降下来,从而尽快保证磁盘能继续写入。
但是,有一些情况的处理效果不太一样,du/df 呈现的结果可能还会让人迷惑不解。下面,我就分享下几个工作中遇到过的较离奇的磁盘满问题。
被忽略的隐藏文件
1、认识 swapfile
Linux 的交换文件 swapfile 的产生场景较普遍,而且也是以隐藏文件的形式存在的,因此这里主要聊聊 swapfile 这一类的隐藏文件。
当用 vim 打开一个文件时,都会产生一个 .swp 的临时隐藏交换文件,用来备份缓冲区中的内容。
当文件非正常关闭(比如直接关闭终端或者电脑断电等)时,.swp文件不会被删除,这样就可以用此文件来恢复文件。(注意当正常关闭时,此文件会被删除;且如果只是读取文件,不会产生 .swp 文件)
而且,如果 vim 意外退出后,又重新打开文件二次编辑,那么旧的 .swp 文件会继续保留,并产生新的 .swo 临时隐藏文件。
如果二次编辑的时候,vim 又异常退出了,那么还会继续产生新的临时隐藏文件.swn、.swm、 .swl ……
2、处理建议
有些隐藏文件的磁盘占用也挺大:
:/tmp # ll -rth | grep G
total 17.7G
-rw------- 1 xxxx users 17.6G 2020-02-12 18:27 .sqlkfJTFl.swp
所以有时候碰到大隐藏文件导致磁盘满的情况,如果没能发现这些隐藏文件,就会觉得离奇和疑惑。
所以在排查磁盘满问题的时候,可以通过执行 vim -r 来查看和检查下所有临时交换文件的大小;或者通过 ls -lha 把所有隐藏文件都列出来看看大小。
如果不想留 swapfile 这个特性,可以考虑关掉 swapfile :
vim /etc/vimrc
# 添加如下配置
set noswapfile # 禁止在编辑时候产生此文件;
但是注意这仅限于对文件损失可以容忍的情况下;如果不能容忍文件损失,那还是建议还是打开 swapfile:
vim /etc/vimrc
# 添加如下配置
set swapfile # 则是在编辑时候产生此文件;
未释放的已删除文件
1、du 和 df 不一致
如果隐藏文件因素排除了,还是发现 du 出来的大小诡异,比如 du 发现磁盘并没有用满,但是 df 看到磁盘使用率却是 100% 。
这又会是什么原因呢?
这时候,通常就得怀疑有一些已删除的文件,还被一些进程 hold 住句柄没释放,导致这些文件虽然已经删除,也的确看不到了,但是却还占着磁盘空间;
从而导致 du 和 df 出来的磁盘使用结果不一致的情况。
2、处理建议
通过执行 lsof | grep deleted 可以找到那些没有释放磁盘空间的文件和进程,
然后通过重启对应进程,就可以达到释放已删除文件占用的空间的目的。
这个帖子 《 清空热文件的常见错误操作 》 阐述了 “已删除文件还占用磁盘” 的产生场景和处理方式。
另外,对于这种情况,还有个错误的处理方法,这里特别提醒下:
有些同学在找到未释放已删除文件的 pid 之后,可能会直接通过 kill pid 来达到释放已删除文件的目的。
这种做法确实能够释放已删除文件,从而释放磁盘空间,但是这种做法是有副作用的,危害可大可小。
如果在离线环境这么操作,影响一般不大;但是如果在生产环境这么操作的话,那就可能搞出故障来了。
我们假设这么一种场景:
生产环境的某程序由于某种Bug,一直不会释放日志文件,而分时写入的日志文件又是有过期删除机制的,这样一直持续下去,就会发现服务器上有大量的已过期删除日志文件还占用着磁盘空间,直到产生磁盘满风险。
那么这个时候如果直接通过 kill pid 来处理的话,就直接把生产环境的在线程序直接干掉了;这个后果就可想而知了:在这个程序被守护进程拉起来之前,这个服务都是不可用的。
挂载引发的悬案
1、消失的空间
如果执行 ls -lha 并没有发现大隐藏文件,执行 lsof | grep deleted 也没有发现未释放的已删除文件;但是 df 看到根目录确实达到 100% 了 ,而 du 出来的根目录实际使用空间却并没有用满 。
这又会是什么原因呢?
出现这种情况的时候,请回忆下最近这台磁盘异常的机器,是否检修 或者 换过磁盘?
根目录出现这种离奇现象,通常就是在检修/更换磁盘的时候(这里假设是更换/data1 ),新磁盘还没挂载就开始往 /data1 写数据了,这时候由于还没挂载新盘,所以写入数据占用的是根目录的空间。
然后换好/data1 盘并重新挂载上去后,原本放在 /data1 的数据,也不会出现在挂载盘上,还是继续占用根目录的空间。
所以这时候就会出现这样的现象:
挂载后 du /data1 并不大 ,但是挂载前 /data1目录写入的数据实际却占用了根目录空间;而且这个数据在挂载后是看不到的,因此很难发现。于是就会发现根目录有一些空间似乎凭空消失了,相当诡异。
2、处理建议
2.1 解决方法
怎么确认是新的挂载盘掩盖了一些数据呢?把新的挂载盘 /data1 umount掉,然后再看看 /data1 占用的空间就知道了。
如果 umount提示 busy,可以通过执行以下命令来解决:
fuser -kmvi /data1 && umount /data1
卸载后,就会发现 /data1 目录下确实有大量文件,删除后,再 mount -a 重新挂载,然后根目录消失的磁盘空间,一般就能找回来了。
2.2 测试验证
如果还不放心的话,清理完数据再次挂载后,可以简单测试下:
dd if=/dev/zero of=/data1 bs=1M count=20000
往 /data1 大概写个 20G 数据,再观察下根目录的空间是否受影响,如果不受影响就说明问题解决!
2.3 给个建议
针对根目录这类离奇问题:建议在每次更换磁盘重新做挂载动作之前,检查一下根目录的空间使用情况;如果存在错误写入数据的情况,需要及时清理,然后再进行新盘挂载,切记。
原文链接:
https://blog.csdn.net/weixin_44648216/article/details/104505890
声明:本文系CSDN博主原创文章,版权归作者所有。
相关推荐
- 0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)
-
文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...
- ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes
-
为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...
- 生产环境starrocks 3.1存算一体集群部署
-
集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...
- 在CentOS上添加swap虚拟内存并设置优先级
-
现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...
- 国产深度(deepin)操作系统优化指南
-
1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...
- postgresql-15.4 多节点主从(读写分离)
-
1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...
- Docker 容器 Java 服务内存与 GC 优化实施方案
-
一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...
- 虚拟内存设置、解决linux内存不够问题
-
虚拟内存设置(解决linux内存不够情况)背景介绍 Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...
- Elasticsearch性能调优(5):服务器配置选择
-
在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...
- Es如何落地
-
一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...
- 针对Linux内存管理知识学习总结
-
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...
- MySQL进阶之性能优化
-
概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...
- Linux Cgroups(Control Groups)原理
-
LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...
- linux 常用性能优化参数及理解
-
1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...
- 如何在 Linux 中使用 Sysctl 命令?
-
sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)