इनोड उपयोग का स्थान निर्धारित करें


15

मैंने हाल ही में सिस्टम के उपयोग पर नज़र रखने के लिए मुनिन को एक विकास वेब सर्वर पर स्थापित किया है। मैंने नोट किया है कि सिस्टम का इनोड उपयोग प्रति दिन लगभग 7-8% तक चढ़ रहा है, हालांकि डिस्क उपयोग मुश्किल से बढ़ा है। मैं अनुमान लगा रहा हूं कि कुछ टन छोटी फ़ाइलों को लिख रहा है, लेकिन मुझे पता नहीं है कि क्या / कहाँ है।

मुझे पता है कि डिस्क स्थान का उपयोग कैसे करना है, लेकिन मैं इनोड उपयोग को संक्षेप में प्रस्तुत करने का तरीका नहीं खोज सकता।

क्या निर्देशिका द्वारा इनोड उपयोग को निर्धारित करने का एक अच्छा तरीका है ताकि मैं उपयोग के स्रोत का पता लगा सकूं?

जवाबों:


15

यह जल्दी से चलाने की उम्मीद मत करो ...

एक निर्देशिका में सीडी जहां आपको संदेह है कि बहुत सारे इनोड के साथ एक उपनिर्देशिका हो सकती है। यदि यह स्क्रिप्ट बहुत अधिक समय लेती है, तो आपको संभावना है कि फाइलसिस्टम में कहां देखें। / var एक अच्छी शुरुआत है ...

अन्यथा, यदि आप उस फाइलसिस्टम में शीर्ष निर्देशिका में बदलते हैं और इसे चलाते हैं और इसके खत्म होने तक प्रतीक्षा करते हैं, तो आप सभी इनोड्स के साथ निर्देशिका प्राप्त करेंगे।

find . -type d | 
while 
  read line  
do 
  echo "$( find "$line" -maxdepth 1 | wc -l) $line"  
done | 
sort -rn | less

मैं छँटाई की लागत के बारे में चिंतित नहीं हूँ। मैंने एक परीक्षण चलाया और 350,000 निर्देशिकाओं के खिलाफ 8 सेकंड लगे उस के अनसोल्ड आउटपुट के माध्यम से छंटनी। शुरुआती खोज हुई। वास्तविक लागत इन सभी निर्देशिकाओं को लूप में खोल रही है। (लूप खुद 22 सेकंड लेता है)। (परीक्षण डेटा को 350,000 निर्देशिकाओं के साथ एक उपनिर्देशिका पर चलाया गया था, जिनमें से एक में एक लाख फाइलें थीं, बाकी में 1 और 15 निर्देशिकाएं थीं)।

विभिन्न लोगों ने कहा था कि एलएस महान नहीं है क्योंकि यह आउटपुट को छाँटता है। मैंने प्रतिध्वनि की कोशिश की थी, लेकिन वह भी महान नहीं है। किसी और ने कहा था कि स्टेट इस जानकारी (निर्देशिका प्रविष्टियों की संख्या) देता है, लेकिन यह पोर्टेबल नहीं है। यह पता चलता है कि -maxdepth निर्देशिका और काउंट्स खोलने में वास्तव में तेज़ है। फ़ाइल्स, इसलिए ... यहाँ यह है .. सभी के लिए अंक!


2
@ माइक जी: आप इस तरह की चीज़ करने का सबसे तेज़ तरीका नहीं होने के बारे में 100% सही हैं। मेरे दिमाग में, स्क्रिप्ट के "काउंट डाइरेक्टरी एंट्री" भाग को शुरू करने और पूरा करने के दौरान इसे ऑप्टिमाइज़ करने का सही तरीका स्टैडर पर पुनर्निर्देशित करना है। इस तरह, जब आप एक निर्देशिका को एक लाख प्रविष्टियों के साथ हिट करते हैं, तो यह "प्रोसेसिंग डायरेक्टरी स्पूल / पोस्टफिक्स / मेलड्रॉप" कहेगा और फिर तुरंत "समाप्त" और बूम नहीं कहेगा - स्पूल / पोस्टफिक्स / मेलड्रॉप में देखें और आप बहुत सारे देखेंगे फ़ाइलें।
क्रिस

