
(Ferris the Detective โดย Esther Arzola การออกแบบดั้งเดิมโดย Karen Rustad Tölva)
Findlargedir เป็นเครื่องมือที่เขียนขึ้นโดยเฉพาะเพื่อช่วยระบุไดเรกทอรี "Black Hole" อย่างรวดเร็ว ในระบบไฟล์ใด ๆ ที่มีรายการมากกว่า 100k ในโครงสร้างแบนเดียว เมื่อไดเรกทอรีมี รายการจำนวนมาก (ไดเรกทอรีหรือไฟล์) การรับรายชื่อไดเรกทอรีจะช้าลงและช้าลงส่งผลกระทบต่อประสิทธิภาพของกระบวนการทั้งหมดที่พยายามรับรายชื่อไดเรกทอรี (เช่นเพื่อลบไฟล์บางไฟล์และ/หรือค้นหาไฟล์เฉพาะบางไฟล์) กระบวนการที่อ่านอินโนเดสไดเรกทอรีขนาดใหญ่ได้รับการแช่แข็งในขณะที่ทำเช่นนั้นและจบลงด้วย การนอนหลับอย่างต่อเนื่อง ("D") เป็นเวลานานและนานขึ้น ขึ้นอยู่กับระบบไฟล์สิ่งนี้อาจเริ่มมองเห็นได้ด้วยรายการ 100K และเริ่มเป็นผลกระทบด้านประสิทธิภาพที่เห็นได้ชัดเจนด้วย 1M+ รายการ
ไดเรกทอรีดังกล่าวส่วนใหญ่ ไม่สามารถหดกลับได้ แม้ว่าเนื้อหาจะได้รับการทำความสะอาดเนื่องจากความจริงที่ว่าระบบไฟล์ Linux และ Un*x ส่วนใหญ่ไม่สนับสนุนไดเรกทอรีการหดตัวของไดเรกทอรี (ตัวอย่างเช่น Ext3/Ext4 ที่พบบ่อยมาก) สิ่งนี้มักเกิดขึ้นกับไดเรกทอรีเว็บเซสชันที่ถูกลืม (โฟลเดอร์ PHP Sessions ซึ่งช่วงเวลา GC ได้รับการกำหนดค่าเป็นหลายวัน) โฟลเดอร์แคชต่างๆ
โปรแกรมจะพยายามระบุจำนวนเหตุการณ์ดังกล่าวและรายงานเกี่ยวกับพวกเขาตาม การสอบเทียบ เช่น จำนวนไดเรกทอรีที่มีการสันนิษฐานว่ามีการบรรจุในแต่ละไดเรกทอรีแต่ละรายการสำหรับแต่ละระบบไฟล์ ในขณะที่ทำเช่นนั้นจะกำหนดอัตราส่วนการเจริญเติบโตของไดเรกทอรีในจำนวนรายการ/inodes และจะใช้อัตราส่วนนั้นเพื่อสแกนระบบไฟล์อย่างรวดเร็วหลีกเลี่ยงการค้นหาไดเรกทอรีที่มีราคาแพง/ช้า ในขณะที่มีเครื่องมือมากมายที่สแกนระบบไฟล์ ( find , du , ncdu ฯลฯ ) ไม่มีใครใช้ฮิวริสติกเพื่อหลีกเลี่ยงการค้นหาที่มีราคาแพงเนื่องจากพวกเขาได้รับการออกแบบให้ แม่นยำอย่างสมบูรณ์ ในขณะที่เครื่องมือ นี้ หมายถึงการใช้ฮิวริสติกและเตือนปัญหา
โปรแกรมจะ ไม่เป็นไปตาม Symlinks และ ต้องการสิทธิ์ R/W ในการปรับเทียบไดเรกทอรีเพื่อให้สามารถคำนวณขนาดของไดเรกทอรี inode ต่อจำนวนอัตราส่วนรายการและประมาณจำนวนของรายการในไดเรกทอรีโดยไม่นับจริง ในขณะที่วิธีนี้เป็นเพียงการประมาณจำนวนรายการจริงในไดเรกทอรีมันก็ดีพอที่จะสแกนสำหรับไดเรกทอรีที่ละเมิดอย่างรวดเร็ว

