LINUX.ORG.RU
ФорумAdmin

Как удалить директорию в которой больше 1КК файлов?

 


3

9

вывод команды

ls -lah
drwxr-xr-x  2 postfix   postfix  4,0K Дек  1  2012 postfix
drwxrwxrwx  2 root      root    1016M Янв  6 16:45 pp5
drwxr-xr-x  2 root      root     4,0K Мар 31  2014 pycentral

перепробовал кучу способов http://serverfault.com/questions/183821/rm-on-a-directory-with-millions-of-files

http://superuser.com/questions/680119/deleting-millions-of-files

http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

и не чего не помогает, более 24 часов уже не могу удалить хоть один файл из директории pp5 Может у кого то есть опыт? mkfs не предлагать...



Последнее исправление: cetjs2 (всего исправлений: 2)
Ответ на: комментарий от ipo

И чего, из-под ionice тоже стоит раком и жрет диск? Можно попробовать

find /var/lib/pp5/ -type f -print -delete
, хоть будет видно, работает оно или нет.

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

И чего, из-под ionice тоже стоит раком и жрет диск?

ionice — вещь в себе. Скажем, на большой вложенности например, 256x256x100, старая фрагментированная ext4 ставить машину колом даже с ionice idle. В то время, как reisrefs в тех же условиях пыхтит, скрипит, но система остаётся отзывчивой даже при дефолтовом приоритете. Я так паре машин «вторую жизнь» обеспечил, переведя деревья кешей на reisrefs. А знакомый, не имея возможности оперативно поменять ФС (LVM нет, машина боевая, удалённая, без KVM) попробовал поднять nginx-кеш на reiserfs в файл-образе поверх ext4 и писал о резком снижении LA...

Всё руки не доходят придумать условия для теста производительности ФС для каталогов высокой вложенности при параллельной работе на старых, часто меняющихся разделах. Чтобы уже объективно, с цифрами было... Пока только косвенные оценки, типа http://juick.com/Balancer/2229209

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

Я ionice в данном случае упомянул в качестве «всяко не повредит».

У ТСа, как я понял, файло плоско валяется в каталоге, без иерархии.

thesis ★★★★★
()
Ответ на: комментарий от nikolnik

да одно и то же с perl, просто с ним компилировать не надо.

низкоуровнево считывать

сисколы, в которые транслируются readdir (емнип ->getdents) уже самые низкоуровневые. Быстрее уже не будет(возможно чуть ускорится, если удалять пачками по несколько сотен).

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

Но вообще то, если такую задачу решать, надо тупо делать strace rm dir -rf и смотреть где затык, на чтении(readdir=>getdents) или на записи (unlink). Если всё таки на записи, то поможет только терпение(ну или возможно оптимизация чуть выше). Если висит на чтении(что маловероятно), то есть вероятность что провисит неопределённое время, надо смотреть на сложность реализации и скорость на меньшем количестве файлов

Но я не специалист в ядре, ФС и не программист, просто раз уж советы про звёздочку пошли)