मैं भी छँटाई की लागत के बारे में चिंतित नहीं था क्योंकि यह एक बार या कम से कम काफी हद तक निराधार कार्य है।
डेव फोर्गैक

7

यदि समस्या बहुत सी फ़ाइलों के साथ एक निर्देशिका है, तो यहां एक सरल समाधान है:

# Let's find which partition is out of inodes:
$ df -hi
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3               2.4M    2.4M       0  100% /
...

# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d

findरेखा के पीछे विचार यह है कि किसी निर्देशिका का आकार उस निर्देशिका के अंदर सीधे फ़ाइलों की मात्रा के लिए आनुपातिक है। इसलिए, यहां हम इसके अंदर मौजूद फ़ाइलों की टन के साथ निर्देशिकाओं की तलाश करते हैं।

यदि आप एक संख्या का अनुमान नहीं लगाना चाहते हैं, और "आकार" द्वारा आदेशित सभी संदिग्ध निर्देशिकाओं को सूचीबद्ध करना पसंद करते हैं, तो यह आसान भी है:

# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n

6

Grrr, टिप्पणी करने के लिए 50 प्रतिनिधि की आवश्यकता होती है। तो यह जवाब वास्तव में क्रिस के जवाब पर एक टिप्पणी है।

चूंकि प्रश्नकर्ता शायद सभी निर्देशिकाओं के बारे में परवाह नहीं करता है, केवल सबसे बुरे लोग हैं, तो सॉर्ट का उपयोग करना बहुत महंगा ओवरकिल है।

find . -type d | 
while 
  read line  
do 
  echo "$(ls "$line" | wc -l) $line"  
done | 
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]'  | less

यह आपके संस्करण के रूप में पूर्ण नहीं है, लेकिन यह क्या है प्रिंट लाइनें हैं यदि वे पिछले अधिकतम से बड़े हैं, तो बाहर मुद्रित शोर की मात्रा को काफी कम कर देते हैं, और प्रकार के खर्च को बचाते हैं।

इसका नकारात्मक पक्ष यह है कि यदि आपके पास 2 बहुत बड़ी निर्देशिकाएं हैं, और पहली बार 2 की तुलना में 1 अधिक इनकोड होता है, तो आप कभी भी दूसरा नहीं देखेंगे।

एक अधिक पूर्ण समाधान एक उत्कृष्ट पर्ल स्क्रिप्ट लिखना होगा जो शीर्ष 10 मूल्यों को देखे जाने पर नज़र रखता है, और अंत में उन्हें प्रिंट करता है। लेकिन यह एक त्वरित सर्वरफॉल्ट उत्तर के लिए बहुत लंबा है।

इसके अलावा, कुछ मिडिल होशियार पर्ल स्क्रिप्टिंग आपको लूप को छोड़ देती है - अधिकांश प्लेटफार्मों पर, एलएस परिणाम को सॉर्ट करते हैं, और यह बड़ी निर्देशिकाओं के लिए बहुत महंगा भी हो सकता है। एलएस सॉर्ट यहां आवश्यक नहीं है, क्योंकि हम सभी के बारे में ध्यान रखते हैं कि गिनती है।


1
एलएस के बारे में सच है - इस तरह की स्थितियों में मैं इस बारे में अधिक चिंता करता हूं कि यह स्पष्ट है कि मैं क्या कर रहा हूं और प्रदर्शन के बारे में इतना नहीं। मुझे पूरा यकीन है कि आप गूंज $ लाइन / * का उपयोग कर सकते हैं wc -w के स्थान पर ls $ लाइन | wc -l और आप ls सॉर्टिंग समस्या से बचें।
क्रिस

मैंने सिर्फ एक निर्देशिका में एक मिलियन फ़ाइलों के साथ एक परीक्षण चलाया और एलएस ने 22 सेकंड और गूंज * 12 सेकंड का समय लिया। (रिकॉर्ड, गूंज * खोल में लिए आर्ग सीमा तक नहीं पहुंच नहीं करेगा क्योंकि सक्रिय उपयोग में गोले के 99% में गूंज एक अंतर्निहित है)
क्रिस

