การทำ rm -rf บนแผนผังไดเร็กทอรีขนาดใหญ่ใช้เวลาหลายชั่วโมง


20

เรากำลังใช้ rsnapshot สำหรับการสำรองข้อมูล มันเก็บสแน็ปช็อตจำนวนมากของไฟล์สำรองไว้ แต่จะลบไฟล์เก่า ดีจัง. อย่างไรก็ตามมันใช้เวลาประมาณ 7 ชั่วโมงในการทำrm -rfทรีไดเรกทอรีขนาดใหญ่ ระบบไฟล์คือ XFS ฉันไม่แน่ใจว่ามีไฟล์กี่ไฟล์ แต่มีจำนวนเป็นล้าน

อย่างไรก็ตามมีการเร่งความเร็วหรือไม่ มีคำสั่งใดบ้างที่เหมือนกับrm -rfและไม่ใช้เวลาหลายชั่วโมงหรือไม่?


1
ฉันใช้find . -delete -name directoryและมันเร็วกว่าrm -rfมาก
เปาโล

คำตอบ:


38

เลขที่

rm -rfการวนซ้ำแบบลึกครั้งแรกของระบบไฟล์ของคุณจะเรียกซ้ำunlink()ทุกไฟล์ สองการดำเนินงานที่ก่อให้เกิดกระบวนการที่จะไปช้ามีopendir()/ และreaddir() และขึ้นอยู่กับจำนวนไฟล์ในไดเรกทอรี ขึ้นอยู่กับขนาดของไฟล์ที่ถูกลบ วิธีเดียวที่จะทำให้เรื่องนี้เร็วขึ้นคือการลดขนาดและจำนวนไฟล์ (ซึ่งฉันสงสัยว่าไม่น่าจะเป็นไปได้) หรือเปลี่ยนระบบไฟล์เป็นระบบเดียวที่มีคุณสมบัติที่ดีกว่าสำหรับการดำเนินการเหล่านั้น ฉันเชื่อว่า XFS นั้นดีสำหรับการยกเลิกการเชื่อมโยง () กับไฟล์ขนาดใหญ่ แต่ไม่ดีสำหรับโครงสร้างไดเรกทอรีขนาดใหญ่ คุณอาจพบว่า ext3 + dirindex หรือ reiserfs นั้นเร็วกว่า ฉันไม่แน่ใจว่าค่าโดยสาร JFS ดีแค่ไหน แต่ฉันแน่ใจว่ามีเกณฑ์มาตรฐานมากมายเกี่ยวกับประสิทธิภาพของระบบไฟล์ที่แตกต่างกันunlink()opendir()readdir()unlink()

แก้ไข: ดูเหมือนว่าXFS แย่มากในการลบแผนผังดังนั้นเปลี่ยนระบบไฟล์ของคุณอย่างแน่นอน


1
หลายปีก่อนฉันสังเกตเห็นประสิทธิภาพที่แย่มากเมื่อใช้ reiserfs ในกรณีการใช้งานที่คล้ายกัน
knweiss

1
โพสต์ที่ยิ่งใหญ่!
wzzrd

2
มันเกือบเพียงแค่กล่าวว่า "ไม่" :)
เดวิด Pashley

2
ฉันเห็นด้วยกับทุกสิ่งที่นี่นอกเหนือจากคำสั่งของคุณที่ความเร็วการยกเลิกการเชื่อมโยงจะขึ้นอยู่กับขนาดของไฟล์ unlink เพียงลบลิงค์ไปยังไฟล์และไม่ทำอะไรกับเนื้อหาจริง ไม่ควรมีความแตกต่างที่สังเกตได้ระหว่างไฟล์ที่มีขนาดต่างกัน (คุณสามารถทดสอบได้ด้วยตนเอง)
Kamil Kisiel

@KamilKisiel คุณกำลังบอกถูกต้องunlinkว่าไม่ได้ทำอะไรกับเนื้อหาที่แท้จริง แต่เพื่อทำการunlinkเรียกระบบรหัสระบบไฟล์ยังคงทำงานได้มากขึ้นถ้าลิงค์ที่ลบออกเป็นลิงค์สุดท้ายไปยังไฟล์และหากยังไม่ได้เปิด นี่เป็นระบบไฟล์ที่ขึ้นอยู่กับระบบ แต่ก็อาจมีความแตกต่างที่สังเกตเห็นได้เมื่อไฟล์ที่ถูกลบนั้นมีขนาดใหญ่มาก
jlliagre

22

อีกวิธีหนึ่งคือย้ายไดเรกทอรีไปข้างหน้าสร้างมันใหม่ด้วยชื่อสิทธิ์และความเป็นเจ้าของเดียวกันแล้วรีสตาร์ทแอพ / บริการใด ๆ ที่ดูแลเกี่ยวกับไดเรกทอรีนั้น

จากนั้นคุณสามารถ "ดี rm" ไดเรกทอรีต้นฉบับในพื้นหลังโดยไม่ต้องกังวลเกี่ยวกับการหยุดทำงานนาน


นั่นอาจใช้ได้เนื่องจาก mv นั้นเร็วมาก ๆ
Rory

ใช่ - มันใช้งานได้ดี ฉันใช้เทคนิคนี้หลายครั้งในการ "แก้ไข" กล่องจดหมายที่ใช้เมลซึ่งผู้ใช้อีเมลเสียสมองและไม่เป็นระเบียบบนดิสก์ ไดเรกทอรี (เดี่ยว) ที่ใหญ่ที่สุดที่ฉันแก้ไขในลักษณะนี้มีประมาณ 1.5 หรือ 2 ล้านไฟล์ IIRC การหยุดทำงานโดยรวมของผู้ใช้คือประมาณ 3 นาทีซึ่งส่วนใหญ่กำลังรอให้ไคลเอ็นต์อีเมลและกระบวนการ imap ตาย
งานเกร็ก

7

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าตัวเลือกการเมาท์ที่เหมาะสมสำหรับ XFS

การใช้ -ologbufs = 8, logbsize = 256k กับ XFS อาจทำให้ประสิทธิภาพการลบของคุณเพิ่มขึ้นเป็นสามเท่า


2
+1 สำหรับเคล็ดลับนี้ ... หนึ่งควรเปิดใช้งานตัวนับขี้เกียจสำหรับการเพิ่มประสิทธิภาพอื่น
hurikhan77

1
คำอธิบายเกี่ยวกับการตั้งค่าเหล่านี้จะเป็นประโยชน์สำหรับผู้อ่านในอนาคต
Aron Rotteveel

5

หากคุณกำลังทำ rm อย่างมีประสิทธิภาพที่ระดับไฟล์แล้วมันจะใช้เวลานาน นี่คือเหตุผลที่สแนปชอตของบล็อกดีมาก :)

คุณสามารถลองแบ่ง rm ออกเป็นส่วนต่าง ๆ และพยายามทำแบบขนาน แต่ฉันไม่คิดว่ามันจะทำการปรับปรุงใด ๆ XFS เป็นที่รู้จักกันว่ามีปัญหาในการลบไฟล์และถ้านั่นเป็นส่วนใหญ่ของสิ่งที่คุณทำอาจจะเป็นระบบไฟล์ที่แตกต่างออกไปสำหรับแนวคิดนั้น


สแน็ปช็อตที่อ้างอิงกับบล็อกนั้นไม่ดีในกรณีนี้ ระบบไฟล์จำนวนมาก --- WAFL และ ZFS คำนึงถึงทันที --- ยังให้ประสิทธิภาพที่ดีสำหรับการลบสแน็ปช็อต พวกเขาปฏิบัติต่อภาพรวมเป็นวัตถุระบบไฟล์ชั้นหนึ่ง ดังนั้นแทนที่จะทำซ้ำ (ช้า) มากกว่าล้านไฟล์เพื่อตรวจสอบว่าบล็อกใดที่จะว่างพวกเขาเพียงแค่ต้องดูรายการบล็อกที่เกี่ยวข้องกับภาพรวม
Keith Smith

