
(Ferris the Detective oleh Esther Arzola, Desain Asli oleh Karen Rustad Tölva)
FindLargedir adalah alat yang ditulis secara khusus untuk membantu mengidentifikasi dengan cepat direktori "lubang hitam" pada sistem file apa pun yang memiliki lebih dari 100 ribu entri dalam satu struktur datar. Ketika sebuah direktori memiliki banyak entri (direktori atau file), mendapatkan daftar direktori menjadi lebih lambat dan lebih lambat, memengaruhi kinerja semua proses yang mencoba mendapatkan daftar direktori (misalnya untuk menghapus beberapa file dan/atau untuk menemukan beberapa file tertentu). Proses Membaca Inode Direktori Besar menjadi beku saat melakukannya dan berakhir dalam keadaan tidur yang tidak terputus (keadaan "D") untuk periode waktu yang lebih lama dan lebih lama. Bergantung pada sistem file, ini mungkin mulai terlihat dengan entri 100 ribu dan mulai menjadi dampak kinerja yang sangat nyata dengan entri 1m+.
Direktori semacam itu sebagian besar tidak dapat menyusut kembali bahkan jika konten dibersihkan karena fakta bahwa sebagian besar sistem file Linux dan un*x tidak mendukung penyusutan inode direktori (misalnya Ext3/Ext4 yang sangat umum). Ini sering terjadi dengan Direktori Sesi Web yang Terlupakan (folder Sesi PHP di mana interval GC dikonfigurasikan hingga beberapa hari), berbagai folder cache (Templat dan cache yang dikompilasi CMS), sistem file POSIX yang meniru penyimpanan objek, dll.
Program akan mencoba mengidentifikasi sejumlah acara tersebut dan melaporkannya berdasarkan kalibrasi , yaitu. Berapa banyak entri direktori yang diasumsikan dikemas di setiap inode direktori untuk setiap sistem file. Saat melakukannya, itu akan menentukan rasio pertumbuhan inode direktori terhadap jumlah entri/inode dan akan menggunakan rasio itu untuk dengan cepat memindai sistem file, menghindari melakukan pencarian direktori yang mahal/lambat. Meskipun ada banyak alat yang memindai sistem file ( find , du , ncdu , dll.), Tidak ada yang menggunakan heuristik untuk menghindari pencarian mahal, karena mereka dirancang untuk sepenuhnya akurat , sementara alat ini dimaksudkan untuk menggunakan heuristik dan waspada tentang masalah tanpa terjebak pada folder yang bermasalah.
Program tidak akan mengikuti symlink dan mensyaratkan izin R/W untuk mengkalibrasi direktori untuk dapat menghitung ukuran inode direktori dengan jumlah rasio entri dan memperkirakan sejumlah entri dalam direktori tanpa benar -benar menghitungnya. Meskipun metode ini hanyalah perkiraan dari jumlah entri aktual dalam direktori, itu cukup baik untuk dengan cepat memindai direktori yang menyinggung.

-a ) dapat menyebabkan I/O yang berlebihan dan penggunaan memori yang berlebihan; hanya gunakan jika perlu 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 Saat menggunakan mode akurat ( -a parameter), berhati -hatilah bahwa pencarian direktori besar akan menghentikan proses sepenuhnya untuk waktu yang lama. Apa yang dilakukan mode ini pada dasarnya adalah pass sekunder yang sepenuhnya akurat pada direktori yang mungkin menyinggung menghitung jumlah entri yang tepat.
Untuk menghindari turun ke sistem file yang dipasang (seperti pada opsi find -xdev), parameter mode satu file -files ( -o parameter) diaktifkan secara default, tetapi dapat dinonaktifkan jika perlu.
Dimungkinkan untuk sepenuhnya melewatkan fase kalibrasi dengan secara manual memberikan ukuran inode direktori untuk jumlah rasio entri dengan parameter -i . Masuk akal hanya jika Anda sudah mengetahui rasionya, misalnya dari berjalan sebelumnya.
Pengaturan -p Paramter ke 0 Akan Menghentikan Program dari memberikan pembaruan status sesekali.
Perangkat Keras: 8-Core Xeon E5-1630 dengan 4-drive Sata RAID-10
Pengaturan Benchmark:
$ cat bench1.sh
#! /bin/dash
exec /usr/bin/find / -xdev -type d -size +200000c
$ cat bench2.sh
#! /bin/dash
exec /usr/local/sbin/findlargedir /Hasil aktual diukur dengan 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 ' Perangkat Keras: 48-Core Xeon Silver 4214, 7-drive SM883 SATA HW RAID-5 Array, konten 2TB (selusin kontainer dengan file kecil)
Pengaturan Benchmark yang sama. Hasil:
$ 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 '