admin管理员组

文章数量:1614997

    1、由于文件被进程调用,通过rm删除了文件,但并未释放文件缓存空间

df -h

    2、查看已被删除但仍被进程调用的文件和进程

# lsof | grep deleted
kubeengin    1661    1668 kubeengin            root    2w      REG              253,0  307640681     786507 /opt/ubi/kubeengine/kubeenginelog.log (deleted)

    3、重启kubeengin进程

快速删除大文件方法:

    1. 通过重定向到 Null 来清空文件内容清空,通过 shell 重定向 null (不存在的事物)到该文件:

> fileName

    2.在 Linux 中, null 设备基本上被用来丢弃某个进程不再需要的输出流,或者作为某个输入流的空白文件,这些通常可以利用重定向机制来达到,所以 /dev/null 设备文件是一个特殊的文件,它将清空送到它这里来的所有输入,而它的输出则可被视为一个空文件。另外,你可以通过使用 cat命令 显示 /dev/null 的内容然后重定向输出到某个文件,以此来达到清空该文件的目的。

cat /dev/null > fileName

        或,我们将使用 cp命令 复制 /dev/null 的内容到某个文件来达到清空该文件的目的,具体如下所示:

cp /dev/null fileName

        而下面的命令中, if 代表输入文件,of 代表输出文件。

dd if=/dev/null of=fileName

    3. 使用 echo 命令清空文件

        使用 echo命令 将空字符串的内容重定向到文件中:

echo "" > fileName

        或者

echo > fileName

        注意:你应该记住空字符串并不等同于 null 。字符串表明它是一个具体的事物,只不过它的内容可能是空的,但 null 则意味着某个事物并不存在。基于这个原因,当你将 echo命令 的输出作为输入重定向到文件后,使用cat命令来查看该文件的内容时,你将看到一个空白行(即一个空字符串)。要将 null 做为输出输入到文件中,你应该使用 -n 选项,这个选项将告诉 echo 不再像上面的那个命令那样输出结尾的那个新行。

echo -n "" > fileName

    4. 使用 truncate 命令来清空文件内容
        truncate 可被用来将一个文件缩小或者扩展到某个给定的大小。你可以利用它和 -s 参数来特别指定文件的大小。要清空文件的内容,则在下面的命令中将文件的大小设定为 0:

truncate -s 0 fileName

    5.使用rsync命令
        假如你有一些特别大的文件要删除,比如nohup.out这样的实时更新的文件,动辄都是几十个G上百G的,也可以用rsync来清空大文件,而且效率比较高。

        1)创建空文件

touch/data/blank.txt

        2)用rsync清空文件

rsync -a --delete-before --progress --stats /root/blank.txt /root/nohup.out

        快速删除大量文件

        假如你要在linux下删除大量文件,比如100万、1000万,像/var/spool/clientmqueue/的mail邮件,/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf *可能就不好使了。 rsync 可以用来清空目录或文件,如下:

        1)先建立一个空目录

mkdir/data/blank

        2)用rsync删除目标目录

rsync --delete-before -d /data/blank/ /var/spool/clientmqueue/

这样目标目录很快就被清空了

        注:其中–delete-before 接收者在传输之前进行删除操作

为什么rsync能够快速删除大文件?

1)rm命令大量调用了lstat64和unlink,可以推测删除每个文件前都从文件系统中做过一次lstat操作。过程:正式删除工作的第一阶段,需要通过getdirentries64调用,分批读取目录(每次大约为4K),在内存中建立rm的文件列表;第二阶段,lstat64确定所有文件的状态;第三阶段,通过unlink执行实际删除。这三个阶段都有比较多的系统调用和文件系统操作。

2)rsync所做的系统调用很少:没有针对单个文件做lstat和unlink操作。命令执行前期,rsync开启了一片共享内存,通过mmap方式加载目录信息。只做目录同步,不需要针对单个文件做unlink。另外,在其他人的评测里,rm的上下文切换比较多,会造成System CPU占用较多——对于文件系统的操作,简单增加并发数并不总能提升操作速度。 总结:频繁做减法不如直接从头来过把文件系统的目录与书籍的目录做类比,rm删除内容时,将目录的每一个条目逐个删除(unlink),需要循环重复操作很多次;rsync删除内容时,建立好新的空目录,替换掉老目录,基本没开销。
参考

本文标签: 文件缓存空间