佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Linux下自動(dòng)清理大量文件的方案探究

Linux下自動(dòng)清理大量文件的方案探究

熱門標(biāo)簽:美團(tuán) 外呼系統(tǒng) 解決方案 家政服務(wù)網(wǎng)絡(luò) 硅谷的囚徒呼叫中心 電話機(jī)器人搭建 服務(wù)器配置 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式

定期清理過(guò)期文件和垃圾文件,維持文件系統(tǒng)合理的空間使用率,是一個(gè)系統(tǒng)管理員的日常工作。對(duì)于中小規(guī)模文件系統(tǒng)而言,簡(jiǎn)單的系統(tǒng)命令或者腳本都就可以實(shí)現(xiàn);但是對(duì)于擁有數(shù)億甚至數(shù)十億數(shù)文件的大型、超大型文件系統(tǒng),文件清理就變成一項(xiàng)艱巨的任務(wù)。如果確定哪些文件需要被清理,怎樣清理大批量文件,怎樣確保清理性能,都是系統(tǒng)管理員需要解決的難題。本文探討了 Linux 下大批量文件自動(dòng)清理的相關(guān)命令和方法,以及實(shí)際操作中的最佳實(shí)踐。


文件自動(dòng)清理的需求
系統(tǒng)管理員的手中,管理著企業(yè)最有價(jià)值的資產(chǎn)——數(shù)據(jù);而占據(jù)企業(yè)級(jí)服務(wù)器操作系統(tǒng)市場(chǎng)半壁江山的 Linux,更是讓 Linux 系統(tǒng)管理員成為最重要的資產(chǎn)管理員。管理員的職責(zé),就是讓有限的 IT 資源,存儲(chǔ)最有價(jià)值的數(shù)據(jù)。1991 年 IBM 推出 3.5 英寸 1GB 硬盤的時(shí)候,管理員洞悉硬盤上的每個(gè)文件,人工就可以實(shí)現(xiàn)文件管理;而今天 PB 級(jí)的存儲(chǔ)設(shè)備,則給文件管理帶來(lái)了前所未有的挑戰(zhàn)。
文件刪除操作,用過(guò) Linux 的人都應(yīng)該可以完成。那么以下這些文件刪除操作,你能完成哪些?
刪除整個(gè)文件系統(tǒng)中以特定后綴結(jié)尾的文件、
在一個(gè)有 1 百萬(wàn)的文件系統(tǒng)中刪除某個(gè)指定文件、
從一個(gè)千萬(wàn)級(jí)的文件系統(tǒng)里,刪除指定日期創(chuàng)建的 10 萬(wàn)個(gè)文件、
在億級(jí)文件系統(tǒng)里,每天執(zhí)行文件系統(tǒng)清理,刪除 1 年前產(chǎn)生的上百萬(wàn)文件....
下面要討論就是如何實(shí)現(xiàn)以上文件刪除操作的策略和方法,如果以上操作對(duì)你來(lái)說(shuō)輕而易舉,可以忽略本文。
對(duì)于清理文件系統(tǒng)而言,我們可以簡(jiǎn)單的把清理任務(wù)分成兩大類,清理過(guò)期文件和清理垃圾文件。


過(guò)期文件
任何數(shù)據(jù)都有自己的生命周期,數(shù)據(jù)的生命周期曲線告訴我們,數(shù)據(jù)在產(chǎn)生和產(chǎn)生之后的一段時(shí)間內(nèi)的價(jià)值最大,然后數(shù)據(jù)價(jià)值隨著時(shí)間衰減。當(dāng)數(shù)據(jù)生命周期結(jié)束時(shí),就應(yīng)該刪除這些過(guò)期文件,將存儲(chǔ)空間釋放出來(lái)留給有價(jià)值的數(shù)據(jù)。
垃圾文件
系統(tǒng)運(yùn)行過(guò)程中,會(huì)產(chǎn)生各種各樣的臨時(shí)文件,些應(yīng)用程序運(yùn)行時(shí)的臨時(shí)文件,系統(tǒng)錯(cuò)誤產(chǎn)生的 Trace 文件,Core Dump 等等,在這些文件被處理后,就失去了保留價(jià)值,這些文件可以統(tǒng)稱為垃圾文件。及時(shí)清理垃圾文件,有助于系統(tǒng)維護(hù)和管理,保證系統(tǒng)穩(wěn)定有效的運(yùn)行。

