ইনোড ব্যবহারের অবস্থান নির্ধারণ করুন


15

সিস্টেমের ব্যবহারের উপর নজর রাখতে আমি সম্প্রতি মুনিনকে একটি ডেভলপমেন্ট ওয়েব সার্ভারে ইনস্টল করেছি। আমি চিহ্নিত করেছি যে প্রতিদিনের মধ্যে সিস্টেমের ইনোডের ব্যবহার প্রায় 7-8% বৃদ্ধি পাচ্ছে যদিও ডিস্কের ব্যবহার সবেমাত্র বাড়েনি। আমি অনুমান করছি যে কিছু কিছু ছোট ফাইল লিখছে তবে আমি কী / কোথায় খুঁজে পাচ্ছি না।

আমি কীভাবে ডিস্কের স্থান ব্যবহার সন্ধান করতে জানি তবে ইনোডের ব্যবহারের সংক্ষিপ্তসারের উপায় খুঁজে পাচ্ছি না।

ডিরেক্টরি দ্বারা ইনোড ব্যবহার নির্ধারণ করার জন্য কি কোনও ভাল উপায় আছে যাতে আমি ব্যবহারের উত্সটি সনাক্ত করতে পারি?

উত্তর:


15

এটি দ্রুত চালিত হবে আশা করবেন না ...

সিডি এমন একটি ডিরেক্টরিতে যেখানে আপনি সন্দেহ করেন যে প্রচুর ইনোড সহ একটি উপ-ডিরেক্টরি থাকতে পারে। যদি এই স্ক্রিপ্টটি প্রচুর পরিমাণে সময় নেয় তবে আপনি সম্ভবত ফাইল সিস্টেমের মধ্যে কোথায় সন্ধান করবেন তা খুঁজে পেয়েছেন। / var একটি ভাল শুরু ...

অন্যথায়, আপনি যদি সেই ফাইল সিস্টেমের শীর্ষ ডিরেক্টরিতে পরিবর্তন করেন এবং এটি চালান এবং এটি শেষ হওয়ার জন্য অপেক্ষা করেন, আপনি সমস্ত ইনোড সহ ডিরেক্টরিটি পাবেন।

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

আমি বাছাইয়ের ব্যয় নিয়ে চিন্তিত নই। আমি একটি পরীক্ষা চালিয়েছি এবং ৩,০০,০০০ ডিরেক্টরির বিপরীতে আউটপুটটি বাছাই করে seconds সেকেন্ড সময় নিয়েছিলাম। প্রাথমিক খোঁজ নিয়েছে। আসল ব্যয়টি লুপের মধ্যে এই সমস্ত ডিরেক্টরি খুলছে। (লুপ নিজেই 22 সেকেন্ড নেয়)। (পরীক্ষার তথ্যটি একটি উপ-ডিরেক্টরিতে 350,000 ডিরেক্টরি সহ পরিচালিত হয়েছিল, যার মধ্যে একটিতে মিলিয়ন ফাইল ছিল, বাকিগুলির 1 থেকে 15 ডিরেক্টরি ছিল)।

বিভিন্ন লোক নির্দেশিত করেছিল যে এলএস এর পক্ষে দুর্দান্ত নয় কারণ এটি আউটপুটটি সাজায়। আমি প্রতিধ্বনির চেষ্টা করেছি, তবে এটিও দুর্দান্ত নয়। অন্য কেউ চিহ্নিত করেছিলেন যে স্ট্যাটটি এই তথ্যটি দেয় (ডিরেক্টরি প্রবেশের সংখ্যা) তবে এটি পোর্টেবল নয়। দেখা যাচ্ছে যে -ম্যাক্সডেপথটি খোলার ডিরেক্টরিগুলি এবং গণনাগুলি ফাইলে সত্যিই দ্রুত হয়, সুতরাং ... এটি এখানে .. প্রত্যেকের জন্য পয়েন্ট!


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

গ্রার, মন্তব্য করার জন্য 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

এটি আপনার সংস্করণ হিসাবে সম্পূর্ণ নয়, তবে এটি প্রিন্ট লাইনগুলি কী করে যদি তা পূর্বের সর্বাধিকের চেয়ে বড় হয়, মুদ্রিত আওয়াজের পরিমাণকে হ্রাস করে এবং সাজানোর ব্যয়টি সংরক্ষণ করে saving

এর নেতিবাচক দিকটি যদি আপনার 2 টি খুব বড় ডিরেক্টরি থাকে এবং প্রথমটি 2 য় এর চেয়ে 1 টি আরও বেশি ইনোড রাখে তবে আপনি দ্বিতীয়টি কখনই দেখতে পাবেন না।

আরও একটি সম্পূর্ণ সমাধান হ'ল একটি স্মার্ট পার্ল স্ক্রিপ্ট লিখতে হবে যা দেখা গেছে শীর্ষস্থানীয় 10 টি মানকে লক্ষ্য রাখে এবং শেষে প্রিন্ট করে। তবে দ্রুত সার্ভারফল্ট উত্তরের জন্য এটি অনেক দীর্ঘ long

