
(فيريس المحقق من قبل إستير أرزولا ، التصميم الأصلي لكارين روساد تولفا)
FindLargedir هي أداة مكتوبة خصيصًا للمساعدة في تحديد أدلة "الثقب الأسود" بسرعة على أي نظام ملفات يحتوي على أكثر من 100 ألف إدخالات في بنية مسطحة واحدة. عندما يكون للدليل العديد من الإدخالات (الدلائل أو الملفات) ، يصبح الحصول على قائمة الدليل أبطأ وأبطأ ، مما يؤثر على الأداء لجميع العمليات التي تحاول الحصول على قائمة دليل (على سبيل المثال لحذف بعض الملفات و/أو العثور على بعض الملفات المحددة). يتم تجميد العمليات القراءة للدليل الكبير أثناء القيام بذلك وينتهي الأمر في النوم غير المنقطعة (حالة "D") لفترات أطول وأطول من الزمن. اعتمادًا على نظام الملفات ، قد يبدأ هذا في أن يصبح مرئيًا من خلال إدخالات 100 ألف ويبدأ في أن يكون تأثيرًا ملحوظًا للغاية مع إدخالات 1M+.
لا يمكن لهذه الأدلة في الغالب أن تتقلص حتى إذا تم تنظيف المحتوى بسبب حقيقة أن معظم أنظمة ملفات Linux و Un*X لا تدعم تقليص Inode Directory (على سبيل المثال Ext3/Ext4). يحدث هذا في كثير من الأحيان مع دليل جلسات الويب المنسي (مجلد جلسات PHP حيث تم تكوين فاصل GC لعدة أيام) ، ومجلدات ذاكرة التخزين المؤقت المختلفة (قوالب CMS واختداءات ذاكرة التخزين المؤقت) ، ونظام ملفات ملفات POSIX المحاكاة ، وما إلى ذلك.
سيحاول البرنامج تحديد أي عدد من هذه الأحداث والإبلاغ عنها بناءً على المعايرة ، أي. كم عدد إدخالات الدليل المفترضة معبأة في كل دليل دليل لكل نظام ملفات. أثناء القيام بذلك ، ستحدد نسبة نمو inode الدليل إلى عدد من الإدخالات/inodes وستستخدم هذه النسبة لمسح نظام الملفات بسرعة ، وتجنب إجراء عمليات بحث باهظة الثمن/بطيئة. على الرغم من أن هناك العديد من الأدوات التي تقوم بمسح نظام الملفات ( find ، du ، ncdu ، إلخ) ، لا يستخدم أي منها الاستدلال لتجنب عمليات البحث باهظة الثمن ، نظرًا لأنها مصممة لتكون دقيقة تمامًا ، في حين أن هذه الأداة تهدف إلى استخدام الاستدلال وتنبيه المشكلات دون أن تتعثر في مجموعات من المشاكل.
لن يتبع البرنامج Symlinks ويتطلب أذونات R/W لمعايرة الدليل لتكون قادرة على حساب حجم inode الدليل إلى عدد نسبة الإدخالات وتقدير عدد من الإدخالات في دليل دون حسابها فعليًا. في حين أن هذه الطريقة هي مجرد تقريب للعدد الفعلي للإدخالات في الدليل ، إلا أنه من الجيد بما يكفي للمسح الضوئي للدلالات المسيرة بسرعة.

-a ) في الإفراط في الإدخال/الإخراج واستخدام الذاكرة المفرط ؛ استخدم فقط عند الاقتضاء 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 Option) ، يتم تبديل وضع المعلمة الواحدة ( -o ) بشكل افتراضي ، ولكن يمكن تعطيله إذا لزم الأمر.
من الممكن تخطي مرحلة المعايرة تمامًا من خلال توفير حجم inode يدويًا إلى عدد نسبة الإدخالات مع المعلمة -i . من المنطقي فقط عندما تعرف بالفعل النسبة ، على سبيل المثال من عمليات التشغيل السابقة.
سيؤدي الإعداد -p paramter إلى 0 إلى إيقاف البرنامج من إعطاء تحديثات الحالة العرضية.
الأجهزة: 8-core Xeon E5-1630 مع 4-Drive SATA RAID-10
الإعداد القياسي:
$ 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 --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 ، SM883 SATA HW RAID-5 ، محتوى 2 تيرابايت (عشرات الحاويات مع ملفات صغيرة)
نفس الإعداد القياسي. نتائج:
$ 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 '