อืมมม ฉันอาจหลุดจากการเป็นคนตรงกันข้าม ผู้โพสต์ดั้งเดิมจะต้องใช้ Linux และไม่มีระบบไฟล์ Linux ที่พิสูจน์แล้วว่าสามารถจับภาพได้แม้ว่า btrfs และ nilfs จะดูน่าสนใจสำหรับอนาคต ดังนั้นในทางปฏิบัติฉันเห็นด้วย --- ดีกว่าที่จะใช้สแนปชอตจากบล็อก
Keith Smith

+1 สำหรับเคล็ดลับในการแยกและจัดเรียงเวิร์กโหลดแบบขนาน: xfs เล่นแรงกับเวิร์กโหลดแบบขนาน
hurikhan77

5

เป็นการดีที่จะใช้ ionice สำหรับการใช้งานแบบ IO อย่างมากโดยไม่คำนึงถึงระบบไฟล์ที่ใช้
ฉันแนะนำคำสั่งนี้:

ionice -n7 nice rm -fr dir_name

มันจะเล่นได้ดีสำหรับการทำงานเบื้องหลังในเซิร์ฟเวอร์ที่มีโหลด IO หนัก


2

ฉันรู้ว่านี่เก่า แต่ฉันคิดว่ารหัสโยนในข้อเสนอแนะ คุณกำลังลบไฟล์เหล่านั้นตามลำดับการเรียกใช้การดำเนินการ rm แบบขนานอาจช่วยให้สิ่งต่าง ๆ เร็วขึ้น

http://savannah.nongnu.org/projects/parallel/ ขนานสามารถนำมาใช้แทน xargs

ดังนั้นหากคุณลบไฟล์ทั้งหมดใน deltedir

find -t f deletedir | parallel -j 10 rm

นั่นจะทำให้คุณมีโครงสร้างไดเรกทอรีว่างเปล่าที่จะลบ

หมายเหตุ: คุณอาจยังคงมีข้อ จำกัด ของระบบไฟล์ตามที่ระบุไว้ข้างต้น


อะไรคือข้อดีของการใช้ขนานมากกว่า xargs
โรรี่

1

ตัวเลือกอื่นที่นี่จะแยกข้อมูลในลักษณะที่คุณสามารถขยะและสร้างระบบไฟล์จริงแทนที่จะทำ rm หรือไม่?


3
ฉันคิดว่า rsnapshot ใช้ฮาร์ดลิงก์เป็นส่วนหนึ่งของคุณสมบัติการบำรุงรักษาแบบหลายสแนปช็อตอย่างมีประสิทธิภาพ ดังนั้นถ้าถามจะใช้คุณลักษณะที่ใช้ระบบไฟล์ที่แยกจากกันจะไม่ทำงาน (ตามที่คุณไม่สามารถที่ยากต่อการเชื่อมโยงมากกว่าขอบเขตระบบแฟ้ม)
เดวิด Spillett

0

วิธีการเกี่ยวกับการลดความสวยงามของคำสั่ง? ชอบ:

nice -20 rm -rf /path/to/dir/

5
คอขวดไม่ใช่ตัวกำหนดตารางเวลา แต่เป็นระบบไฟล์ที่ฉันพูด
Manuel Faux

ในกรณีที่ไม่น่าเป็นไปได้ว่าตัวกำหนดตารางเวลาเป็นคอขวดคุณจะต้องล้มระบบย่อย I / O ให้หนักขึ้นทำให้เซิร์ฟเวอร์ใช้งานได้น้อยลงในช่วง rm
David Mackintosh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.