disarmer ★★★
()
Ответ на: комментарий от disarmer
strace rm -rf /var/lib/pp5/
execve("/bin/rm", ["rm", "-rf", "/var/lib/pp5/"], [/* 20 vars */]) = 0
brk(0)                                  = 0x1e3d000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f814188d000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=35851, ...}) = 0
mmap(NULL, 35851, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8141884000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\357\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1603600, ...}) = 0
mmap(NULL, 3717176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f81412e4000
mprotect(0x7f8141466000, 2097152, PROT_NONE) = 0
mmap(0x7f8141666000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x182000) = 0x7f8141666000
mmap(0x7f814166b000, 18488, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f814166b000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8141883000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8141882000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8141881000
arch_prctl(ARCH_SET_FS, 0x7f8141882700) = 0
mprotect(0x7f8141666000, 16384, PROT_READ) = 0
mprotect(0x60d000, 4096, PROT_READ)     = 0
mprotect(0x7f814188f000, 4096, PROT_READ) = 0
munmap(0x7f8141884000, 35851)           = 0
brk(0)                                  = 0x1e3d000
brk(0x1e5e000)                          = 0x1e5e000
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2709120, ...}) = 0
mmap(NULL, 2709120, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f814104e000
close(3)                                = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
lstat("/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
newfstatat(AT_FDCWD, "/var/lib/pp5/", {st_mode=S_IFDIR|0700, st_size=1064390656, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "/var/lib/pp5", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fcntl(3, F_GETFD)                       = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFDIR|0700, st_size=1064390656, ...}) = 0
fcntl(3, F_GETFL)                       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fcntl(3, F_DUPFD, 3)                    = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
getdents(3, 
ipo
() автор топика
Ответ на: комментарий от ipo

Ну раз виснет значит либо фрагментация высокая, либо ядро/ФС/драйвер ФС совсем старые(debian же, ну). Когда ФС создана? начистую или из ext3? Когда fsck был?

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

disarmer ★★★
()
Ответ на: комментарий от ipo

все что запускаю в директории /var/lib/pp5/ не убивается ни как, только ребут. блин вообще засада... перестал удалять после ребута rm -rf /var/lib/pp5/

1. Для начала: проверь, по одному-два файла нормально удаляет или тоже виснет?

2. На всякий случай: какие права на файлы в /var/lib/pp5?

3. Ты все от root делаешь или от пользователя? Ну, это совершенно наивные вопросы (два последних), но чтобы ясно было.

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

ну тогда три выхода, а на самом деле один:

перенос на другой диск (самый простой и логичный),

апгрейд ядра (может всё сломать, может и не помочь),

ждать (возможно вечно).

А еще, если есть список имён файлов внутри, то можно попробовать их удалить по одному, может удаление не зависнет

disarmer ★★★
()
Ответ на: комментарий от ipo

начал rm -rf /var/lib/pp5/ удалять спустя 15 минут.

Чего он начал удалять? Папку? То есть проблема решена или нет? Не ясно.

Если зайти в папку /var/lib/pp5 и просто запустить там find, то он виснет или найденные файлы начинают там бежать по экрану (прервать - Ctrl+C)?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/
time find ./ -type f -delete
# for i in $(echo *); do 
echo "Deleting : $i"; rm -f $i;
anonymous
()
Ответ на: комментарий от Zubok

Чего он начал удалять? Папку? То есть проблема решена или нет? Не ясно.

решена, rm -rf /var/lib/pp5/ удаляет долго, но удаляет

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

Я не знаю, что в них может быть. Я создаю пустые сейчас на посмотреть, что будет, если 1КК файлов как у тебя)

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

Ха, у меня ls подвис уже на 500К файлах, прикольно.

а у меня такой вывод и знать не знаю сколько там файлов

drwxr-xr-x  2 postfix   postfix  4,0K Дек  1  2012 postfix
drwx------  2 root      root    1016M Янв  7 01:39 pp5
drwxr-xr-x  2 root      root     4,0K Мар 31  2014 pycentral
и не понятно почему 1016М?

ipo
() автор топика

Для чистоты эксперимента сообщаю, что у меня удалилось за 8 мин.

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

У меня на ~550К написало, что кончилось место... Хотя df говорит, что использовано только 10%.

Именно место или inodes кончились? Посмотри, сколько доступно на разделе: df -i

Zubok ★★★★★
()
Ответ на: комментарий от ipo

удалилось /var/lib/pp5/

бэкап был? а то народ ещё не наэкспериментировался

zolden ★★★★★
()
Ответ на: комментарий от Zubok

До начала эксперимента:

Файловая система                                       Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
rootfs                                                 625856         31912    593944             6% /
udev                                                    30557           322     30235             2% /dev
tmpfs                                                   31817           242     31575             1% /run
/dev/disk/by-uuid/f006bc88-c786-42ef-9f14-359a95a5f57e 625856         31912    593944             6% /
tmpfs                                                   31817             2     31815             1% /run/lock
tmpfs                                                   31817             2     31815             1% /run/shm
Создало файлов 593944 и программа остановилась. Результат:
Файловая система                                       Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
rootfs                                                 625856        625856         0           100% /
udev                                                    30557           322     30235             2% /dev
tmpfs                                                   31817           242     31575             1% /run
/dev/disk/by-uuid/f006bc88-c786-42ef-9f14-359a95a5f57e 625856        625856         0           100% /
tmpfs                                                   31817             2     31815             1% /run/lock
tmpfs                                                   31817             2     31815             1% /run/shm
Создавал файлы так:
#coding: utf-8

import uuid
import sys

i=0

while 1:
    t_uuid=uuid.uuid4()
    try:
        f=open('session-'+str(t_uuid), 'a')
        f.write(str(t_uuid))
        f.close()
    except:
        sys.exit()
    else:
        i+=1
        print i 
Удаление:
#time rm -rf tmp/

real    7m37.214s
u time rm -rf tmp/

real    7m37.214s
user    0m1.056s
sys     0m11.657s
ser    0m1.056s
sys     0m11.657s

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

Ну, собственно, я и хотел сказать, что у тебя inodes закончились, а не место на диске, как ты сказал. У тебя на rootfs максимум 625856. Из них 593944 было свободно. Вот ты их своим экспериментом и сожрал.

Zubok ★★★★★
()
Ответ на: комментарий от Berluskoni

так файлы то у тебя пустые, а у меня от 23 byte до 5Kbyte. Бекап не сделал, единственный раз я рад за то, что не сделал бекап.

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

пример

-rw------- 1 www-data www-data 4,6K Янв  7 12:10 sess_vugn30oqvrqme9oh2qpikq5pb0
-rw------- 1 www-data www-data   23 Янв  7 10:37 sess_vuibqu8ak34urvb2ccc1ps8bi2
-rw------- 1 www-data www-data   26 Янв  7 10:23 sess_vulm00spl13p1ekv9pjj78fs92
-rw------- 1 www-data www-data 3,9K Янв  7 09:15 sess_vun4jk36tkavfin2ajrdvrdkk6
-rw------- 1 www-data www-data   23 Янв  7 07:18 sess_vuo2kds7s3m0ctu6d80m5srsk4
-rw------- 1 www-data www-data 4,7K Янв  7 08:48 sess_vuo8mrkc6d2fngrc30gtv3vab4
-rw------- 1 www-data www-data 2,5K Янв  7 06:35 sess_vurqj8vm606tage48olnv10nu2
-rw------- 1 www-data www-data   26 Янв  7 09:22 sess_vusqrcfmbvpolakbfof46dqot3
-rw------- 1 www-data www-data   23 Янв  7 10:32 sess_vv01nm6943qmot6bav0b43mq11
-rw------- 1 www-data www-data  544 Янв  7 10:15 sess_vv0eg6eddq9qjfpqhqh1n9hcv1
-rw------- 1 www-data www-data   23 Янв  7 07:25 sess_vv2dv3adc9hoim6lsjt3ua6mm1
-rw------- 1 www-data www-data 4,6K Янв  7 07:37 sess_vv2v47tj1ug0nttbl2uh3d8dg2
-rw------- 1 www-data www-data 2,5K Янв  7 09:01 sess_vv60g8ph8hf96fhevrt90llft7
-rw------- 1 www-data www-data  12K Янв  7 09:28 sess_vvab8l5pjkpma9rt8rsj4oqkd4
-rw------- 1 www-data www-data   23 Янв  7 06:47 sess_vvh6cduqqiuk0v4ihbdt245u84
-rw------- 1 www-data www-data  388 Янв  7 10:11 sess_vvk5bv21djd4jpu3meds48r757
-rw------- 1 www-data www-data   23 Янв  7 11:23 sess_vvmv1291601imcgj95ds2e11u6
-rw------- 1 www-data www-data 2,5K Янв  7 12:09 sess_vvnk8iv2vqt8npjkumq30t8po7
-rw------- 1 www-data www-data 2,7K Янв  7 10:18 sess_vvo8grjjpj7jdha271t5nnguk0
-rw------- 1 www-data www-data   26 Янв  7 09:22 sess_vvpqfhl7p494g0dvk3al2vbaj7
-rw------- 1 www-data www-data 4,9K Янв  7 06:40 sess_vvr1pc9t1ui563ib12q203rih7
-rw------- 1 www-data www-data   23 Янв  7 11:20 sess_vvtn5b4h9fdm1jitn9qdsu4h77
-rw------- 1 www-data www-data  11K Янв  7 09:27 sess_vvtvdt5lnepuvbvo898biouh33
-rw------- 1 www-data www-data 1,2K Янв  7 08:14 sess_vvvlf7ssbu10cagr5i7hme23t7

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

Не пустые, я в них uuid записываю, посмотри как создаю. Могу еще что туда запихнуть ради чистоты эксперимента.

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

inodes задаются при создании ФС, по умолчанию зависит от размера раздела. Можно увеличить с помощью tune2fs. Размер файлов роли не играет, проблема чтения из структур ФС. Можно без виртуалки, просто создав еще один раздел, который потом можно дропнуть совсем

disarmer ★★★
()
Ответ на: комментарий от Acceptor

когда rm -rf у меня вылетал с ошибкой о слишком большом количестве аргументов, то пришлось поставить mc и через него директория целиком удалилась без ошибок и лишних вопросов )

facepalm то какой!

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

и tune2fs работает только с ext*. В остальных ФС, использующих inodes, они динамически выделяются, там бы этой проблемы не возникло

disarmer ★★★
()
Ответ на: комментарий от Berluskoni

Зомбя-ОСь с старым, как шерсть мамонта, не модно-молодежным уфс-ом (т.е фря 10.1)

mdconfig -a -t malloc -s 2G -u 0
newfs -U -b 4096 -f 512 -i 512 md0
Reduced frags per cylinder group from 14496 to 14480 to enlarge last cyl group
/dev/md0: 2048.0MB (4194304 sectors) block size 4096, fragment size 512
	using 290 cylinder groups of 7.07MB, 1810 blks, 14480 inodes.
	with soft updates

mount -o noatime /dev/md0 /mymem
запускаю скрипт, останавливаю.
df -ahi
Filesystem              Size    Used   Avail Capacity iused ifree %iused  Mounted on
...
/dev/md0                1,0G    639M    299M    68%    1,2M  3,0M   28%   /mymem

df -i
/dev/md0               1043795   653995    306296    68% 1176953  3022245   28%   /mymem
time ls /mymem|wc -l
 1176951
ls -GF /mymem  12,99s user 7,69s system 3% cpu 20,714 total
wc -l  0,54s user 0,01s system 3% cpu 20,712 total
time rm -rf /mymem 
rm -rf /mymem  1,26s user 88,62s system 1% cpu 1:31,92 total
Я так понимаю, что результат не ахти :)

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

