Определите местоположение использования Inode

Я полагаю, что будет необходимо, по крайней мере, иметь администратора домена на сервере LDAP, прибывшем для ввода их пароля по крайней мере в один раз для выполнения то, что Вы хотите и соединяете Samba с доменом.

Учитывая, что, шаги должны быть относительно простыми. Взятый от Samba Wiki, набор следующее в Вашей конфигурации самбы:

* passdb backend = ldapsam:ldap://
* ldap suffix = 
* ldap admin dn 

Затем выполненный smbpasswd-w, чтобы позволить самбе знать пароль для администратора dn.

Здесь существует также хорошая рецензия.

15
задан 14 July 2009 в 13:11
12 ответов

Не ожидайте, что это будет работать быстро...

CD к каталогу, где Вы подозреваете, мог бы быть подкаталогом с большим количеством inodes. Если этот сценарий занимает огромное количество времени, Вы, вероятно, нашли где в файловой системе смотреть. / var хорошее начало...

Иначе, если Вы будете изменяться на главный каталог в той файловой системе и выполнять это и ожидать его для окончания, то Вы найдете каталог со всем inodes.

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 каталогами).

Различные люди указали, что ls не силен в этом, потому что он сортирует вывод. Я попробовал эхо, но это является также не большим. Кто-то еще указал, что статистика дает эту информацию (количество записей каталога), но что это не портативно. Оказывается, что находят, что-maxdepth действительно быстр во вводных каталогах и считает .files, так... вот.. точки для всех!

15
ответ дан 2 December 2019 в 20:45
  • 1
    @mike G: You' ре 100%, корректных об этом не быть самым быстрым способом сделать этот вид вещи. В моем уме корректный способ оптимизировать это состоит в том, чтобы перенаправить к stderr при запуске и окончании " каталог количества entries" часть сценария. Тот путь при ударе каталога миллионом записей, он скажет " обработка каталога, spool/postfix/maildrop" и затем не говорят немедленно " finished" и бум - смотрит в spool/postfix/maildrop и you' ll видят много файлов. –  chris 10 July 2009 в 17:44
  • 2
    Я также wasn' t взволнованный по поводу стоимости сортировки, поскольку это - одноразовая или по крайней мере довольно нечастая задача. –  Dave Forgac 12 July 2009 в 06:22

Grrr, комментарий требует 50 представителей, таким образом, этот ответ является на самом деле комментарием к ответу chris.

Так как корреспондент, вероятно, не заботится обо всех каталогах, только худшие, затем с помощью вида являются, вероятно, очень дорогим излишеством.

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 очень больших каталога, и первое, оказывается, имеет еще 1 inode, чем 2-е, то Вы никогда не будете видеть 2-е.

Больше полного решения состояло бы в том, чтобы записать более умный сценарий жемчуга, который отслеживает лучшие 10 значений, замеченных, и распечатывает значения в конце. Но это слишком длинно для быстрого ответа serverfault.

Кроме того, некоторые midly более умные сценарии жемчуга позволили бы, Вы пропустить цикл с условием продолжения - на большинстве платформ, ls сортируете результаты, и это может также быть очень дорого для больших каталогов. ls вид не необходим здесь, так как все, о чем мы заботимся, является количеством.