-a ) อาจทำให้ I/O มากเกินไปและการใช้หน่วยความจำมากเกินไป ใช้เมื่อเหมาะสมเท่านั้น Usage: findlargedir [OPTIONS] < PATH > ...
Arguments:
< PATH > ... Paths to check for large directories
Options:
-a, --accurate < ACCURATE >
Perform accurate directory entry counting [default: false] [possible values: true, false]
-o, --one-filesystem < ONE_FILESYSTEM >
Do not cross mount points [default: true] [possible values: true, false]
-c, --calibration-count < CALIBRATION_COUNT >
Calibration directory file count [default: 100000]
-A, --alert-threshold < ALERT_THRESHOLD >
Alert threshold count (print the estimate) [default: 10000]
-B, --blacklist-threshold < BLACKLIST_THRESHOLD >
Blacklist threshold count (print the estimate and stop deeper scan) [default: 100000]
-x, --threads < THREADS >
Number of threads to use when calibrating and scanning [default: 24]
-p, --updates < UPDATES >
Seconds between status updates, set to 0 to disable [default: 20]
-i, --size-inode-ratio < SIZE_INODE_RATIO >
Skip calibration and provide directory entry to inode size ratio (typically ~ 21-32) [default: 0]
-t, --calibration-path < CALIBRATION_PATH >
Custom calibration directory path
-s, --skip-path < SKIP_PATH >
Directories to exclude from scanning
-h, --help
Print help information
-V, --version
Print version information เมื่อใช้ โหมดที่ถูกต้อง ( -a พารามิเตอร์) ระวังว่าการค้นหาไดเรกทอรีขนาดใหญ่จะหยุดกระบวนการอย่างสมบูรณ์เป็นระยะเวลานาน สิ่งที่โหมดนี้ทำคือการผ่านที่แม่นยำรองอย่างสมบูรณ์ในไดเรกทอรีที่อาจละเมิดการคำนวณจำนวนรายการที่แน่นอน
เพื่อหลีกเลี่ยงการลงไปสู่ระบบไฟล์ที่ติดตั้ง (เช่นในตัวเลือก FIND -xDev) พารามิเตอร์ โหมดหนึ่ง -filesystem (พารามิเตอร์ -o ) จะถูกสลับโดยค่าเริ่มต้น แต่สามารถปิดใช้งานได้หากจำเป็น
มันเป็นไปได้ที่จะข้ามขั้นตอนการสอบเทียบอย่างสมบูรณ์โดยให้ขนาดไดเรกทอรี inode ด้วยตนเองกับจำนวนอัตราส่วนรายการด้วยพารามิเตอร์ -i มันสมเหตุสมผลก็ต่อเมื่อคุณรู้อัตราส่วนแล้วเช่นจากการวิ่งก่อนหน้านี้
การตั้งค่า -p paramter ถึง 0 จะหยุดโปรแกรมจากการให้การอัปเดตสถานะเป็นครั้งคราว
ฮาร์ดแวร์: 8-core Xeon E5-1630 พร้อม SATA RAID-10 4 ไดรฟ์
การตั้งค่ามาตรฐาน:
$ cat bench1.sh
#! /bin/dash
exec /usr/bin/find / -xdev -type d -size +200000c
$ cat bench2.sh
#! /bin/dash
exec /usr/local/sbin/findlargedir /ผลลัพธ์จริงที่วัดด้วย hyperfine:
$ hyperfine --prepare ' echo 3 | tee /proc/sys/vm/drop_caches '
./bench1.sh ./bench2.sh
Benchmark 1: ./bench1.sh
Time (mean ± σ): 357.040 s ± 7.176 s [User: 2.324 s, System: 13.881 s]
Range (min … max): 349.639 s … 367.636 s 10 runs
Benchmark 2: ./bench2.sh
Time (mean ± σ): 199.751 s ± 4.431 s [User: 75.163 s, System: 141.271 s]
Range (min … max): 190.136 s … 203.432 s 10 runs
Summary
' ./bench2.sh ' ran
1.79 ± 0.05 times faster than ' ./bench1.sh ' ฮาร์ดแวร์: 48-core Xeon Silver 4214, 7-Drive SM883 SATA HW RAID-5 อาร์เรย์, เนื้อหา 2TB (คอนเทนเนอร์โหลที่มีไฟล์ขนาดเล็ก)
การตั้งค่าเกณฑ์มาตรฐานเดียวกัน ผลลัพธ์:
$ hyperfine --prepare ' echo 3 | tee /proc/sys/vm/drop_caches '
./bench1.sh ./bench2.sh
Benchmark 1: ./bench1.sh
Time (mean ± σ): 392.433 s ± 1.952 s [User: 16.056 s, System: 81.994 s]
Range (min … max): 390.284 s … 395.732 s 10 runs
Benchmark 2: ./bench2.sh
Time (mean ± σ): 34.650 s ± 0.469 s [User: 79.441 s, System: 528.939 s]
Range (min … max): 34.049 s … 35.388 s 10 runs
Summary
' ./bench2.sh ' ran
11.33 ± 0.16 times faster than ' ./bench1.sh '