newfs -U -b 4096 -f 512 -i 512 md0

U = softupdates
b = block size
f = fragment size 
i = density of inodes (т.е айнод на каждые 512 байт)
anonymous
()

Тему не читал, но по одной из твоих ссылок есть решение
find /dir -delete
которое мне как-то помогло в подобной ситуации: Нехватка Inode на ext4 разделе
(там есть ещё одно, более костыльное).

Просто запусти find /path/to/pp5 -delete
а в соседней консоли пару раз набери df -i чтобы убедиться, что файлы удаляются. Всего же эта команда может выполняться хоть неделю, если у тебя слабый компьютер и несколько миллионов файлов. У меня работала около 30 часов.

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

Я так понимаю, что результат не ахти :)

Ужасный результат. У тебя в RAM работает всего в 5.3 раза быстрее, чем у меня на древнем компе (середнячок 2008 года) на диске с максимальным линейным чтением 38Мб/с

$ time ls -1f test/ | wc -l
1179254

real    0m4.085s 
user    0m1.440s 
sys     0m0.488s 


$ time ls -1f test/ | wc -l
1179254

real    0m1.189s 
user    0m1.064s 
sys     0m0.288s 


$ time rm -rf test/

real    8m9.894s
user    0m2.780s
sys     1m53.532s   -- почти твои 1:31 (остальное 8:10-1:53-0:03 -- iowait)


$ lscpu
Model name: AMD Athlon(tm) 64 X2 Dual Core Processor 4200+

$ lspci | grep storage
04:06.0 SCSI storage controller: Adaptec AHA-2940U2/U2W

$ sudo dd if=/dev/vg1/fstest of=/dev/null bs=1024k count=2048
2147483648 bytes (2.1 GB) copied, 56.5418 s, 38.0 MB/s

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от anonymous
$ time ls -1f testram/ | wc -l
605720

real    0m0.766s
user    0m0.560s
sys     0m0.328s

$ time rm -rf testram/ 

real    0m3.271s
user    0m0.520s
sys     0m2.720s
sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.