Самый быстрый способ удалить много файлов

Перенос из темы «Разговоры о компьютерах»
 
+
-
edit
 

Balancer

администратор
★★★★☆
компьютеры файловые системы флуд
Кто видел 2.6 млн. файлов в одном каталоге? :)


// Транслировано с juick.com
 

TbMA

опытный

Balancer> Кто видел 2.6 млн. файлов в одном каталоге? :)

Я видел в десятки раз больше. На интервью баловался вопросом - какой по вашему мнению самый быстрый способ удалить N*10 миллионов файлов. не форматируя диск. :)
 23.023.0
+
-
edit
 

Floyd

аксакал

Balancer> Кто видел 2.6 млн. файлов в одном каталоге? :)
Balancer> // Транслировано с juick.com

Бывает и больше, к примеру аудит. Забавно что в HPUX при превышении некоторого кол-ва файлов рекурсивный ls падает в кору, по причине переполнения целого при сортировке :))
 23.023.0
Это сообщение редактировалось 26.09.2013 в 18:55

Floyd

аксакал

TbMA> Я видел в десятки раз больше. На интервью баловался вопросом - какой по вашему мнению самый быстрый способ удалить N*10 миллионов файлов. не форматируя диск. :)

find ... -delete ?
 23.023.0

TbMA

опытный

Floyd> find ... -delete ?
Нет. Умирает или подвисает на десятки минут-часов.
 

Floyd

аксакал

В любом случае rm или find -delete будут выполняться последовательно с сопутствующими проверками. Или есть способ затереть inod-ы ?
 23.023.0

TbMA

опытный

Floyd> В любом случае rm или find -delete будут выполняться последовательно с сопутствующими проверками. Или есть способ затереть inod-ы ?

Не в этом дело, а в том что они читают в память, и если памяти не тонны (а на живой машине ее обычно не тонны) то быстро вылетают в свап. И начинаются дикие тормоза.
 
+
-
edit
 

arkhnchul

втянувшийся
TbMA> какой по вашему мнению самый быстрый способ удалить N*10 миллионов файлов. не форматируя диск. :)

снести каталог, их содержащий?
 24.024.0
+
-
edit
 

TbMA

опытный

arkhnchul> снести каталог, их содержащий?

Все равно полезет сносить файлы сначала ;)
 
+
-
edit
 

arkhnchul

втянувшийся
arkhnchul>> снести каталог, их содержащий?
TbMA> Все равно полезет сносить файлы сначала ;)

не эксплорером же. ЕМНИП, зависит от. Конкретно от того, как/где хранятся иноды/хардлинки в конкретной фс.
 24.024.0
+
-
edit
 

TbMA

опытный

arkhnchul> не эксплорером же. ЕМНИП, зависит от. Конкретно от того, как/где хранятся иноды/хардлинки в конкретной фс.

Разговор конечно про линукс или *nix.
 

Floyd

аксакал

TbMA> Не в этом дело, а в том что они читают в память, и если памяти не тонны (а на живой машине ее обычно не тонны) то быстро вылетают в свап. И начинаются дикие тормоза.

Что-то я не пойму с чего он в память должен читать. Стандартно отображает библиотеки и дескрипторы:

code text
  1. [root@vm ~]# touch /tmp/1111/{1..100000}
  2. [root@vm ~]# strace -e trace=mmap2,munmap,brk  rm /tmp/1111/*
  3. brk(0)                                  = 0x9ebc000
  4. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77ac000
  5. mmap2(NULL, 49897, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb779f000
  6. mmap2(0x349000, 1661320, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x349000
  7. mmap2(0x4d9000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f) = 0x4d9000
  8. mmap2(0x4dc000, 10632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4dc000
  9. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb779e000
  10. munmap(0xb779f000, 49897)               = 0
  11. brk(0)                                  = 0x9ebc000
  12. brk(0x9edd000)                          = 0x9edd000
  13. mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb759e000
  14. mmap2(NULL, 1171456, PROT_READ, MAP_PRIVATE, 3, 0x19b) = 0xb7480000
  15. mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x1083) = 0xb747f000
  16.  
  17. top
  18. 2308 root      20   0 25064  19m  424 R 43.2  5.4   0:05.13 rm
  19.  
  20.  
  21. [root@vm ~]# touch /tmp/1111/{1..100000}
  22. [root@vm ~]# strace -c rm  /tmp/1111/*
  23. % time     seconds  usecs/call     calls    errors syscall
  24. ------ ----------- ----------- --------- --------- ----------------
  25.  72.06    0.382543           4    100000           unlinkat
  26.  24.16    0.128261           1    100000           fstatat64
  27.   3.78    0.020056         143       140           brk
  28.   0.00    0.000000           0         1           read
  29.   0.00    0.000000           0         3           open
  30.   0.00    0.000000           0         6           close
  31.   0.00    0.000000           0         1           execve
  32.   0.00    0.000000           0         1         1 access
  33.   0.00    0.000000           0         1           ioctl
  34.   0.00    0.000000           0         1           munmap
  35.   0.00    0.000000           0         2           mprotect
  36.   0.00    0.000000           0         9           mmap2
  37.   0.00    0.000000           0         3           fstat64
  38.   0.00    0.000000           0         1           geteuid32
  39.   0.00    0.000000           0         1           set_thread_area
  40. ------ ----------- ----------- --------- --------- ----------------
  41. 100.00    0.530860                200170         1 total




code text
  1. [root@vm ~]# touch /tmp/1111/{1..10}
  2. [root@vm ~]# strace -e trace=mmap2,munmap  rm /tmp/1111/*
  3. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77ac000
  4. mmap2(NULL, 49897, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb779f000
  5. mmap2(0x349000, 1661320, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x349000
  6. mmap2(0x4d9000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18f) = 0x4d9000
  7. mmap2(0x4dc000, 10632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4dc000
  8. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb779e000
  9. munmap(0xb779f000, 49897)               = 0
  10. mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb759e000
  11. mmap2(NULL, 1171456, PROT_READ, MAP_PRIVATE, 3, 0x19b) = 0xb7480000
  12. mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x1083) = 0xb747f000
 29.0.1547.7629.0.1547.76

TbMA

опытный

Floyd> Что-то я не пойму с чего он в память должен читать. Стандартно отображает библиотеки и дескрипторы:

А чего бы тебе перестать теоретизировать, и попробовать?
 

Floyd

аксакал

TbMA> А чего бы тебе перестать теоретизировать, и попробовать?

Выше же, в приделах имеющихся ресурсов ;))
 
+
+2
-
edit
 

stas27

эксперт
★☆
Balancer>> Кто видел 2.6 млн. файлов в одном каталоге? :)
TbMA> Я видел в десятки раз больше. На интервью баловался вопросом - какой по вашему мнению самый быстрый способ удалить N*10 миллионов файлов. не форматируя диск. :)

По совету Гугля?

Или по этому совету Гугля же, который наш друг?
С уважением, Стас.  29.0.1547.7629.0.1547.76
+
-
edit
 

Balancer

администратор
★★★★☆
Классно. До rsync бы я не додумался :)
 2828

TbMA

опытный

Balancer> Классно. До rsync бы я не додумался :)

С гуглем не интересно, тут до всего сам доходишь блин)) Гораздо интереснее почему))

Хотя, не важно. ;) На интервью-то гугля нет. А вопрос сразу позволяет выявить, сталкивался человек или нет.
 23.023.0
Это сообщение редактировалось 27.09.2013 в 06:25
+
+1
-
edit
 

stas27

эксперт
★☆
Balancer>> Классно. До rsync бы я не додумался :)
TbMA> С гуглем не интересно, тут до всего сам доходишь блин)) Гораздо интереснее почему))
TbMA> Хотя, не важно. ;) На интервью-то гугля нет. А вопрос сразу позволяет выявить, сталкивался человек или нет.