এছাড়াও, কিছু মাঝারি স্মার্ট পার্ল স্ক্রিপ্টিং আপনাকে বেশিরভাগ প্ল্যাটফর্মে, লুপটি এড়িয়ে যেতে দেয় - ফলাফলগুলি বাছাই করে এবং বড় ডিরেক্টরিগুলির জন্য এটি খুব ব্যয়বহুলও হতে পারে। এখানে ls বাছাই করা প্রয়োজনীয় নয়, যেহেতু আমরা যা যত্ন করি সেগুলিই গণনা।


1
এলএস সম্পর্কে সত্য - এরকম পরিস্থিতিতে আমি কী করছি তা পরিষ্কার হওয়া এবং পারফরম্যান্স সম্পর্কে এতটা না নিয়ে আমি আরও উদ্বিগ্ন। আমি নিশ্চিত যে আপনি প্রতিধ্বনি $ লাইন / * ব্যবহার করতে পারেন lc $ line এর জায়গায় wc -w ডাব্লুসি-এল এবং আপনি এলএস বাছাইয়ের বিষয়টি এড়ান।
ক্রিস

আমি মাত্র একটি মিলিয়ন ফাইল সহ ডিরেক্টরিতে একটি পরীক্ষা চালিয়েছি এবং 22 সেকেন্ড এবং প্রতিধ্বনি * 12 সেকেন্ড নিয়েছে took (রেকর্ডের জন্য, শেলের ইকো * আর্গ সীমাটিতে আঘাত করবে না কারণ সক্রিয় ব্যবহারে 99% শেলের মধ্যে প্রতিধ্বনি একটি অন্তর্নির্মিত)
ক্রিস

ls -f ফলাফলগুলি বাছাই করে না। ডিরেক্টরি ফলাফলগুলি বাছাই করা এনএফএস এবং বড় ডিরেক্টরিগুলির সাথে একটি সাধারণ সমস্যা বাড়ে। ডিরেক্টরি পড়ার এবং বাছাইয়ের সময়টি যদি (সার্ভারে) এনএফএসের সময়সীমা অতিক্রম করে, ডিরেক্টরি এবং উপ-ডিরেক্টরিগুলি ব্যবহারের অযোগ্য।
এমপিজে ০0

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 চালানো গ্রেপ ডিআইআর এবং প্রচুর নতুন ফাইলের জন্য সেই ডিরেক্টরিগুলির প্রত্যেকটিতে সন্ধান করুন।
ক্রিস

2
ঠিক আছে, এটি সম্পর্কে: সন্ধান / | সাজান> /tmp/find1.txt; সন্ধান / | সাজান> /tmp/find2.txt; diff /tmp/find1.txt /tmp/find2.txt
জিওফ ফ্রিটজ

2

(মন্তব্য করতে না পেরে সত্যই পুরানো হয়ে যায় - এটি হ'ল দৌরাত্ম্যের জন্য)

উদয় - ls -i একটি প্রবেশের জন্য ইনোড NUMBER প্রিন্ট করে, ইনোড COUNT নয়।

এটি আপনার ডিরেক্টরিতে কোনও ফাইল দিয়ে চেষ্টা করুন - আপনি (সম্ভবত) একটি সমান উচ্চ সংখ্যা দেখতে পাবেন, তবে এটি ইনোডের গণনা নয়, এটি কেবল ইনড # আপনার ডিরেক্টরিতে প্রবেশের পয়েন্ট।


হাঃ হাঃ হাঃ. আমি আপনাকে ভোট দিয়েছি। বর্নানার জন্য ধন্যবাদ. ইনোড ব্যবহার সর্বদা বিভ্রান্তিকর ছিল।
উদয় 15

ধন্যবাদ এখন আমি এটিকে আপনার নোডের একটি মন্তব্যে রূপান্তর করতে ভয় পাচ্ছি, যদি আমি এই উত্তরটি মুছে ফেলি তবে আমি যদি কর্মটি হারাতে পারি :)
মাইক জি।

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 টিরও বেশি ফাইল রয়েছে will সুতরাং, সময় এবং র‌্যাম উভয় ক্ষেত্রে দক্ষতার সাথে এটি করার জন্য এখানে একটি পার্ল স্ক্রিপ্ট। আউটপুট মত

«ফাইল-ইন-সাবট্রি» «ফাইল-সরাসরি-ডিরেক্টরি-ডিরেক্টরি«-ডিরেক্টরি-নাম »

সুতরাং আপনি এটিকে সাধারণ সরঞ্জামগুলি ব্যবহার করে খুব সহজেই ফিল্টার করতে পারেন, যেমন উপরের মত সাজান (1) বা অ্যাজক (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 একটি প্রবেশের জন্য ইনোড NUMBER প্রিন্ট করে, ইনোড COUNT নয়। এটি আপনার ডিরেক্টরিতে কোনও ফাইল দিয়ে চেষ্টা করুন - আপনি (সম্ভবত) একটি সমান উচ্চ সংখ্যা দেখতে পাবেন, তবে এটি ইনোডের গণনা নয়, এটি কেবল ইনড # আপনার ডিরেক্টরিতে প্রবেশের পয়েন্ট।
উদয় 15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.