Epic fail... (Ну ооочень много файлов надо удалить...)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Epic fail...

Сообщение Anguis »

Вообще это фейл конкретный :( Есть сервер, на нем сайт крутится. В одной директории создаются файлики сессионные, и не удаляются. Файлы мелкого размера макс по 2 кб...
Я забил на серв этот с сайтом.. Он жил абсолютно своей жизнью долгое время, и не плохо жил, пока не стал выдавать сообщения о кончившемся на устройстве месте... А на устройстве добрых 250 гб.......
В итоге имеем:

Код: Выделить всё

# ls -ldh .
drwx--S--- 2 www-data www-data 1017M 2011-04-06 19:52 .


Я даже представить не могу сколько там файлов.... А уж как их удалить вообще загадка великая. rm виснет.

Код: Выделить всё

find . -type f -delete;

Это сжирает всю память и ни чего не удаляет..
Выручайте.. Может скриптик на удаление по 1000 штук в крон на 10 минутный интервал сунуть...
Короче я в растерянности
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Epic fail...

Сообщение drBatty »

Anguis писал(а):
06.04.2011 20:41
Я даже представить не могу сколько там файлов.... А уж как их удалить вообще загадка великая. rm виснет.

rm -rf /dir/
не виснет (без звёздочки!)

find dir -exec rm {} +
тоже не виснет.

да, и каталог в 1гб - это не так уж и много...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

drBatty писал(а):
06.04.2011 21:22
Anguis писал(а):
06.04.2011 20:41
Я даже представить не могу сколько там файлов.... А уж как их удалить вообще загадка великая. rm виснет.

rm -rf /dir/
не виснет (без звёздочки!)

find dir -exec rm {} +
тоже не виснет.

да, и каталог в 1гб - это не так уж и много...

Насколько я понимаю, это мета инфо.. По некоторым данным мета инфо миллиона файлов будет весить 40 Мб.. Т.е. получается что у меня там порядка 25 с половиной миллионов файлов...
du -h /dir/
так-же задумывается с концами..
rm -rf /dir/ дествительно не виснет.. И память не кушает бешеными количествами. Вопрос в том, сколько такая команда будет работать? Серв админится по ssh и я думаю, что если вдруг произойдет разрыв соединения, не отменится ли действие команды? К тому же сайт на это время придется погасить... А сколько времени пройдет? День, неделя? Меня за йайца подвесят за такое время...

Провел небольшой тест с rm -rf /dir/. При разрыве соединения действие команды обрывается вместе с процессом консоли...
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

А что если попробовать так?

Код: Выделить всё

mv dir /dev/null

:g:
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo
Контактная информация:

Re: Epic fail...

Сообщение Brainsburn »

Anguis писал(а):
06.04.2011 21:44
А что если попробовать так?

Код: Выделить всё

mv dir /dev/null

:g:

А есть разница?оО

Если есть возможность обрыва соединения, то мне кажется можно попробовать что-то вроде
for i in `ls`; rm $i; done
В таком случае скрипт не будет забивать память параметрами, а сразу начнет выполняться. Хотя я могу ошибаться. Можно проверить - выполнить его и остановить через несколько секунд, а затем сравнить количество файлов ls | wc -l
...
хотя скорее всего я ошибаюсь )
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Brainsburn писал(а):
06.04.2011 21:46
Anguis писал(а):
06.04.2011 21:44
А что если попробовать так?

Код: Выделить всё

mv dir /dev/null

:g:

А есть разница?оО

Если есть возможность обрыва соединения, то мне кажется можно попробовать что-то вроде
for i in `ls`; rm $i; done
В таком случае скрипт не будет забивать память параметрами, а сразу начнет выполняться. Хотя я могу ошибаться. Можно проверить - выполнить его и остановить через несколько секунд, а затем сравнить количество файлов ls | wc -l
...
хотя скорее всего я ошибаюсь )

Это очень сложно сделать потому как ls | wc -l тоже уходит в бесконечность, как и просто ls.. Надо что-то такое, что будет сразу по одному файлу рубить, а не составлять список и по нему удалять...

В Вашем примере в цикле ls будет выполнятся столько, сколько и rm -rf /dir/ ...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Epic fail...

Сообщение diesel »

Anguis писал(а):
06.04.2011 21:36
Провел небольшой тест с rm -rf /dir/. При разрыве соединения действие команды обрывается вместе с процессом консоли...


nohup rm -rf /dir/

ну или screen ...

ЗЫ: правда осторожнее с командой, она ж снесет и директорию, которую вы сносить не хотите ... Вот если вы сделаете что-то типа ln -s /dir /some/place; rm -rf /some/place/; - директория выживет.
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

diesel писал(а):
06.04.2011 21:58
Anguis писал(а):
06.04.2011 21:36
Провел небольшой тест с rm -rf /dir/. При разрыве соединения действие команды обрывается вместе с процессом консоли...


nohup rm -rf /dir/

ну или screen ...

ЗЫ: правда осторожнее с командой, она ж снесет и директорию, которую вы сносить не хотите ... Вот если вы сделаете что-то типа ln -s /dir /some/place; rm -rf /some/place/; - директория выживет.

Мне уже пофиг на директорию. Интереснот только сколько она исполнятся будет, это-же время простоя... Я могу некоторое время ссылаться на тех работы.
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo
Контактная информация:

Re: Epic fail...

Сообщение Brainsburn »

Ради интереса создал 600 тыс. файлов. ls | wc -l на моем однопроцессорном выполнялась несколько секунд, так что боюсь представить, сколько у вас там файлов. Посчитал кол-во файлов, заупстил find . -delete и прервал сразу же, посчитал кол-во файлов - файлов стало меньше. То же самое с rm -rf /dir/
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Второй час уже выполняется nohup rm -rf dir .... Будем ждать :) Блин, надо было время выполнения засечь..
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo
Контактная информация:

Re: Epic fail...

Сообщение Brainsburn »

Anguis писал(а):
06.04.2011 23:32
Второй час уже выполняется nohup rm -rf dir .... Будем ждать :) Блин, надо было время выполнения засечь..

Можно по df -i отслеживать, кстати, удаляется или зависло
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Да, видно. Процесс идет. Но ждать придется не мало удаляет со скоростью примерно процент в пять-семь минут... часов десять ждать :)
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Для справки.
Все это происходит на серве со следующими параметрами:
Intel Core 2 Duo 5200, 2,5ГГц, 2 МБ L2 кэш, 800МГц шина
2 ГБ озу
Диск, как оказалось, 320ГБ...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Epic fail...

Сообщение NickLion »

Мда. Неплохо было бы в cron добавить очистку этой директории. И вынести эту папку на отдельный раздел, и в случае чего просто сделать mkfs.
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Атас... выполнение уже около 10 часов... df -i показал что освободилось только четыре процента от занимаемого пространства...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Epic fail...

Сообщение watashiwa_daredeska »

Anguis писал(а):
06.04.2011 22:08
Интереснот только сколько она исполнятся будет, это-же время простоя...
Сначала mv dir dir.old, потом rm -rf dir.old, а пока она работает (хоть сутки), можно восстанавливать dir.
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Так и сделал.. Работать она будет врятли одни сутки... С недельку наверное :)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Epic fail...

Сообщение drBatty »

Anguis писал(а):
06.04.2011 21:36
Насколько я понимаю, это мета инфо..

это имена файлов и номера инодов. +некоторые расходы на организацию би-дерева.
Brainsburn писал(а):
06.04.2011 21:46
Если есть возможность обрыва соединения, то мне кажется можно попробовать что-то вроде
for i in `ls`; rm $i; done

НЕЛЬЗЯ.

эта ваша ls начнёт создавать список в памяти, а потом его люто, бешено сортировать. Состаритесь, если памяти хватит конечно. Со звёздочкой та-же беда (она тоже сортирует список файлов в памяти). rm -r dir/ НЕ создаёт и не сортирует список, она последовательно читает каталог (ЕМНИП этот каталог даже не обязан быть в памяти целиком).

Ключевое слово тут "сортировка", ибо для сортировки нужна RAM, и её не засвопить (рандомный доступ нужен).
Anguis писал(а):
07.04.2011 00:15
Диск, как оказалось, 320ГБ...

tune2fs -l покажите. Сколько у вас там Inode count?
Anguis писал(а):
07.04.2011 10:12
df -i показал что освободилось только четыре процента от занимаемого пространства...

ждите...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

drBatty писал(а):
07.04.2011 11:51
эта ваша ls начнёт создавать список в памяти, а потом его люто, бешено сортировать. Состаритесь, если памяти хватит конечно. Со звёздочкой та-же беда (она тоже сортирует список файлов в памяти). rm -r dir/ НЕ создаёт и не сортирует список, она последовательно читает каталог (ЕМНИП этот каталог даже не обязан быть в памяти целиком).

Именно! Я пробовал различные варианты.

Код: Выделить всё

#find dir -type f -delete;
#for i in *; do rm $i; done
#find . -type f | while read FILENAME; do rm $FILENAME;  echo "$FILENAME";  done
#rm -rf *

И только rm -rf dir начинает удалять сразу без составления списка, соответственно не хавает бешеное количество рама и процессорного времени.. (бедный жесткий) Все остальные работают со списком.
drBatty писал(а):
07.04.2011 11:51
Ключевое слово тут "сортировка", ибо для сортировки нужна RAM, и её не засвопить (рандомный доступ нужен).
Anguis писал(а):
07.04.2011 00:15
Диск, как оказалось, 320ГБ...

tune2fs -l покажите. Сколько у вас там Inode count?

Код: Выделить всё

# tune2fs -l /dev/sda3
tune2fs 1.41.3 (12-Oct-2008)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          a6234207-345d-4be1-91ad-df17848e9157
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              30269440
Block count:              121059815
Reserved block count:     6052990
Free blocks:              116653796
Free inodes:              15008896
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      995
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Sat Apr 24 17:38:58 2010
Last mount time:          Wed Apr  6 20:41:12 2011
Last write time:          Wed Apr  6 20:41:12 2011
Mount count:              9
Maximum mount count:      29
Last checked:             Tue Mar 15 12:49:19 2011
Check interval:           15552000 (6 months)
Next check after:         Sun Sep 11 13:49:19 2011
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       28404055
Default directory hash:   half_md4
Directory Hash Seed:      f1a1aea6-f399-4e84-bb8c-d4330b338470
Journal backup:           inode blocks

Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Для меня кстати загадка, почему эти файлы не удаляются автоматически? Это-же сессионные файлы php. По идее по окончании сессии они должны уничтожаться..
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Epic fail...

Сообщение drBatty »

Anguis писал(а):
07.04.2011 12:42
Все остальные работают со списком.

вариант со списком тоже работает. Только список надо засунуть в файл. Тогда система не будет вынужденна хранить его в памяти.
Anguis писал(а):
07.04.2011 12:42
Inode count: 30269440
Free inodes: 15008896

сколько было, и сколько свободно сейчас.
Anguis писал(а):
07.04.2011 15:16
Для меня кстати загадка, почему эти файлы не удаляются автоматически? Это-же сессионные файлы php. По идее по окончании сессии они должны уничтожаться..

не должны. там хранятся данные о сессии, между заходами юзеров. Т.е.
1) вы открыли страницу, и авторизовались
2) вы ещё раз её открыли уже авторизовавшись

Между 1 и 2 может пройти сколько угодно времени, даже если оно ограничено, надо всё равно это выяснить...

Нормальные люди хранят такое в БД. Причём скажем движки форумов позволяют одмину в один клик всё почистить (раз в году).

Ну напишите скрипт, который удаляет там все файлы старше 1 мес, либо пакует их в архив, если интересна статистика.

find -ctime вам поможет...

ЗЫЖ точнее find -newer последний_архив

кстати, я-бы разметил в EXT4, и использовал опцию -N задав побольше инодов. Думаю, место вам там не очень нужно, и простаивает.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Там логи еще были тоже не малого размера.. поэтому по показателям инодов не стоит судить о скорости удаления..
Я в крон засунул find dir -type f -delete на ежесуточное выполнение. Авторизация в движке хранится в куках, сессионные переменные используются только изредка в основном для модераторов и админов, так что долгое хранение этих файлов ни к чему вообще.
А вот по поводу разметки файловой системы.. Я думаю не стоит это того, что бы заниматься этим по ссш на арендуемом серве, который вероятно в скором времени вовсе перестанет арендоваться (собственно это и явилось причиной мего забивания на это всё). Разве что практики ради...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Epic fail...

Сообщение drBatty »

Anguis писал(а):
07.04.2011 17:16
Я в крон засунул find dir -type f -delete на ежесуточное выполнение.

