LINUX.ORG.RU
ФорумAdmin

Проблема с диском после 20миллионов файлов.

 , ,


1

5

Hi all.

Может кто поможет с такой проблемой? интересно все таки её разобрать, сталкиваюсь в этой штукой уже 5 раз, симптомы и проблемы одни и теже.

Дано: ОС Ubuntu в основном, 12.4 LTS ISP панель, которая создает профиль пользователя а в нем директории tmp которая является симлинком для mod-tmp

/mnt/root/var/www/realoki/data % ls -lah
total 420M
drwxr-x--x 7 500 502 4.0K Feb 18  2015 .
dr-x-----x 3 500 501 4.0K Feb 18  2015 ..
drwxr-x--x 4 500 502 4.0K May  8  2015 email
drwxr-xr-x 2 500 502 4.0K May  8  2015 etc
drwxr-x--x 2 500 502 4.0K Apr 14 21:01 logs
drwxrws--- 2  33 502 420M Apr 16 06:52 mod-tmp
lrwxrwxrwx 1  33 502    7 Feb 18  2015 tmp -> mod-tmp
drwxr-x--x 8 500 502 4.0K May 13  2015 www

К стати, тут меня смущает размер который показывает для директорий.

За время работы сервера в директории mod-tmp накопилось около 50 миллионов файлов, при попытке сложных дисковых операций типо du -h -d 1 / или ncdu / вся дисковая ставится колом.

Ок, сели и терпеливо удалили почти все файлы, оставили 50тыс файлов, но дисковые операции снова зависают, думали диск, поменяли уже 4ре диска, все смены методом dd клонирование 1 к 1, но проблема таже, дисковые операции тупо зависают. У меня складывается подозрение что даже удаленные файлы как-то влияют на внутрение журналы файловой системы или еще куда-то что файловая система ведет себя не адекватно.

Сразу оговорюсь, мы воспроизводили ситуацию уже пару раз на тестовом сервере, сосздавали 10 миллионов файлов и спокойно их удаляли проблем не было, но возможно потому что не было сильной фрагментации файлов. Может у кого будут идеи почему может падать производительность файловой системы после удаления файлов?



Последнее исправление: InventoR (всего исправлений: 2)

У меня складывается подозрение что даже удаленные файлы как-то влияют на внутрение журналы файловой системы или еще куда-то что файловая система ведет себя не адекватно.

Да. Это такая особенность ext* Всё-таки в RHEL недаром дефолтной ФС сделали XFS.

Deleted
()

Писать дохулиард файлов в одну директорию ровным слоем - самый адовый ад который можно придумать. Используй иерархию с хорошей вложенностью и всё залетает.

blind_oracle ★★★★★
()
Ответ на: комментарий от system-root

но на самом деле нет, во всём виноваты ваши php-макаки

Лучший ответ! И ведь верно.

anc ★★★★★
()

50 миллионов - это многовато всё-таки. И да, директория - это тоже файл, он занимает место на диске, может фрагментироваться (если файлы создавались по одному долгое время вперемежку с остальной активностью, то фрагментация там огого).

Утилита filefrag из e2fsprogs покажет число фрагментов. Для пустого файла покажет 0, для небольшого файла и большинства директорий 1, для /usr/include 3, для скачанного с торрентов кинца может и 3000.

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

Писать дохулиард файлов в одну директорию ровным слоем - самый адовый ад который можно придумать.

Ханс Райзер в своё время пытался этот вопрос обойти. Для БД 50 миллионов записей — копейки. Что мешает в ФС нормальное индексирование сделать?

Используй иерархию с хорошей вложенностью и всё залетает.

Только не в ext4 в случае find/rsync. Обход больших вложенных каталогов в ext4 — это ад.

KRoN73 ★★★★★
()

Сделал проверку диска, получил:

