Linux下清理大批量文件最佳实践

2019-04-20 08:53:55来源:华彩软件站 阅读 ()

新老客户大回馈,云服务器低至5折

Linux下清理大批量文件最佳实践


来源:51CTO



  系统管理员的手中,管理着企业最有价值的资产——数据;而占据企业级服务器操作系统市场半壁江山的 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 就不为零,因而该文件不会被删除。直到该进程处理完列表中的所有文件,进程退出,第一天的待删除列表文件才真正被删除了。


  我们至少需要在新的文件删除进程启动以前,把系统中其它的文件删除进程终止,才能保证不会发生删除死锁的情况。但是这样做,依然存在一些弊端。考虑到极端情况下,如果连续一段时间删除进程都无法在一个周期内完成删除任务,那么待删除列表就会不断增长,文件扫描时间会延长,进而挤占文件删除进程的工作时间,陷入另外一个恶性循环。


  而且实战经验告诉我们,当删除列表特别巨大时,删除进程的工作性能也有所下降。而一个适当大小的参数输入文件,能够保证进程有效执行。所以,按照固定尺寸将待删除列表文件分割成一系列文件,能够让删除操作稳定高效的执行。而且,在存储和主机性能允许的前提下,分割为多个文件还可以允许我们并发执行多个删除进程。


  简单的分区调整操作通常都能顺利完成。但是,有时候您需要做一些不同的事情或者排除故障,本文涵盖了其中的一些情况。本文第一部分介绍 LVM 配置及其如何与分区调整相互作用。第二部分介绍故障排除技术。要详尽地描述调整分区时可能出现的所有问题,足够写本书了,但是几个基本的原则可以帮助您解决常见问题。最后,本文介绍了几个调整分区的备选方案,如果您遇到的问题无法逾越时,可以使用。


  调整 LVM 大小


  LVM 是一个磁盘分配技术,补充或替换传统分区。在 LVM 配置中,一个或多个分区,或者甚至是整个磁盘,被分配为卷组 中的物理卷,卷组转而分成逻辑卷。然后在逻辑卷上创建文件系统,这就像传统配置中的分区。这种磁盘分配方法复杂性增加了,但好处是比较灵活。一个 LVM 配置使得将几个小磁盘的磁盘空间合并成一个大的逻辑磁盘成为可能。对于分区调整来说,更重要的是逻辑磁盘可以被创建、删除和重新分配大小,就像文件系统中的文件那样;您不需要考虑分区起始点,只需要考虑它们的绝对大小。


  注意:本文中我不想介绍如何建立一个 LVM。如果您还没有使用一个 LVM 配置,您可以将您的系统转换为使用它的系统,但您可以参考其他文档,比如 Linux LVM HOWTO学习怎样做。


  调整物理卷大小


  如过您已经调整了非 LVM 分区,如本系列第 1 部分所述,而现在想要向您的 LVM 配置添加空间,您有两个选择:


  您可以在空白空间中创建一个新分区,然后将这个新分区添加到您的 LVM。


  如果有一个 LVM 分区与新空间相邻,您可以调整这个现有分区的大小。


  不幸的是,GParted(也称为 Gnome Partition Editor)工具,如本系列第 1 部分所述,不支持调整 LVM 分区大小。因此向您的卷组添加空间最简单的方法是在剩余空间中创建一个新分区,并将其作为一个新物理卷添加到现有的卷组中。


  尽管 GParted 不能直接创建一个 LVM 分区,但您可以使用以下工具来进行创建:


  parted(文本模式 GNU Parted)


  fdisk 用于 Master Boot Record (MBR) 磁盘


  gdisk 用于全局唯一标识符(GUID)Partition Table (GPT) 磁盘


  如果您使用 parted,那么您可以使用 set 命令来打开 lvm 标记,正如在 set 1 lvm on 中标记分区 1 作为一个 LVM 分区。如果使用 fdisk,您可以使用 t 命令来将分区类型代码设置为 8e。在 gdisk 中您可以同样这样做 ,除非 LVM 分区的类型为 8e00。


  无论是那种情况,您都必须使用 pvcreate 命令来在分区上设置基本 LVM 数据结构,然后使用 vgextend 代码将分区添加到卷组。例如,要将 /dev/sda1 添加到现有的 MyGroup 卷组,输入以下命令:


  pvcreate /dev/sda1 vgextend MyGroup /dev/sda1


  完成这些修改之后,您就可以在您的卷组中扩展逻辑卷了,正如之前描述的。


  调整逻辑卷大小


  对于文件系统,调整逻辑卷大小比调整分区大小要简单一些,因为 LVM 以分区的形式避免了预留相邻编号扇区集合。调整逻辑卷本身可以通过 lvresize 方法完成。该命令带有一些选项(详情参见其 手册 页),最重要的是 -L,它需要一个新的大小,或者在原大小上进行修改,修改可以通过首位的加号(+)或者减号(-)表示。您必须提供到逻辑卷的路径。例如,假设您想要在 MyGroup 组中将 usr 逻辑卷的大小增加 5 gibibytes(GIB)。您应该进行如下操作:


  lvresize -L +5G /dev/mapper/MyGroup-usr


  该命令调整了特定逻辑卷的大小。记住,这种改变就像对单独一个分区进行的。也就是说,包含在逻辑分区中的文件系统的大小不会改变。为了调整文件系统,您必须使用一个特定文件系统工具。比如resize2fs、resizereiserfs、xfs_growfs 或者挂载 Journaled File System (JFS) 时的 resize 挂载选项。如果不使用大小选项,所有这些工具将调整文件系统来填满逻辑卷大小,在增加一个逻辑卷时这是很方便的。


  如果您想要缩小一个逻辑卷,任务就有点复杂。首先您必须调整文件系统大小(使用 resize2fs 或者类似工具),然后缩小逻辑卷来匹配新的大小。如果您故意将逻辑卷的大小设置的太小,那么就有潜在的破坏错误,因此,我建议您,首先缩小文件系统,使其比您的目标大小小很多,接着将逻辑卷调整到合适的大小,然后调整文件系统大小,最后再增加逻辑卷大小,依赖于自动调整特性来使文件系统正好填满新逻辑卷。


  同时也要记住,尽管您可以缩小大多数本地 linux 文件系统,但您不能缩小 XFS 或 JFS。如果您需要缩小一个含有此类文件系统的逻辑卷,您可能必须创建一个新的、更小的逻辑卷,将第一个卷中的内容复制到新卷中,颠倒挂载点,然后删除原始卷。如果您缺少足够的可用空间来进行这一操作,您可能会被迫使用一个备份作为中转。


  使用 GUI LVM 工具


  尽管之前介绍的文本模式工具可以完成这项工作,但是它们是令人生畏的。如果您喜欢使用图形化用户界面(GUI)工具,至少有两个可用于 LVM 操作:


  kvpm — 这是一个集成了 K Desktop Environment (KDE) 的工具,支持访问常见 LVM 操作,包括逻辑卷调整选项。


  system-config-lvm — 这个程序源自于 Red Hat,但是也可用于其他版本。它类似于 kvmp,它支持使用点选式访问方法来访问 LVM 管理,包括调整大小操作。


  二者之中,system-config-lvm 提供一个更为简单友好的用户界面;而它们都可以完成工作。图 1 展示了运转中的 system-config-lvm。要调整逻辑卷,需要在左面板单击其名字,然后单击中间面板的 Edit Properties 按钮。然后您可以使用一个滑块来调整卷大小。


  图 1. GUI 工具调整逻辑卷大小相对较为容易


  



原文链接:http://www.huacolor.com/article/18414.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Windows不重启就使环境变量修改生效

下一篇:Windows资源管理器命令行参数