6
ответ дан 2 December 2019 в 20:45
  • 1
    Верный о ls - в таких ситуациях я волнуюсь больше об этом являющийся ясным что I' m выполнение и не так о производительности. I' m вполне уверенный, что можно использовать $line эха /* | туалет-w вместо ls $line | туалет-l и Вы избегаете ls, сортирующего проблему. –  chris 10 July 2009 в 17:35
  • 2
    Я просто запустил тест на каталоге с миллионом файлов, и ls занял 22 секунды, и эхо * заняло 12 секунд. (Для записи отзовитесь эхом * в оболочке won' t поражают предел аргумента, потому что эхо в 99% оболочек в активном использовании является встроенным), –  chris 10 July 2009 в 17:37
  • 3
    ls-f won' t сортируют результаты. Сортировка результатов каталога приводит к типичной проблеме с NFS и большими каталогами. Если время, чтобы читать и отсортировать каталог (на сервере) превышает тайм-аут NFS, каталог и подкаталоги неприменимы. –  mpez0 11 February 2010 в 16:33

Это не прямой ответ на Ваш вопрос, но поиск недавно измененных файлов с небольшого размера находкой использования мог бы сузить Ваш поиск:

find / -mmin -10 -size -20k
3
ответ дан 2 December 2019 в 20:45
find /path ! -type d | sed 's,/[^/]*$,,' | uniq -c | sort -rn

ls не найдет файлы, имена которых запускаются с периода. Используя находку избегает этого. Это находит каждый файл в дереве каталогов, ступает от базового имени с конца каждого пути и считает количество раз, каждый путь к каталогу появляется в получающемся выводе. Вам, вероятно, придется поместить!"" в кавычках, если Ваша оболочка жалуется на это.

Inodes может также быть израсходован файлами, которые были удалены, но считаются открытые рабочим процессом. Если этот пакет Munin включает какие-либо постоянно под управлением программы, другая вещь проверить состоит в том, содержит ли это открытый необычное количество файлов.

3
ответ дан 2 December 2019 в 20:45
  • 1
    inodes мог также быть взят действительно глубокими каталогами, который этот won' t находят. Существует много странных пограничных случаев в этом, но наиболее распространенная ситуация является каталогом, полным файлов с нормальными именами. –  chris 10 July 2009 в 22:22

(не бывший способный комментировать действительно становится старым - это для egorgry),

egorgry - ls-i печатает inode ЧИСЛО для записи, не КОЛИЧЕСТВО inode.

Попробуйте его файлом в Вашем каталоге - Вы будете (вероятно), видеть одинаково высокое количество, но это не количество inodes, это - просто inode #, Ваша запись каталога указывает на.

2
ответ дан 2 December 2019 в 20:45
  • 1
    lol. Я проголосовал за Вас один. Спасибо за объяснение. использование inode всегда сбивало с толку. –  egorgry 10 July 2009 в 18:05
  • 2
    спасибо Теперь I' m боясь преобразовать это в комментарий к Вашему узлу, в случае, если я теряю карму, когда я удаляю этот ответ :) –  Mike G. 10 July 2009 в 18:06

Я был бы скот вынуждать этого: выполненная растяжка на всем устройстве для базовой линии, затем осуществляет проверку некоторое время спустя, и незаконный каталог перетерпит как воспаленный ползунок.

3
ответ дан 2 December 2019 в 20:45
  • 1
    Это, вероятно, заняло бы миллиард лет. Более быстрая вещь сделать состоит в том, чтобы выполнить lsof | grep DIR и посмотреть в каждом из тех каталогов для большого количества новых файлов. –  chris 10 July 2009 в 23:26
  • 2
    Хорошо, как насчет этого: найдите / | вид > /tmp/find1.txt; найдите / | вид > /tmp/find2.txt; различный /tmp/find1.txt /tmp/find2.txt –  Geoff Fritz 10 July 2009 в 23:38

использование inode - приблизительно один на файл или каталог, правильно? Сделайте

find [path] -print | wc -l

рассчитывать приблизительно, сколько inodes используется под [путем].

1
ответ дан 2 December 2019 в 20:45
[gregm@zorak2 /]$ ls -i /home
131191 gregm

мой дом на моем ноутбуке использует 131191 inodes.

-1
ответ дан 2 December 2019 в 20:45
  • 1
    ls-i печатает inode ЧИСЛО для записи, не КОЛИЧЕСТВО inode. Попробуйте его файлом в Вашем каталоге - you' ll (вероятно), видят одинаково высокое количество, но it' s не количество inodes, it' s просто inode # Ваша запись каталога указывает на. –  egorgry 10 July 2009 в 18:08

Можно использовать этот небольшой отрывок:

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

Это распечатает, сколько файлов и каталогов находится в каждом из каталогов в текущей папке с крупнейшими преступниками внизу. Это поможет Вам найти каталоги, которые имеют много файлов. (больше информации)

5
ответ дан 2 December 2019 в 20:45

Я пытался записать эффективный конвейер оболочки, но это стало громоздким и или медленным или неточным, например,

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

перечислит листовые каталоги (и некоторые другие) больше чем с 1 000 файлов в них. Так, вот сценарий Perl, чтобы сделать это эффективно и во время и в RAM. Вывод похож

«файлы в поддереве» «files-directly-in-directory» «имя каталога»

таким образом, можно массажировать и отфильтровать его легко он с помощью нормальных инструментов, например, вид (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
ответ дан 2 December 2019 в 20:45

Если проблемой является один каталог со слишком многими файлами, вот простое решение:

# 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
7
ответ дан 2 December 2019 в 20:45

Обновление

Один лайнер, который возвращает количество inode каждого дочернего элемента данного каталога с наибольшими записями внизу.

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
2
ответ дан 2 December 2019 в 20:45

Теги

Похожие вопросы