วิธีการแคชหรือเร่งความเร็วสรุป 'du`?


33

เรามีระบบไฟล์ขนาดใหญ่ที่duสรุปเต็ม(การใช้งานดิสก์) ใช้เวลาเกินสองนาที ฉันต้องการหาวิธีเพิ่มความเร็วสรุปการใช้ดิสก์สำหรับไดเรกทอรีที่กำหนดเองในระบบไฟล์นั้น

สำหรับสาขาเล็ก ๆ ฉันสังเกตว่าduผลลัพธ์ดูเหมือนจะถูกแคชอย่างใดเนื่องจากคำขอซ้ำ ๆ นั้นเร็วกว่ามาก แต่ในสาขาขนาดใหญ่ความเร็วเพิ่มขึ้นเล็กน้อย

มีวิธีการเร่งความเร็วที่ง่ายขึ้นduหรือมีการแคชผลการค้นหาสาขาที่ไม่ได้ทำการแก้ไขอย่างจริงจังตั้งแต่การค้นหาครั้งก่อนหรือไม่

หรือมีคำสั่งอื่นที่สามารถส่งข้อมูลสรุปการใช้ดิสก์ได้เร็วขึ้นหรือไม่


8
สองนาทีดูเหมือนว่าจะไม่นานสำหรับฉัน แต่คำถามที่แท้จริงคือ: "คุณต้องการให้แคชทำอะไรหรือไม่?" คุณไม่ควรให้จำนวนบล็อกดิสก์จริงตามที่เป็นไปได้ในปัจจุบันเท่าที่จะทำได้ใช่หรือไม่
Bruce Ediger

ฉันยอมรับว่าการแทนที่จะduไม่ดี แต่สคริปต์ตัวห่อหุ้มที่เร็วขึ้นด้วยอินเทอร์เฟซที่เหมือนกันจะมีประโยชน์มากสำหรับเรา เพิ่มเติมฉันคาดหวังว่าผลการแคชขึ้นอยู่กับเวลาที่แก้ไขครั้งล่าสุด (และสมมติว่าไม่มีการดำเนินการทั้งดิสก์เช่นการจัดเรียงข้อมูล) จะให้ผลลัพธ์ขนาดที่แน่นอน: ฉันหายไปบางอย่างหรือไม่
Ian Mackinnon

2
หากคุณกังวลเกี่ยวกับการใช้งานดิสก์มากเกินไปคุณอาจลองใช้โควต้า
pyasi

2
บรูซ - findคุณสามารถถามคำถามเหมือนกันเกี่ยวกับ locateแต่แล้วมี
Yuval

หากคุณใช้ AndroidลองดูStatFsขนาดไดเรกทอรีโดยประมาณที่เร็วที่สุด มันเป็นเวลาเกือบ 1000x duเร็วขึ้นสำหรับขนาดใหญ่ไดเรกทอรีที่ซับซ้อนเมื่อเทียบกับ
Joshua Pinter

คำตอบ:


21

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

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

ไดเรกทอรีไม่ทราบว่าไฟล์มีขนาดใหญ่เพียงใดดังนั้นจึงจำเป็นต้องเข้าถึง inode ของแต่ละไฟล์ เพื่อรักษาค่าแคชให้ทันสมัยทุกครั้งที่ไฟล์มีการเปลี่ยนแปลงขนาดค่าแคชจะต้องมีการปรับปรุง เนื่องจากไฟล์สามารถแสดงใน 0 หรือมากกว่าไดเรกทอรีนี้จะต้อง inode ของแต่ละไฟล์ที่จะรู้ว่ามันอยู่ในรายชื่อใดมันจะซับซ้อนมากโครงสร้าง inode และลดประสิทธิภาพของ IO นอกจากนี้เนื่องจากคุณสามารถรับผลลัพธ์ที่สมมติว่าขนาดบล็อกที่แตกต่างกันข้อมูลที่ต้องการในแคชจะต้องเพิ่มหรือลดค่าแคชสำหรับขนาดบล็อกแต่ละขนาดที่เป็นไปได้ซึ่งจะทำให้ประสิทธิภาพการทำงานช้าลง


7

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

สิ่งนี้ต้องการให้ระบบไฟล์ของคุณรองรับโควต้าต่อกลุ่ม Ext ของ Linux [234] และ Solaris / * BSD / Linux ของ zfs ทำได้ มันจะดีสำหรับกรณีการใช้งานของคุณถ้าโควต้ากลุ่มคำนึงถึง ACL แต่ฉันไม่คิดว่าพวกเขาจะทำ


7

การใช้งานทั่วไปของสามารถเร่งความเร็วอย่างมากขึ้นโดยใช้duncdu

ncdu - NCurses Disk Usage

ดำเนินการduแคชผลลัพธ์และแสดงให้เห็นในบรรทัดคำสั่งที่ดี gui ค่อนข้างเทียบเคียงdu -hc -d 1 | sort -hได้ การจัดทำดัชนีเริ่มต้นใช้เวลานานเท่ากันduแต่มองหา "ผู้ร้าย" จริงที่เติมเต็มพื้นที่อันมีค่าถูกเร่งความเร็วขึ้นเนื่องจากไดเรกทอรีย่อยทั้งหมดมีข้อมูลแคชที่เก็บไว้ในตอนแรก

หากไดเรกทอรีย่อยที่จำเป็นสามารถรีเฟรชได้โดยการกด [r] และไฟล์ / โฟลเดอร์สามารถลบได้โดยกด [d] ซึ่งทั้งสองนี้จะอัพเดตสถิติสำหรับไดเรกทอรีหลักทั้งหมด การลบขอการยืนยัน

หากจำเป็นต้องใช้เครื่องเร่งความเร็วการเร่งความเร็วเพิ่มเติมสามารถทำได้โดยการเตรียมล่วงหน้าncdu -1xo- / | gzip >export.gzใน cronjob และเข้าถึงในภายหลังzcat export.gz | ncdu -f-แต่เห็นได้ชัดว่าให้ข้อมูลที่ล้าสมัยมากขึ้น


7

ฉันชอบที่จะใช้elderu

Agedu เป็นชิ้นส่วนของซอฟต์แวร์ที่พยายามค้นหาไฟล์เก่าและใช้งานผิดปกติในข้อสันนิษฐานว่าไฟล์เหล่านี้มักไม่ต้องการ (เช่นการดาวน์โหลดที่มีการดูเพียงครั้งเดียว)

โดยทั่วไปแล้วมันจะสแกนดิสก์ในลักษณะเดียวกันduแต่จะบันทึกเวลาเข้าถึงครั้งล่าสุดของทุกสิ่งที่สแกน จากนั้นจะสร้างดัชนีที่ช่วยให้สามารถสร้างรายงานที่มีประสิทธิภาพโดยสรุปผลของแต่ละไดเรกทอรีย่อยแล้วสร้างรายงานตามความต้องการ


4
ไม่ตอบคำถาม แต่ยังคง +1 เคล็ดลับที่ดี
0xC0000022L

ฉันได้แก้ไขคำถามเพื่อให้ชัดเจนยิ่งขึ้นว่าสิ่งนี้ตอบคำถามได้จริง (มีอายุการใช้ดัชนีดิสก์รวมถึงเวลาเข้าถึง)
Anthony G - ความยุติธรรมสำหรับโมนิก้า

5

ตามที่ SHW กล่าวไว้ageduแน่นอนสร้างดัชนี locatedbฉันคิดว่าฉันต้องการแบ่งปันวิธีการสร้างดัชนีหลังจากที่ได้อ่านเกี่ยวกับ คุณสามารถสร้างเวอร์ชั่นของคุณเองlocatedbจากduเอาท์พุท:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkจัดเรียงเอาต์พุต du ใหม่เพื่อให้มีชื่อไฟล์ก่อนเพื่อให้frcodeทำงานได้ถูกต้อง จากนั้นใช้locateกับฐานข้อมูลนี้เพื่อรายงานการใช้ดิสก์อย่างรวดเร็ว:

locate --database=du.locatedb pingus

คุณสามารถขยายสิ่งนี้เพื่อให้เหมาะกับความต้องการของคุณ ฉันคิดว่ามันเป็นการใช้ที่ดีของ


3
duc

(ดูhttps://duc.zevv.nl ) อาจเป็นสิ่งที่คุณกำลังมองหา

Duc จัดเก็บการใช้งานดิสก์ในฐานข้อมูลที่ดีที่สุดส่งผลให้ส่วนต่อประสานผู้ใช้ที่รวดเร็ว ไม่ต้องรอเวลาที่ดัชนีเสร็จสมบูรณ์

การอัปเดตดัชนีนั้นรวดเร็วมากสำหรับฉัน (น้อยกว่า 10 วินาทีสำหรับไฟล์ประมาณ 950k ในไดเรกทอรี 121k, 2.8 TB) มี GUI และ ncurses UI เช่นกัน

การใช้งานเช่น:

duc index /usr
duc ui /usr

จากเว็บไซต์:

Duc ถูกสร้างขึ้นเพื่อขยายขนาดไปสู่ระบบไฟล์ขนาดใหญ่: มันจะสร้างดัชนีและแสดงไฟล์หลายร้อยล้านไฟล์บนพื้นที่จัดเก็บขนาดเพตาไบต์โดยไม่มีปัญหา


2

ฉันมี cronjob ตั้งค่าให้เรียกใช้ updatedb ทุก ๆ 10 นาที เก็บบัฟเฟอร์ของระบบไฟล์ทั้งหมดได้ดีและสดใหม่ อาจใช้ RAM ราคาถูกเพื่อสิ่งที่ดี ใช้ slabtop ดู 'ก่อน' และ 'หลัง'


ฉันไม่เข้าใจว่าคำตอบของคุณเกี่ยวข้องกับคำถามอย่างไร updatedbไม่ได้พูดอะไรเกี่ยวกับการใช้ดิสก์ หากคุณกำลังทำเพียงเพื่อสำรวจดิสก์คุณจะกระทบประสิทธิภาพโดยรวม
Gilles 'หยุดความชั่วร้าย'

3
การนับขนาดไฟล์ให้duช้าเนื่องจากคุณต้องเข้าถึงข้อมูลเมตาของไฟล์จำนวนมากที่กระจัดกระจายอยู่รอบ ๆ ดิสก์ หากคุณเรียกใช้ updatedb อย่างจริงจังเมทาดาทาสำหรับไฟล์ทั้งหมดจะถูกบังคับให้เก็บไว้ใน RAM ครั้งต่อไปที่คุณเรียกใช้การดำเนินการเมตาดาต้าหนักอื่น ๆ แทนที่จะใช้การค้นหาหลายพันครั้งในดิสก์คุณจะใช้แคช โดยปกติคุณมีโอกาสเล็กน้อยที่จะมีส่วนหนึ่งของข้อมูลเมตาของต้นไม้นั้นถูกแคช ด้วย 'การทำข้อมูลเมตาแคชของฉัน' เป็นไปได้สูงมากที่ข้อมูลที่คุณต้องการจะถูกแคชใหม่ ไม่มีการค้นหาทางกายภาพ == FAST
Marcin

2

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

du -hc | tail -n 1

โครงสร้างไดเรกทอรี 2GB ใช้เวลานานกว่าหนึ่งวินาทีสำหรับรายชื่อทั้งหมด แต่น้อยกว่าหนึ่งในห้าของรายชื่อด้วยแบบฟอร์มนี้


2
ฉันคิดว่าdu -hsสะดวกกว่าสำหรับวัตถุประสงค์นั้น
lepe

ยัง--max-depth 1
stevesliva
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.