Это точно. Без гугля я бы не обошелся, и сразу бы спалился, что раньше с этой проблемой не сталкивался. Хотя с другой стороны, на работе-то гугль есть - но это уже философский вопрос ;).
С уважением, Стас.  

TbMA

опытный

stas27> Хотя с другой стороны, на работе-то гугль есть - но это уже философский вопрос ;).

Ситуация запоминающаяся. :D Столкнулся бы, помнил бы и без гугля. ;) Ты хотя бы эстрейсить не стал ;)

На интервью обычно я пытаюсь выяснить с чем человек работал (не наврал ли в резюме) и как он решает проблемы :)
 23.023.0
Это сообщение редактировалось 27.09.2013 в 07:19

Floyd

аксакал

TbMA> Ты хотя бы эстрейсить не стал ;)

Вы об этом говорите как о чем-то плохом :))

Хотя из общей статики видно, что rm, в отличии от unlink выполняет вызов fstatat который съедает 25 процентов времени. Нет вопросов, unlink на один файл будет работать быстрее.

Но вот ваши выводы о том что причина в:

Не в этом дело, а в том что они читают, и если памяти не тонны (а на живой машине ее обычно не тонны) то быстро вылетают в свап. И начинаются дикие тормоза.
 


Так что же они там читают ?
 23.023.0

Floyd

аксакал

Вообще конечно я немного загнался :))


[root@vm ~]# touch /tmp/1111/{1..100000}
[root@vm ~]# touch /tmp/1111/{100000..200000}
touch: cannot touch `/tmp/1111/178299': No space left on device



[root@vm ~]# time ./unlink.pl

real 2m22.287s
user 0m0.426s
sys 0m8.325s
[root@vm ~]#

ПО памяти конечно копейки
Далее утилизация по 32 мегабайта.


[root@vm ~]# time find /tmp/1111/ -type f -delete
real 2m29.130s
user 0m0.376s
sys 0m7.972s
[root@vm ~]#


[root@vm ~]# time find /tmp/1111/ -type f -exec rm -f {} +

real 2m29.762s
user 0m0.777s
sys 0m12.827s
[root@vm ~]#

что же касается скорости:

[root@vm 1111]# time rm -rf /tmp/1111/
real 0m12.539s
user 0m0.500s
sys 0m6.491s
 23.023.0

Mishka

модератор
★★☆
TbMA> А чего бы тебе перестать теоретизировать, и попробовать?
А простенькая программка на С или С++ (можно и python/perl попробовать) будет не быстрее? У нас тут наплодили как-то столько файлов, что не могли ни посмотреть, ни удалить. 30 минут и opendir/closedir/readdir/seekdir/rewinddir с рекурсией (количество открытых директорий при левостороннем обходе дерева лимитировано максимальной длиной пути, поэтому проблемы не будет, хотя можно закрыть текущую директорию и переиспользовать DIR*). Только первый проход почистить всё, что не директории (unlink на это и в конце выдать rewinddir, чтобы директории начать сначала), а потом провалиться внутрь рекурсивно. По возращению из последней, опять rewinddir и последовательно rmdir. После чего вернуться в вызывающего.
 24.024.0

Mishka

модератор
★★☆
Floyd> Так что же они там читают ?
А ты подумай, почему ты touch сделал только {1..100000}. :F Ну и директории они там читают, т.к. директорию, если не пустаю, то не удалить, а директории unlink-ом не удалить. Для того и надо или fstatat64 или readdir.
 24.024.0

Floyd

аксакал

Mishka> А ты подумай, почему ты touch сделал только {1..100000}. :F

Потому же почему и нельзя сделать rm *, argument to long ;)
 29.0.1547.7629.0.1547.76

TbMA

опытный

Mishka> А простенькая программка на С или С++ (можно и python/perl попробовать) будет не быстрее?

Про остальные не скажу, а перлом пробовали. Намного медленнее выходит.
 23.023.0

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru