LINUX.ORG.RU
решено ФорумAdmin

ls: листинг огромного каталога жрёт память


3

1

Доброго времени суток.

Внутренний почтовый сервер внезапно оказался высоконагруженным ресурсом ( :D ). Один человек никогда не очищал корзину, и теперь листинг этого каталога висит и ест память ( уже 11 мин, ls ~ 1,3 Gb RES ( !!! ) )

На мой взгляд, ситуация аномальная, т.к. ls -f $dir должен выводить содержимое сразу же, без сортировки. Если каталог большой - да, медленно и печально, но сразу. А тут ест память совершенно молча. При том что останавливал и проверял ФС, отключил всех других потребителей диска. RHEL 5.8, ext3. Нормально ли такое поведение ls? Что можно использовать вместо него?

Пока думаю подцепить новый диск и перенести всё кроме этого чёртова каталога. Но это устранение симптома, а не причины

ls -f /home/maildb/username/.Trash/cur/
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                             
 5888 root      18   0 1681m 1.3g  844 D  2.0 90.4   0:11.73 ls
[root@vml-mail-office ~]# ls -lhd /home/maildb/username/.Trash/cur/
drwx------ 2 maildb maildb 574M Oct  3 02:12 /home/maildb/username/.Trash/cur/

up. пришло в себя, выводит километровый листинг

up2. Perl рулит и педалит. rm, ls и find почему-то нет. Правильное решение:

perl -e '$|=1; chdir "/home/maildb/username/.Trash/cur" or die; opendir D, "."; while ($n = readdir D) { unlink $n; }'

Или с подробностями:

perl -e '$|=1; chdir "/home/maildb/username/.Trash/cur" or die; opendir D, "."; while ($n = readdir D) { printf "\t%s\n", $n; unlink $n; }'

up3: Правильное решение б)

★★★★★

Последнее исправление: router (всего исправлений: 5)
Ответ на: комментарий от bhfq

Допустим, а почему жрёт память? ИМХО, должно прочитать несколько блоков каталога, при обнаружении первых же файлов вывести их на экран. Я же отключил сортировку ( ls -f ). Вместо этого всё содержимое грузится в память.

router ★★★★★
() автор топика
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от bhfq

Может не сработать, существует ограничение на число аргументов, которое можно передать программе. А судя по симптомам, в директории много больше миллиона файлов.

anonymous
()
Ответ на: комментарий от BaBL

Запустил rm -rf /home/maildb/username/.Trash/cur

У меня расхождение с автором статьи: rm занял 30% ( 741 Mb ) RAM ( а не 30 Мб ), но да, больше не растёт. Спасибо, посмотрю что выйдёт в итоге

router ★★★★★
() автор топика
Ответ на: комментарий от bhfq

Точно я?

Удаление через rm -r

$ rm -r /mnt/test_dir/
Под strace несколько раз подряд (!!!) вызывает getdents(), затем очень много вызывает unlinkat() и так в цикле. Занял 30Мб RAM, не растет.

router ★★★★★
() автор топика
Ответ на: комментарий от bhfq

Прибил, запустил заново. Параллельно, всё равно 30 % RAM

unalias rm, размеется, давно выполнил

router ★★★★★
() автор топика
Ответ на: комментарий от BaBL

Да, perl рулит и педалит со страшной силой. Спасибо, rm -r пойдёт лесом

router ★★★★★
() автор топика
Ответ на: комментарий от sdio

Спасибо, помогло. Пойду читать man ls полностью

router ★★★★★
() автор топика
Ответ на: комментарий от BaBL

Ждем deb пакетов.

//file: cleandir.c
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    struct dirent *entry;
    DIR *dp;
    chdir("/mnt/test_dir");
    dp = opendir(".");
    while( (entry = readdir(dp)) != NULL ) {
        if ( strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..") ){
            unlink(entry->d_name);  // maybe unlinkat ?
        }
    }
}
rezedent12 ☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.