добавьте таки -mmin +1440
если файл был изменён 24 часа назад или ещё раньше - то он очевидно уже не нужен. я-бы добавил amin (доступ), но многие монтируют с noatime, ибо это аж на 0.00001% быстрее...
Anguis писал(а):
07.04.2011 17:16
А вот по поводу разметки файловой системы..

как хотите. можно наоборот N уменьшить, если там немного больших файлов, а мелких нет. А вот логи надо чистить logrotate.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Надо лог замутить :)
Люди! Не повторяйте мою ошибку! :)
Процесс удаления был начат примерно 6 апреля в 22 часа 10 минут.
Сейчас Пятница 8 апреля 02:37.
Эти два команды были выполнены примерно в час дня с интервалом в полчаса (все очень примерно).

Код: Выделить всё

~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            30269440 14869156 15400284   50% /
tmpfs                 224198       4  224194    1% /lib/init/rw
udev                  224198    1171  223027    1% /dev
tmpfs                 224198       1  224197    1% /dev/shm
/dev/sda1             120480      28  120452    1% /boot


~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            30269440 14646812 15622628   49% /
tmpfs                 224198       4  224194    1% /lib/init/rw
udev                  224198    1171  223027    1% /dev
tmpfs                 224198       1  224197    1% /dev/shm
/dev/sda1             120480      28  120452    1% /boot

Эта сейчас:

Код: Выделить всё

~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            30269440 13414071 16855369   45% /
tmpfs                 224198       4  224194    1% /lib/init/rw
udev                  224198    1171  223027    1% /dev
tmpfs                 224198       1  224197    1% /dev/shm
/dev/sda1             120480      28  120452    1% /boot

Такие дела :)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Epic fail...

Сообщение sash-kan »

а /usr/bin/unlink не шустрее ли будет, чем /bin/rm ?

btw. вообще попахивает какими-то аппаратными (а может и программными) проблемами.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Epic fail...

Сообщение drBatty »

sash-kan писал(а):
08.04.2011 04:23
btw. вообще попахивает какими-то аппаратными (а может и программными) проблемами.

всё нормально. Представьте - имеется сильноветвящееся дерево на 30 000 000 узлов. Причём оптимизировано оно ессна на ПОИСК. вставка/удаление очевидно тоже работают, причём весьма быстро - время вставки/удаление пропорционально O(log(N)), т.е. для вставки нам нужно сначала спустится по дереву к нужному листу, затем подняться, при этом по пути исправлять структуру. На практике время удаления одного узла довольно значительно, несколько миллисекунд. А всего узлов 30 000 000.

sash-kan писал(а):
08.04.2011 04:23
а /usr/bin/unlink не шустрее ли будет, чем /bin/rm ?

Shell

$ unlink 100500 unlink: невозможно удалить ссылку «100500»: Это каталог



Anguis
на практике в таком случае я просто затариваю весь раздел кроме этого каталога, потом mkfs, потом tar x. Вы можете сделать также, развернуть на другом винте, а потом быстренько их поменять местами ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Epic fail...

Сообщение sash-kan »

drBatty писал(а):
08.04.2011 10:06
unlink: невозможно удалить ссылку «100500»: Это каталог
ну, зачем же каталоги? файлы, конечно. с помощью find -type f -exec
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Пятница, 8 апреля 16:19

Код: Выделить всё

~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            30269440 11662866 18606574   39% /


Что-то не охото мне тарить корневуху... Процесс идет, и пусть себе идет :)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Epic fail...

Сообщение drBatty »

sash-kan писал(а):
08.04.2011 16:16
ну, зачем же каталоги? файлы, конечно. с помощью find -type f -exec

а какая разница? основное время тут тратится как раз на изменение структуры каталога, а эту структуру по любому надо менять. Вот если-бы ФС умела удалять сразу скажем 100 файлов... Но она не умеет.

Anguis писал(а):
08.04.2011 16:19
Что-то не охото мне тарить корневуху... Процесс идет, и пусть себе идет

это быстрее. хотя... комп железный, пусть пашет.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Anguis
Сообщения: 212
ОС: Manjaro 17

Re: Epic fail...

Сообщение Anguis »

Быть может, предпоследний пост с логом. Уже не много осталось, думаю в ближайшие сутки процесс завершится. Постараюсь отследить это дело, но получится или нет.. Посмотрим.
Итак, состояние на 11 апреля время 12:45

Код: Выделить всё

~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            30269440 3261362 27008078   11% /
Спасибо сказали:
Ответить