ls -f परिणाम सॉर्ट नहीं करेगा। निर्देशिका परिणामों की छंटनी एनएफएस और बड़ी निर्देशिकाओं के साथ एक आम समस्या की ओर ले जाती है। यदि निर्देशिका (सर्वर पर) को पढ़ने और सॉर्ट करने का समय NFS के समय से अधिक है, तो निर्देशिका और उपनिर्देशिका अनुपयोगी हैं।
mpez0

5

आप इस छोटे स्निपेट का उपयोग कर सकते हैं:

find | cut -d/ -f2 | uniq -c | sort -n

यह पता लगाएगा कि वर्तमान फ़ोल्डर में प्रत्येक निर्देशिका में कितनी फाइलें और निर्देशिकाएं हैं, सबसे नीचे अपराधी हैं। यह उन निर्देशिकाओं को खोजने में आपकी मदद करेगा जिनके पास बहुत सारी फाइलें हैं। ( अधिक जानकारी )


इसने शानदार ढंग से काम किया।
पीटमान

3

यह आपके प्रश्न का सीधा उत्तर नहीं है, लेकिन हाल ही में संशोधित फ़ाइलों के साथ एक छोटे आकार के साथ खोज करने से आपकी खोज सीमित हो सकती है:

find / -mmin -10 -size -20k

3
find /path ! -type d | sed 's,/[^/]*$,,' | uniq -c | sort -rn

ls को ऐसी फाइलें नहीं मिलेंगी जिनके नाम एक अवधि से शुरू होते हैं। खोज का उपयोग करने से बचा जाता है। यह डायरेक्टरी ट्री की हर फाइल को ढूँढता है, प्रत्येक पथ के अंत से बेसन को स्टाइप करता है, और परिणामी आउटपुट में प्रत्येक डाइरेक्टरी पथ की संख्या को गिनता है। आपको "डाल देना पड़ सकता है!" उद्धरण में अगर आपका शेल इसके बारे में शिकायत करता है।

इनोड का उपयोग उन फ़ाइलों द्वारा भी किया जा सकता है जिन्हें हटा दिया गया है, लेकिन एक चल रही प्रक्रिया के द्वारा खुला रखा जा रहा है। यदि इस मुनिन पैकेज में लगातार चलने वाले कार्यक्रम शामिल हैं, तो यह जांचने के लिए एक और बात है कि क्या यह एक असामान्य संख्या में फाइल खोल रहा है।


इनोड्स को वास्तव में गहरी निर्देशिकाओं द्वारा भी लिया जा सकता है, जो यह नहीं मिलेगा। इसमें कई अजीब तरह के किनारे हैं, लेकिन सबसे सामान्य स्थिति सामान्य नामों वाली फाइलों से भरी एक निर्देशिका है।
क्रिस

3

मैं इस पर बल देता हूँ: एक बेसलाइन के लिए पूरे डिवाइस पर ट्रिपवायर रन करें, फिर कुछ समय बाद एक चेक रन करें और आपत्तिजनक निर्देशिका एक गले में अंगूठे की तरह चिपक जाएगी।


इसकी संभावना एक अरब वर्ष होगी। एक तेज बात lsof चलाने के लिए है | grep DIR और उन निर्देशिकाओं में से प्रत्येक में बहुत सी नई फाइलें देखें।
क्रिस

2
ठीक है, इस बारे में कैसे: / | सॉर्ट> /tmp/find1.txt; खोज / | सॉर्ट> /tmp/find2.txt; diff /tmp/find1.txt /tmp/find2.txt
ज्योफ फ्रिट्ज़

2

(टिप्पणी करने में सक्षम होना वास्तव में पुराना नहीं है - यह उदाहरण के लिए है)

egorgry - ls -i एक प्रविष्टि के लिए इनकोड संख्या को प्रिंट करता है, इनकोड COUNT को नहीं।

अपनी निर्देशिका में एक फ़ाइल के साथ इसे आज़माएं - आप (शायद) एक समान रूप से उच्च संख्या देखेंगे, लेकिन यह इनोड्स की गिनती नहीं है, यह सिर्फ इनोड # आपकी निर्देशिका प्रविष्टि बिंदु है।


