做linux系统时显示可用空间小,Linux系统下提示磁盘空间满,但实际占用却很小问题解决...

转载:http://blog.csdn.net/xx123er/article/details/51656218

node

现象:删除log后df看空间未释放python

解决方案:1.rm删除文件后,用lsof | grep XXX 查找使用该文件的进程,kill进程便可当即释放空间。linux

2.更好的方法是使用echo " ">file命令在线清空该文件。服务器

具体缘由分析和具体命令使用请详细阅读以下内容:数据结构

复现现象:1.写一个python程序,从public.log不停的复制内容写文件abc.txtspa

2. 运行程序后,看当前路径下文件.net

3,查看空间和df占用,删除正在被写的文件abc.txt,再次查看空间占用指针

能够看到删除了文件,空间并无释放,反而还在增长。对象

4.查看是什么进程占用了该文件,有两个python进程占用了该文件,后面的(deleted)表示该文件是已删除的blog

5.杀掉进程后,空间当即释放

更好的解决办法:

上面复现的过程已经有最基础的解决方案,就是找到占用文件的进程,杀进程,删文件,此解决方案太过粗暴,有如下理由

理由一:服务器中某些打log的进程是不能随意删除。

理由二:某个文件可能被多个进程占用,或者几十个进程占用,想释放空间就得杀掉因此进程。

解决方案二:采用将该文件置空的办法,执行echo " " >abc.txt

该方案能够在线清空log,但亲测执行时间过长,多是我每秒写600m的进程太特殊致使。须要权衡,若能够等或者进程不能停,就采用此方法,不然就采用kill进程的方法。

缘由探索:

Linux下文件的存储机制和存储结构:

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

在文件系统处理文件须要的信息都存放在索引节点(inode)中,若是在删除文件的时候索引节点的引用计数不为0(表示文件正在被使用),则不会在磁盘中真正的删除文件,从而保证正在使用此文件的进程可以正常的处理文件。

首先咱们一块儿来看一下内核中关于文件系统的一些关键数据结构的关联,当一个进程打开一个文件后,便会在内核中建立一个file对象,这个对象主要描述了进程如何与文件进行交互。file对象中将指向一个dentry结构(目录项),目录项中描述了目录项名称,父目录项信息,子目录项信息等。而dentry中的d_inode所指向的inode节点中则包含了实际的文件存储在磁盘上的信息。

当多个进程打开同一个文件时,内核中变会建立相应的file对象,可是他们都公用同一个dentry,只不过每一次打开文件dentry的引用计数d_count加1。而且对于打开的同一个文件而言,inode也是惟一的,inode的引用计数i_count通常为文件硬连接的数目。

验证上述说明:

1.后台往abc.txt写的脚本没停,继续写,将文件重命名为abc.log

2.删除重命名后的文件

3.删除后用df命令发现所占空间没有减少,查看占用进程发现abc.txt没有进程占用,重命名后的abc.log有进程占用,说明重命名该文件,但inode并无改变,linux经过inode来查找对应文件,因此继续往重命名后的文件写入。

Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来讲,文件名只是inode号码便于识别的别称或者绰号。表面上,用户经过文件名,打开文件。实际上,系统内部这个过程分红三步:首先,系统找到这个文件名对应的inode号码;其次,经过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

Linux环境下,处理磁盘空间,导致数据库无法正常使用的处理方法: 第一步:查看磁盘空间的使用情况 df -f 第二步:找到日志文件,并清理 1) 进入跟目录 cd / 2)查找日志文件(区分大小写) find -name *.Log; find -name *.log; find -name *.000; 第三步:进入到相应的目录,并删除日志文件 如: cd ./home1/data/db2inst2/NODE0000/SQL00001/SQLOGDIR/; rm -f *.LOG; 或者 rm -f *.log; 或者 rm -f *.000; linux下DB2管理命令 1:进入实例 su - db2inst2 2:查看某个库的表空间 db2pd -tablespaces -db mcmxfb 3:查看这个模式下所有活动库的表空间 db2pd -tablespaces -alldbs option and active database; 4: 系统重启后,对数据库的重启,首先要进入到实例下,再执行重启数据库的命令。系统会重启这个实例下的各个数据库 db2start; (注意,不同的实例,要分别进入各个实例,再重启); root用户下,重启系统的方法: 重启命令: 1、reboot 2、shutdown -r now 立刻重启(root用户使用) 3、shutdown -r 10 过10分钟自动重启(root用户使用) 4、shutdown -r 20:35 在间为20:35候重启(root用户使用) 关机命令: 1、halt 立刻关机 2、poweroff 立刻关机 3、shutdown -h now 立刻关机(root用户使用) 4、shutdown -h 10 10分钟后自动关机 Linux环境下,磁盘空间,导致db2数据库无法正常使用。这里解决的,主要是日志文件和环境文件占用磁盘空间太多所引起问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值