Linux 下大規模文件自動清理方法(3)
對于一個每天定時執行文件刪除任務系統,首先生成待刪除文件,然后把該列表作為輸入執行刪除操作;如果某天待刪除列表特別大,導致第一天的刪除任務還沒有完成,第二天的刪除任務就啟動了,會有什么結果呢?
第一天還沒有來得及被刪除的文件會出現在第二天的刪除文件列表中,然后第二天的文件刪除進程會把它做為輸出執行刪除操作。此時,第一天的刪除 進程和第二天的刪除都會嘗試去刪除相同的文件,系統拋出大量的 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 個文件夾。
............. [I] Directories scan: 323784950 files, 158696 directories, 0 other objects, 0 'skipped' files and/or errors. .............
定義查找規則如下,保存為 trash_rule.txt
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'
執行 mmapplypolicy 并配合 grep 和 awk 命令生成待刪除文件完整列表,再用 split 命令將完整列表分割為每個列表包含 10,000 個文件的子列表:
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_
執行以下命令進行刪除操作:
for a in `ls trash_splict_*` do rm `cat $a` done
將上述操作保存為 trash_clear.sh,然后定義 crontab 任務如下:
0 2 * * * /path/trash_clear.sh
手動執行刪除任務,待刪除文件掃描結果如下:
[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;
在文件刪除過程中,我們可以采用以下命令計算每分鐘文件刪除數量。從下面的輸出可以得出,文件刪除速度為 1546 文件每分鐘:
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
通過 `time` 命令對文件刪除操作進行計時,從輸出結果可以看出,本次文件刪除操作一共耗時 1168 分鐘(19.5 小時):
time trash_clear.sh real 1168m0.158s user 57m0.168s sys 2m0.056s
當然,對于 GPFS 文件系統而言,文件系統本
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解