जबरदस्त हंसी। मैंने आपको एक वोट दिया। स्पष्टीकरण के लिए धन्यवाद। इनोड उपयोग हमेशा भ्रामक रहा है।
एगोर्री जूल

धन्यवाद अब मैं अपने नोड पर एक टिप्पणी में बदलने से डरता हूं, जब मैं इस जवाब को हटाता हूं तो मैं कर्म खो देता हूं :)
माइक जी।

2

अपडेट करें

एक लाइनर जो नीचे दी गई सबसे बड़ी प्रविष्टियों के साथ दिए गए डायरेक्टरी के प्रत्येक बच्चे के इनकोड काउंट को लौटाता है।

find . -mindepth 1 -printf "%p/%i\n" \
  | awk -F/ '{print $2"/"$NF}' | sort -u \
  | cut -d/ -f1 | uniq -c | sort -n

मूल उत्तर

#!/bin/bash
# Show inode distribution for given directory

dirs=$(find $1 -mindepth 1 -maxdepth 1 -type d)

for dir in $dirs
do
    inode_count=$(find $dir -printf "%i\n" 2> /dev/null | sort -u | wc -l)
    echo "$inode_count $dir"
done

इसे इस तरह से चलाएं (यह देखते हुए कि उपरोक्त स्क्रिप्ट आपकी कार्यशील निर्देशिका में निष्पादन योग्य फ़ाइल में रहती है)

./indist / | sort -n

1

इनोड का उपयोग लगभग प्रति फ़ाइल या निर्देशिका, सही है? ऐसा

find [path] -print | wc -l

[पथ] के तहत कितने इनोड का उपयोग किया जाता है, यह गिनने के लिए।


1

मैंने एक कुशल शेल पाइप लाइन लिखने की कोशिश की, लेकिन यह कमज़ोर हो गई और या तो धीमी या गलत हो गई, जैसे,

find . -depth -printf '%h\n' | uniq -c | awk '$1>1000'

उनमें 1000 से अधिक फाइलों के साथ लीफ डाइरेक्टरी (और कुछ अन्य) को सूचीबद्ध करेगा। तो, यहां एक पर्ल स्क्रिप्ट है जो इसे समय और रैम दोनों में कुशलता से करने के लिए है। आउटपुट जैसा है

«फाइलें-इन-सबट्री» «फाइलें-सीधे-इन-डायरेक्टरी» «डायरेक्टरी-नाम»

इसलिए आप मालिश कर सकते हैं और इसे आसानी से फ़िल्टर कर सकते हैं सामान्य उपकरण, उदाहरण के लिए, सॉर्ट (1) या awk (1) ऊपर के रूप में।

#! /usr/bin/perl -w
# Written by Kjetil Torgrim Homme <kjetil.homme@redpill-linpro.com>

use strict;
use File::Find;

my %counted;
my %total;

sub count {
    ++$counted{$File::Find::dir};
}

sub exeunt {
    my $dir = $File::Find::dir;

    # Don't report leaf directories with no files
    return unless $counted{$dir}; 

    my $parent = $dir;
    $parent =~ s!/[^/]*$!!;

    $total{$dir} += $counted{$dir};
    $total{$parent} += $total{$dir} if $parent ne $dir;
    printf("%8d %8d %s\n", $total{$dir}, $counted{$dir}, $dir);
    delete $counted{$dir};
    delete $total{$dir};
}

die "Usage: $0 [DIRECTORY...]\n" if (@ARGV && $ARGV[0] =~ /^-/);
push(@ARGV, ".") unless @ARGV;

finddepth({ wanted => \&count, postprocess => \&exeunt}, @ARGV);

-1
[gregm@zorak2 /]$ ls -i /home
131191 gregm

मेरे लैपटॉप पर मेरा घर 131191 इनकोड का उपयोग कर रहा है।


3
ls -i एक प्रविष्टि के लिए इनोड नंबर प्रिंट करता है, इनकोड COUNT नहीं। अपनी निर्देशिका में एक फ़ाइल के साथ इसे आज़माएं - आप (शायद) एक समान रूप से उच्च संख्या देखेंगे, लेकिन यह इनोड्स की गिनती नहीं है, यह सिर्फ आपकी इनोड # निर्देशिका प्रविष्टि बिंदु है।
१५:३० पर जार्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.