- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Linux下自动清理大量文件的方案探究由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
定期清理过期文件和垃圾文件,维持文件系统合理的空间使用率,是一个系统管理员的日常工作。对于中小规模文件系统而言,简单的系统命令或者脚本都就可以实现;但是对于拥有数亿甚至数十亿数文件的大型、超大型文件系统,文件清理就变成一项艰巨的任务。如果确定哪些文件需要被清理,怎样清理大批量文件,怎样确保清理性能,都是系统管理员需要解决的难题。本文探讨了 Linux 下大批量文件自动清理的相关命令和方法,以及实际操作中的最佳实践.
文件自动清理的需求 系统管理员的手中,管理着企业最有价值的资产——数据;而占据企业级服务器操作系统市场半壁江山的 Linux,更是让 Linux 系统管理员成为最重要的资产管理员。管理员的职责,就是让有限的 IT 资源,存储最有价值的数据。1991 年 IBM 推出 3.5 英寸 1GB 硬盘的时候,管理员洞悉硬盘上的每个文件,人工就可以实现文件管理;而今天 PB 级的存储设备,则给文件管理带来了前所未有的挑战。 文件删除操作,用过 Linux 的人都应该可以完成。那么以下这些文件删除操作,你能完成哪些? 删除整个文件系统中以特定后缀结尾的文件、 在一个有 1 百万的文件系统中删除某个指定文件、 从一个千万级的文件系统里,删除指定日期创建的 10 万个文件、 在亿级文件系统里,每天执行文件系统清理,删除 1 年前产生的上百万文件.... 下面要讨论就是如何实现以上文件删除操作的策略和方法,如果以上操作对你来说轻而易举,可以忽略本文。 对于清理文件系统而言,我们可以简单的把清理任务分成两大类,清理过期文件和清理垃圾文件.
过期文件 任何数据都有自己的生命周期,数据的生命周期曲线告诉我们,数据在产生和产生之后的一段时间内的价值最大,然后数据价值随着时间衰减。当数据生命周期结束时,就应该删除这些过期文件,将存储空间释放出来留给有价值的数据。 垃圾文件 系统运行过程中,会产生各种各样的临时文件,些应用程序运行时的临时文件,系统错误产生的 Trace 文件,Core Dump 等等,在这些文件被处理后,就失去了保留价值,这些文件可以统称为垃圾文件。及时清理垃圾文件,有助于系统维护和管理,保证系统稳定有效的运行.
文件自动清理的概述 文件自动清理的特点与方法 在指定绝对路径下删除一个文件,rm 就可以实现;如果只知道文件名,不知道路径,我们可以通过 `find` 找到它,然后删除。推而广之,如果我们可以根据预设的条件找到指定文件,我们就可以实施删除操作。这也就是文件自动清理的基本思路,根据预设条件生成待删除文件列表,然后执行定期清除任务实施删除操作。 对于过期文件而言,他们共同标志是时间戳,根据不同的文件系统,可能是文件创建时间,访问时间,过期时间等不同的时间属性。由于过期文件大多存在于归档系统上,这类文件的特点是数量巨大,对于大型系统而言,每天的过期文件数量都可能达到数十万甚至百万的数量级。对于如此规模的文件数量,扫描文件系统,生成文件列表就需要大量的时间,所以文件清理性能是此类人物不得不考虑的问题。 对于垃圾文件而言,有可能会是存放在特定目录下的文件,也有可能是是以特殊后缀名结尾的文件,还有可能是因为系统错误产生的 0 尺寸或者超大尺寸的文件,对于这些文件而言,文件数量一般不大,但是种类比较繁多,情况比较复杂,需要根据系统管理员的经验,制定比较细致的文件查询条件,定期扫描,生成文件列表,然后进行进一步处理.
相关 Linux 命令简介 常用的文件系统管理命令包括 `ls`,`rm`,`find` 等等。鉴于这些命令都是常见的系统管理命令,在此不做赘述,详细用法请参见命令帮助或者 Linux 使用手册。由于大规模文件系统一般都存储在专用的文件系统上,这些文件系统都提供了独有的命令进行文件系统管理。本文实践章节以 IBM 的 GPFS 文件系统举例,以下简要介绍 GPFS 的若干文件系统管理命令。 mmlsattr 此命令主要用于查看 GPFS 文件系统中文件的扩展属性,如存储池信息,过期时间等属性。 mmapplypolicy GPFS 采用策略对文件进行管理,此命令可以根据用户定义的策略文件,对 GPFS 文件系统执行各种操作,具有非常高的效率.
大批量文件自动清理的难点 Linux 文件删除机制 Linux 是通过 link 的数量来控制文件删除,只有当一个文件不存在任何 link 的时候,这个文件才会被删除。每个文件都有 2 个 link 计数器—— i_count 和 i_nlink。i_count 的意义是当前使用者的数量,i_nlink 的意义是介质连接的数量;或者可以理解为 i_count 是内存引用计数器,i_nlink 是硬盘引用计数器。再换句话说,当文件被某个进程引用时,i_count 就会增加;当创建文件的硬连接的时候,i_nlink 就会增加。 对于 rm 而言,就是减少 i_nlink。这里就出现一个问题,如果一个文件正在被某个进程调用,而用户却执行 rm 操作把文件删除了,会出现什么结果呢?当用户执行 rm 操作后,ls 或者其他文件管理命令不再能够找到这个文件,但是进程却依然在继续正常执行,依然能够从文件中正确的读取内容。这是因为,`rm` 操作只是将 i_nlink 置为 0 了;由于文件被进程饮用的缘故,i_count 不为 0,所以系统没有真正删除这个文件。i_nlink 是文件删除的充分条件,而 i_count 才是文件删除的必要条件。 对于单个文件删除而言,我们可能完全不需要关心这个机制,但是对于大批量文件删除,这却是一个非常重要的因素,请允许我在随后章节中详细阐述,此处请先记下 Linux 的文件删除机制.
生成待删除列表 当一个文件夹下面有 10 个文件的时候,`ls` 可以一目了然,甚至可以用 `ls – alt` 查看所有文件的详细属性;当文件变成 100 个的时候,`ls` 可能只能看一看文件名了;文件数量上涨到 1000,多翻几页可能还能接受;如果是 10,000 呢? `ls` 可能需要等上半天才能有结果;再扩展成 100,000 的时候,绝大多数系统可能都没有反应,或者“Argument list too long”了。不止是 `ls` 会遇到这样的问题,其它的常用 Linux 系统管理命令都会遇到类似的问题,Shell 有参数来限制命令的长度。就算我们可以通过修改 Shell 参数来扩展命令长度,但这并不能提高命令的执行效率。对一个超大规模的文件系统而言,等待 `ls` 和 `find` 等常用文件管理命令的返回的时间是不可接受的. 那么我们如何能够在更大数量级的文件系统上生成删除文件列表呢?一个高性能的文件系统索引是一个好方法,不过高性能的文件索引是少数人的专利(这也解释了为什么 google 和 baidu 能这么赚钱)。好在如此规模的文件系统一般都只存在于高性能文件系统里面,这些文件系统都提供了非常强大的文件管理功能。譬如前面提到的 IBM 通用并行文件系统(GPFS)的 mmapplypolicy,通过直接扫描 inode 来快速扫描整个文件系统,并能够根据指定条件返回文件列表。下面会演示如何根据时间戳和文件类型来获取文件列表.
死锁对文件删除性能的影响 对于一个每天定时执行文件删除任务系统,首先生成待删除文件,然后把该列表作为输入执行删除操作;如果某天待删除列表特别大,导致第一天的删除任务还没有完成,第二天的删除任务就启动了,会有什么结果呢? 第一天还没有来得及被删除的文件会出现在第二天的删除文件列表中,然后第二天的文件删除进程会把它做为输出执行删除操作。此时,第一天的删除进程和第二天的删除都会尝试去删除相同的文件,系统抛出大量的 unlink 失败的错误,删除性能会受到很大的影响。删除性能的下降,会导致第二天的文件依然没有被删除,第三天的删除进程会加剧删除文件的死锁,进入删除性能下降的恶性循环。 如果简单的删除第一天生成的待删除列表,能够解决上述问题吗?不能。如前文所述的 Linux 文件删除机制,删除第一天的文件列表文件只能把该文件的 i_nlink 清零,当第一天的文件删除进程没有结束的时候,该文件的 i_count 就不为零,因而该文件不会被删除。直到该进程处理完列表中的所有文件,进程退出,第一天的待删除列表文件才真正被删除了。 我们至少需要在新的文件删除进程启动以前,把系统中其它的文件删除进程终止,才能保证不会发生删除死锁的情况。但是这样做,依然存在一些弊端。考虑到极端情况下,如果连续一段时间删除进程都无法在一个周期内完成删除任务,那么待删除列表就会不断增长,文件扫描时间会延长,进而挤占文件删除进程的工作时间,陷入另外一个恶性循环。 而且实战经验告诉我们,当删除列表特别巨大时,删除进程的工作性能也有所下降。而一个适当大小的参数输入文件,能够保证进程有效执行。所以,按照固定尺寸将待删除列表文件分割成一系列文件,能够让删除操作稳定高效的执行。而且,在存储和主机性能允许的前提下,分割为多个文件还可以允许我们并发执行多个删除进程.
大批量文件自动清理的最佳实践 GPFS 文件系统下大规模额外年间自动清理的最佳实践 以下是在一个千万级的 GPFS 文件系统上进行的文件自动清理实践:硬件环境为两台 IBMx3650 服务器和存储容量为 50TB 的 DS4200 磁盘阵列,安装了 Linux 操作系统和 GPFS v3.2。目标是每天 2:00AM 执行文件清理操作,删除 30 天以前的文件和所有以 tmp 为结尾的文件。 mmapplypolicy 扫描结果显示该系统上有 323,784,950 个文件,158,696 个文件夹。 。
最后此篇关于Linux下自动清理大量文件的方案探究的文章就讲到这里了,如果你想了解更多关于Linux下自动清理大量文件的方案探究的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我应该编写一个函数来打印一组给定的三个数字中两个较大数字的平方和。 我对这种情况的处理相当笨拙。我没有编写返回一组 3 中最大的两个数字的函数,而是编写了函数,以便表达式减少到两个所需的数字。 # S
如果有人可以提供帮助,我将不胜感激。我一直在敲我的头一天试图让这个工作。我已经在互联网上搜索并重新阅读了手册,但我就是不明白。 guile << __EOF__ ( define heading-li
目前我正在处理一个方案问题,其中我们正在使用方案列表表示一个图。我们使用的第一个变体是表示为 的边列表图 '((x y) (y z) (x z)) 我们正在使用的图的第二个变体被称为 x 图,表示为
我正在尝试创建一个函数,该函数将两个函数作为参数并执行它们。 我尝试使用 cond ,但它只执行 action1 . (define seq-action (lambda (action1 act
我提前为我的原始英语道歉;我会尽量避免语法错误等。 两周前,我决定更新我对 Scheme(及其启示)的知识,同时实现我在手上获得的一些数学 Material ,特别是我注册的自动机理论和计算类(cla
Scheme中有没有函数支持分数的“div”操作? 意思是 - 11 格 2.75 = 4。 最佳答案 我认为你的问题的答案是:没有,但你可以定义它: #lang racket (define (di
我在scheme中实现合并排序,我必须通过定义两个辅助方法来实现:merge和split。 Merge 需要两个列表(已经按递增顺序)并将它们合并在一起。我这样做了如下: (define merge
尝试从终端加载方案文件。我创建了一个名为 test.scm 的文件,其中包含以下代码: (define (square x) (* x x)) (define (sum-of-squares x y)
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我有点了解如何将基本函数(例如算术)转换为Scheme中的连续传递样式。 但如果函数涉及递归怎么办?例如, (define funname (lambda (arg0 arg1)
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
这个问题已经有答案了: How do I pass a list as a list of arguments in racket? (2 个回答) 已关闭 8 年前。 我有一个函数,它需要无限数量的
我对这段代码的工作方式感到困惑: (define m (list 1 2 3 '(5 8))) (let ((l (cdr m))) (set! l '(28 88))) ==>(1 2 3 (5 8
我正在为学校做一项计划作业,有一个问题涉及我们定义记录“类型”(作为列表实现)(代表音乐记录)。 我遇到的问题是我被要求创建一个过程来创建这些记录的列表,然后创建一个将记录添加到该列表的函数。这很简单
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
如何使用抽象列表函数(foldr、foldl、map 和 filter 编写函数),无需递归,消耗数字列表 (list a1 a2 a3 ...) 并产生交替和 a1 - a2 + a3 ...? 最
我试图找出在 Scheme 中发生的一些有趣的事情: (define last-pair (lambda (x) (if (null? (cdr x))
这个问题在这里已经有了答案: Count occurrence of element in a list in Scheme? (4 个答案) 关闭 8 年前。 我想实现一个函数来计算列表中元素出现
我正在尝试使用下面的代码获取方案中的导数。谁能告诉我哪里出错了?我已经尝试了一段时间了。 (define d3 (λ (e) (cond ((number? e) 0) ((e
我是一名优秀的程序员,十分优秀!