文件自動(dòng)清理的概述
文件自動(dòng)清理的特點(diǎn)與方法
在指定絕對(duì)路徑下刪除一個(gè)文件,rm 就可以實(shí)現(xiàn);如果只知道文件名,不知道路徑,我們可以通過(guò) `find` 找到它,然后刪除。推而廣之,如果我們可以根據(jù)預(yù)設(shè)的條件找到指定文件,我們就可以實(shí)施刪除操作。這也就是文件自動(dòng)清理的基本思路,根據(jù)預(yù)設(shè)條件生成待刪除文件列表,然后執(zhí)行定期清除任務(wù)實(shí)施刪除操作。
對(duì)于過(guò)期文件而言,他們共同標(biāo)志是時(shí)間戳,根據(jù)不同的文件系統(tǒng),可能是文件創(chuàng)建時(shí)間,訪問(wèn)時(shí)間,過(guò)期時(shí)間等不同的時(shí)間屬性。由于過(guò)期文件大多存在于歸檔系統(tǒng)上,這類文件的特點(diǎn)是數(shù)量巨大,對(duì)于大型系統(tǒng)而言,每天的過(guò)期文件數(shù)量都可能達(dá)到數(shù)十萬(wàn)甚至百萬(wàn)的數(shù)量級(jí)。對(duì)于如此規(guī)模的文件數(shù)量,掃描文件系統(tǒng),生成文件列表就需要大量的時(shí)間,所以文件清理性能是此類人物不得不考慮的問(wèn)題。
對(duì)于垃圾文件而言,有可能會(huì)是存放在特定目錄下的文件,也有可能是是以特殊后綴名結(jié)尾的文件,還有可能是因?yàn)橄到y(tǒng)錯(cuò)誤產(chǎn)生的 0 尺寸或者超大尺寸的文件,對(duì)于這些文件而言,文件數(shù)量一般不大,但是種類比較繁多,情況比較復(fù)雜,需要根據(jù)系統(tǒng)管理員的經(jīng)驗(yàn),制定比較細(xì)致的文件查詢條件,定期掃描,生成文件列表,然后進(jìn)行進(jìn)一步處理。


相關(guān) Linux 命令簡(jiǎn)介
常用的文件系統(tǒng)管理命令包括 `ls`,`rm`,`find` 等等。鑒于這些命令都是常見(jiàn)的系統(tǒng)管理命令,在此不做贅述,詳細(xì)用法請(qǐng)參見(jiàn)命令幫助或者 Linux 使用手冊(cè)。由于大規(guī)模文件系統(tǒng)一般都存儲(chǔ)在專用的文件系統(tǒng)上,這些文件系統(tǒng)都提供了獨(dú)有的命令進(jìn)行文件系統(tǒng)管理。本文實(shí)踐章節(jié)以 IBM 的 GPFS 文件系統(tǒng)舉例,以下簡(jiǎn)要介紹 GPFS 的若干文件系統(tǒng)管理命令。
mmlsattr
此命令主要用于查看 GPFS 文件系統(tǒng)中文件的擴(kuò)展屬性,如存儲(chǔ)池信息,過(guò)期時(shí)間等屬性。
mmapplypolicy
GPFS 采用策略對(duì)文件進(jìn)行管理,此命令可以根據(jù)用戶定義的策略文件,對(duì) GPFS 文件系統(tǒng)執(zhí)行各種操作,具有非常高的效率。