fsck.ext4 -nvf /dev/sda5
e2fsck 1.42.12 (29-Aug-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

      291074 inodes used (0.99%, out of 29491200)
         707 non-contiguous files (0.2%)
         105 non-contiguous directories (0.0%)
             # of inodes with ind/dind/tind blocks: 0/0/0
             Extent depth histogram: 284439/145/3
    31170967 blocks used (26.43%, out of 117939968)
           0 bad blocks
           2 large files

      273802 regular files
       10313 directories
          55 character device files
          25 block device files
           0 fifos
          27 links
        6867 symbolic links (6396 fast symbolic links)
           3 sockets
------------
      291092 files
но при этом du -h -d 1 / приводит к хорошему зависанию процесса

InventoR
() автор топика
Ответ на: комментарий от system-root

на вопрос кто виноват, ехт4 или макаки, предлагаю ТС проверить другую ФС. А вообще да, для специфичных задач надо было нормально планировать параметры создания/форматирования ФС.

darkenshvein ★★★★★
()

За время работы сервера в директории mod-tmp накопилось около 50 миллионов файлов,

И с какими параметрами вы выполняли mkfs.ext4, милейший?

darkenshvein ★★★★★
()
Ответ на: комментарий от system-root

Справедливости ради, это не они виноваты, а разработчики исп и мейнтейнеры пыха в дебиане.

Но это не отвечает на вопрос, что происходит у ТС на сервере.

leave ★★★★★
()

У тебя опухоль иноды mod-tmp. Просто удали этот каталог и создай заново.

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

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

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

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

Почему так происходит? элементарно. В freebsd, debian, ubuntu по умолчанию для пыха отключена очистка файлов ссесий, так как данная процедура мягко говоря средствами пыха не сильно производительная, по этому применяются костыли виду ручной очистки по крону. Но фишка в том что никто из ISPSystem не додумался когда пользователю создается профиль, добавить таск на очистку данных файлов, в итоге тысячи серверов имеют такие проблемы со временем. А тут еще и разработчики которые не особо задумываются как там на сервере хранятся файлы, в итоге рано или поздно сервер ставится в позу вместе с диском. Нам же остается только выгребать этого состояние и пытатся подсунуть очередной костыль.

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

Думает потому что каталог большой и фрагментированный, говорю же посмотри filefrag mod-tmp и ужаснись. А большой потому что записи не удаляются, а помечаются как удалённые. fsck.ext4 -D сжимает/переиндексирует такие раздувшиеся директории.

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

Это всего лишь показатель неэффективности конкретной ФС.

на вопрос кто виноват, ехт4 или макаки, предлагаю ТС проверить другую ФС. А вообще да, для специфичных задач надо было нормально планировать параметры создания/форматирования ФС.

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

при удалении файлов из каталога размер inode самого каталога не меняется. Это как в базе данных - просто отметили запись как удаленную и все. Для удаления таких записей делают vacuum, но для ext4 такого механизма нет (кроме полного сжатия до 0 т.е. удаления).

Нужно создать временный каталог, если в старом есть нужные данные, то перенести их в временный каталог, далее старый каталог удалить, а временный каталог переименовать старый

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

а лимит ли это фс? может там винты виноваты? Дуреют от такого количества файлов. головки то чай не резиновые!

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

Винтам какая разница? Винт - это блочное устройство. Ведь в БД хранят же миллионы и миллиарды записей, а файлы БД хранятся на тех же винтах.

Chaser_Andrey ★★★★★
()

Сделал себе 50 миллионов файлов через seq 1 50000000 | ionice xargs touch. Два раза папка корраптилась, и приходилось делать fsck -fD, наверно шлейф херовый, а может баг в ядре. Считывается папка нормально:

[root@battlehummer 50m]# time \ls -f | wc
50000002 50000002 438888902                                                                                                                                             
real    0m59.677s
user    0m30.330s
sys     0m19.996s

Все файлы пустые и фс пустая, так что фрагментации нет:

[root@battlehummer test]# filefrag 50m
50m: 3 extents found

Это был контрольный опыт, дальше попробую воспроизвести ситуацию ПОа, но это наверно неделю займёт.

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

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

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

12 лямов 32-х символьных случайных имен в одном каталоге, дальше «Directory index full!»

# ls -l /tmp/50M/
total 719360
drwxr-xr-x 2 root root 736595968 Apr 20 22:37 A/
drwx------ 2 root root     16384 Apr 20 22:20 lost+found/

ext4/lvm/ssd

создалось за 10 минут

удалялось 12 минут по «rm -r A»

700Мб каталог - это жесть!

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

Права. Не забыть про (если есть) всякие selinux, acl и т.п.

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

Записей - да. Но не запросов. «du» это не «сложная дисковая операция», это 2N отдельных простых, выполняющихся последовательно. «Нормальный» диск отработает 50к файлов в лучшем случае минут за 5 - и будет всю дорогу занят по уши самой верхней головки.

Лучшее, что могли сделать авторы ФС - убрать влияние удалённых 50М. Но, для сравнения, некоторые ДБА вынуждены регулярно перестраивать индексы таблиц с большими удалениями, абы не тормозило, т.ч. далеко не все БД переживают такие случаи без вмешательства извне. Каталог от индекса отличается почти ничем, и его не перестраивали - это может ещё добавить времени к тем 5мин.

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

Я тут кстати продолжаю эксперименты. Теперь я удалил свои 50м пустых файлов:

[root@battlehummer 50m]# time ionice -c 3 find -delete
real    2085m21.623s
user    0m0.001s
sys     0m0.004s
[root@battlehummer 50m]# time \ls -f | wc
      2       2       5

real    0m31.428s
user    0m0.000s
sys     0m4.640s
[root@battlehummer 50m]# ll -h ..
итого 871M
drwxr-x--- 2 legolegs legolegs 871M апр 24 01:57 50m
drwx------ 2 root     root      16K апр 16 13:58 lost+found
Как видно, на xt4 иногда нужно делать vacuum, сиречь fsck -D.

Даже немного неохота повторять опыт с непустыми файлами - этож на неделю диском трещать.

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

продолжаю эксперименты

find -delete

Любой программист, написавший что-то типа

for i in $(select key from 50m-record-table)
do something with 50m-record-table where key=$i
знает, как болят пальцы, когда их ломают во избежание рецидива.

Увы, API файловой системы практически не умеет массовых операций с файлами, обеспечивая именно такой режим работы. Т.ч. любая попытка создавать миллион временных файлов должна быть наказуема примерно так же.

Попробуй, лучше, положить это в tmpfs или ramfs

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

Почему? У топикстартера 50 миллионов файлов копились долгие годы и он и не знал о них, пока не сделал du.

legolegs ★★★★★
()
Ответ на: продолжаю эксперименты от DonkeyHot

Тут не только в API дело, а ещё в утилите find. Она сначала читает всё и создаёт список подходящих файлов, а уже потом для каждого файла из списка делает unlink(). И при таком количестве файлов велика вероятность, что к моменту, когда find начёт удалять файлы, из дискового кеша уже «уйдут» блоки с содержимым каталога.

2 legolegs Если интерестно, попробуйте сразу читать имя файла и удалять его, кодом на Си, примерно таким. Проблема с хардом. Не могу прочитать каталог. (комментарий) ИМХО, должно быть быстрее, чем ″find -delete″.

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

find. Она сначала читает всё и создаёт список подходящих файлов, а уже потом для каждого файла из списка делает

Честно говоря, сомнительно. find создана, чтобы обходить огромные деревья, хоть всю фс, список файлов вовсе не обязан помещаться в память. Надо, конечно, смотреть исходники, но я почти уверен, что find работает аналогично вашему коду. Попробую, когда время будет.

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

Надо, конечно, смотреть исходники,

Проще посмотреть вывод strace(). У меня сначала идёт куча getdents64(), потом куча unlinkat(). Правда, я делал это на 100000 файлах, на 50 млн. мне времени жалко, сомневаюсь, что find меняет алгоритм при больших объёмах.

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

Там ещё ″fputs(..., stdout)″, а не истинный хардкорный ″write(1, ...)″.

mky ★★★★★
()

можно узнать, пожалуйста, что вы храните в таком кол-ве файлов?

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

не только в API дело

Не соглашусь. Посчитаем: пусть наш диск обслуживает 200 операций в секунду (оценка из расчётов дисковых массивов, оптимистичная, но умножать проще) = (1/5)к/c. Удаление 50м файлов - 50м отдельных записей в журнал. Умножив на скорость получим 10000секунд, или 4166 минут - у ТС получилось почти в 2 раза быстрее, т.е. жаловаться не на что.

Просто файлуха затачивалась на поиск одиночный поиск файла, и именно это делает хорошо.

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

Грош цена той файловой системе, которая колом встает

Могу спорить, что открытие одного файла в таком каталоге работает всего раз в 30 медленнее, чем в почти пустом, как и должно быть при оптимальном поиске в такой куче. Т.ч. она не «колом встаёт», а «слишком много работает».

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.