大批量文件自動(dòng)清理的難點(diǎn)
Linux 文件刪除機(jī)制
Linux 是通過(guò) link 的數(shù)量來(lái)控制文件刪除,只有當(dāng)一個(gè)文件不存在任何 link 的時(shí)候,這個(gè)文件才會(huì)被刪除。每個(gè)文件都有 2 個(gè) link 計(jì)數(shù)器—— i_count 和 i_nlink。i_count 的意義是當(dāng)前使用者的數(shù)量,i_nlink 的意義是介質(zhì)連接的數(shù)量;或者可以理解為 i_count 是內(nèi)存引用計(jì)數(shù)器,i_nlink 是硬盤引用計(jì)數(shù)器。再換句話說(shuō),當(dāng)文件被某個(gè)進(jìn)程引用時(shí),i_count 就會(huì)增加;當(dāng)創(chuàng)建文件的硬連接的時(shí)候,i_nlink 就會(huì)增加。
對(duì)于 rm 而言,就是減少 i_nlink。這里就出現(xiàn)一個(gè)問(wèn)題,如果一個(gè)文件正在被某個(gè)進(jìn)程調(diào)用,而用戶卻執(zhí)行 rm 操作把文件刪除了,會(huì)出現(xiàn)什么結(jié)果呢?當(dāng)用戶執(zhí)行 rm 操作后,ls 或者其他文件管理命令不再能夠找到這個(gè)文件,但是進(jìn)程卻依然在繼續(xù)正常執(zhí)行,依然能夠從文件中正確的讀取內(nèi)容。這是因?yàn)?,`rm` 操作只是將 i_nlink 置為 0 了;由于文件被進(jìn)程飲用的緣故,i_count 不為 0,所以系統(tǒng)沒(méi)有真正刪除這個(gè)文件。i_nlink 是文件刪除的充分條件,而 i_count 才是文件刪除的必要條件。
對(duì)于單個(gè)文件刪除而言,我們可能完全不需要關(guān)心這個(gè)機(jī)制,但是對(duì)于大批量文件刪除,這卻是一個(gè)非常重要的因素,請(qǐng)?jiān)试S我在隨后章節(jié)中詳細(xì)闡述,此處請(qǐng)先記下 Linux 的文件刪除機(jī)制。


生成待刪除列表
當(dāng)一個(gè)文件夾下面有 10 個(gè)文件的時(shí)候,`ls` 可以一目了然,甚至可以用 `ls – alt` 查看所有文件的詳細(xì)屬性;當(dāng)文件變成 100 個(gè)的時(shí)候,`ls` 可能只能看一看文件名了;文件數(shù)量上漲到 1000,多翻幾頁(yè)可能還能接受;如果是 10,000 呢? `ls` 可能需要等上半天才能有結(jié)果;再擴(kuò)展成 100,000 的時(shí)候,絕大多數(shù)系統(tǒng)可能都沒(méi)有反應(yīng),或者“Argument list too long”了。不止是 `ls` 會(huì)遇到這樣的問(wèn)題,其它的常用 Linux 系統(tǒng)管理命令都會(huì)遇到類似的問(wèn)題,Shell 有參數(shù)來(lái)限制命令的長(zhǎng)度。就算我們可以通過(guò)修改 Shell 參數(shù)來(lái)擴(kuò)展命令長(zhǎng)度,但這并不能提高命令的執(zhí)行效率。對(duì)一個(gè)超大規(guī)模的文件系統(tǒng)而言,等待 `ls` 和 `find` 等常用文件管理命令的返回的時(shí)間是不可接受的.
那么我們?nèi)绾文軌蛟诟髷?shù)量級(jí)的文件系統(tǒng)上生成刪除文件列表呢?一個(gè)高性能的文件系統(tǒng)索引是一個(gè)好方法,不過(guò)高性能的文件索引是少數(shù)人的專利(這也解釋了為什么 google 和 baidu 能這么賺錢)。好在如此規(guī)模的文件系統(tǒng)一般都只存在于高性能文件系統(tǒng)里面,這些文件系統(tǒng)都提供了非常強(qiáng)大的文件管理功能。譬如前面提到的 IBM 通用并行文件系統(tǒng)(GPFS)的 mmapplypolicy,通過(guò)直接掃描 inode 來(lái)快速掃描整個(gè)文件系統(tǒng),并能夠根據(jù)指定條件返回文件列表。下面會(huì)演示如何根據(jù)時(shí)間戳和文件類型來(lái)獲取文件列表。


死鎖對(duì)文件刪除性能的影響
對(duì)于一個(gè)每天定時(shí)執(zhí)行文件刪除任務(wù)系統(tǒng),首先生成待刪除文件,然后把該列表作為輸入執(zhí)行刪除操作;如果某天待刪除列表特別大,導(dǎo)致第一天的刪除任務(wù)還沒(méi)有完成,第二天的刪除任務(wù)就啟動(dòng)了,會(huì)有什么結(jié)果呢?
第一天還沒(méi)有來(lái)得及被刪除的文件會(huì)出現(xiàn)在第二天的刪除文件列表中,然后第二天的文件刪除進(jìn)程會(huì)把它做為輸出執(zhí)行刪除操作。此時(shí),第一天的刪除進(jìn)程和第二天的刪除都會(huì)嘗試去刪除相同的文件,系統(tǒng)拋出大量的 unlink 失敗的錯(cuò)誤,刪除性能會(huì)受到很大的影響。刪除性能的下降,會(huì)導(dǎo)致第二天的文件依然沒(méi)有被刪除,第三天的刪除進(jìn)程會(huì)加劇刪除文件的死鎖,進(jìn)入刪除性能下降的惡性循環(huán)。
如果簡(jiǎn)單的刪除第一天生成的待刪除列表,能夠解決上述問(wèn)題嗎?不能。如前文所述的 Linux 文件刪除機(jī)制,刪除第一天的文件列表文件只能把該文件的 i_nlink 清零,當(dāng)?shù)谝惶斓奈募h除進(jìn)程沒(méi)有結(jié)束的時(shí)候,該文件的 i_count 就不為零,因而該文件不會(huì)被刪除。直到該進(jìn)程處理完列表中的所有文件,進(jìn)程退出,第一天的待刪除列表文件才真正被刪除了。
我們至少需要在新的文件刪除進(jìn)程啟動(dòng)以前,把系統(tǒng)中其它的文件刪除進(jìn)程終止,才能保證不會(huì)發(fā)生刪除死鎖的情況。但是這樣做,依然存在一些弊端??紤]到極端情況下,如果連續(xù)一段時(shí)間刪除進(jìn)程都無(wú)法在一個(gè)周期內(nèi)完成刪除任務(wù),那么待刪除列表就會(huì)不斷增長(zhǎng),文件掃描時(shí)間會(huì)延長(zhǎng),進(jìn)而擠占文件刪除進(jìn)程的工作時(shí)間,陷入另外一個(gè)惡性循環(huán)。
而且實(shí)戰(zhàn)經(jīng)驗(yàn)告訴我們,當(dāng)刪除列表特別巨大時(shí),刪除進(jìn)程的工作性能也有所下降。而一個(gè)適當(dāng)大小的參數(shù)輸入文件,能夠保證進(jìn)程有效執(zhí)行。所以,按照固定尺寸將待刪除列表文件分割成一系列文件,能夠讓刪除操作穩(wěn)定高效的執(zhí)行。而且,在存儲(chǔ)和主機(jī)性能允許的前提下,分割為多個(gè)文件還可以允許我們并發(fā)執(zhí)行多個(gè)刪除進(jìn)程。

大批量文件自動(dòng)清理的最佳實(shí)踐
GPFS 文件系統(tǒng)下大規(guī)模額外年間自動(dòng)清理的最佳實(shí)踐
以下是在一個(gè)千萬(wàn)級(jí)的 GPFS 文件系統(tǒng)上進(jìn)行的文件自動(dòng)清理實(shí)踐:硬件環(huán)境為兩臺(tái) IBMx3650 服務(wù)器和存儲(chǔ)容量為 50TB 的 DS4200 磁盤陣列,安裝了 Linux 操作系統(tǒng)和 GPFS v3.2。目標(biāo)是每天 2:00AM 執(zhí)行文件清理操作,刪除 30 天以前的文件和所有以 tmp 為結(jié)尾的文件。
mmapplypolicy 掃描結(jié)果顯示該系統(tǒng)上有 323,784,950 個(gè)文件,158,696 個(gè)文件夾。

復(fù)制代碼
代碼如下:

.............
[I] Directories scan: 323784950 files, 158696 directories,
0 other objects, 0 'skipped' files and/or errors.
.............

定義查找規(guī)則如下,保存為 trash_rule.txt

復(fù)制代碼
代碼如下:

RULE EXTERNAL LIST 'trash_list' EXEC ''
RULE 'exp_scan_rule' LIST 'trash_list' FOR FILESET('data')
WHERE DAYS(CURRENT_TIMESTAMP) – DAYS(ACCESS_TIME) > 30
RULE 'tmp_scan_rule' LIST 'trash_list' FOR FILESET('data') WHERE NAME LIKE '%.tmp'

執(zhí)行 mmapplypolicy 并配合 grep 和 awk 命令生成待刪除文件完整列表,再用 split 命令將完整列表分割為每個(gè)列表包含 10,000 個(gè)文件的子列表:

復(fù)制代碼
代碼如下:

mmapplypolicy /data – P trash_rule.txt – L 3 | grep
“/data” |awk ‘ {pint $1} ’ > trash.lst
split – a 4 – C 10000 – d trash.lst trash_split_

執(zhí)行以下命令進(jìn)行刪除操作:

復(fù)制代碼
代碼如下:

for a in `ls trash_splict_*`
do
rm `cat $a`
done

將上述操作保存為 trash_clear.sh,然后定義 crontab 任務(wù)如下:

復(fù)制代碼
代碼如下:

0 2 * * *   /path/trash_clear.sh

手動(dòng)執(zhí)行刪除任務(wù),待刪除文件掃描結(jié)果如下:

復(fù)制代碼
代碼如下:

[I] GPFS Policy Decisions and File Choice Totals:
Chose to migrate 0KB: 0 of 0 candidates;
Chose to premigrate 0KB: 0 candidates;
Already co-managed 0KB: 0 candidates;
Chose to delete 0KB: 0 of 0 candidates;
Chose to list 1543192KB: 1752274 of 1752274 candidates;
0KB of chosen data is illplaced or illreplicated;

在文件刪除過(guò)程中,我們可以采用以下命令計(jì)算每分鐘文件刪除數(shù)量。從下面的輸出可以得出,文件刪除速度為 1546 文件每分鐘:

復(fù)制代碼
代碼如下:

df – i /data;sleep 60;df – i   /data
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/data 2147483584 322465937 1825017647 16% /data
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/data 2147483584 322467483 1825016101 16% /data

通過(guò) `time` 命令對(duì)文件刪除操作進(jìn)行計(jì)時(shí),從輸出結(jié)果可以看出,本次文件刪除操作一共耗時(shí) 1168 分鐘(19.5 小時(shí)):

復(fù)制代碼
代碼如下:

time trash_clear.sh /p> p> real 1168m0.158s
user 57m0.168s
sys 2m0.056s

當(dāng)然,對(duì)于 GPFS 文件系統(tǒng)而言,文件系統(tǒng)本身還提供了其他的文件清理方法,譬如可以通過(guò) mmapplypolicy 來(lái)執(zhí)行文件刪除操作,通過(guò)這種方法,有可能實(shí)現(xiàn)更加高效的文件清理任務(wù)。本文的目的在于討論一種通用的大規(guī)模文件清理方法,在此就不對(duì)基于文件系統(tǒng)所提供功能的文件清理操作做進(jìn)一步討論了,感興趣的讀者可以嘗試一下。

標(biāo)簽:臨沂 烏蘭察布 邢臺(tái) 撫州 防城港 南昌 北海 韶關(guān)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux下自動(dòng)清理大量文件的方案探究》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    侯马市| 嘉兴市| 沙河市| 东山县| 西峡县| 昌邑市| 寻甸| 平利县| 攀枝花市| 弋阳县| 永清县| 股票| 凌云县| 乌拉特中旗| 玉门市| 横峰县| 富蕴县| 江山市| 老河口市| 叙永县| 伊吾县| 滕州市| 连平县| 潼南县| 柘城县| 云龙县| 久治县| 丰原市| 九寨沟县| 安国市| 曲松县| 监利县| 香港| 盈江县| 平南县| 大石桥市| 博客| 张家港市| 鱼台县| 梁平县| 夏河县|