IO проблемы когда кол-во подкаталогов дошло порядка 60 000

mstdmstd

Новичок
Всем привет,
Есть PHP/Codeigniter проект с подкаталогами с картинками и когда кол-во подкаталогов дошло порядка 60 000 то начались IO проблемы
при работы с картинками в этих каталогах. Там Linux, я сейчас пытаюсь выяснить. какой именно там linux и какая именно там FS.
А так как проблемы с кол-вом каталогов порядка 60 000(2 байта), то наводит на мысль что там системные ограничения на кол-во подкаталогов.
Есть ли такие ограничения для linux-а и его файловых систем?
И как с помошью php определить тип файловой системы и параметры системы ? Возможно в моем случае это будет быстрее всего.
Могут ли быть проблемы непосредственно в настройках этого хостинга? Скажем ограничения на максимальное кол-во подкаталогов прописаны админами этого хостинга ?

И какие могут быть решения проблемы ? Сразу в голову приходит мысль разбить подкаталоги на группы по ID(он не изменяем) скажем :
productsGroup1-1000 - продукты с ID 1-1000,
productsGroup1001-2000 - продукты с ID 1001-2000,
и т. д...
В функции просмотра продукта сделать проверку если данный продукт свои картинки содержит в одном из productsGroup1-1000 подкаталогов - то считывает картинки с него
Если картинки в старом подкаталоге - то переносим его в один из productsGroup1-1000 подкаталогов а потом считываем уже с него
Кто сталкивался с подобными проблемами и как их решали ?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
семейство фс ext2-ext4 обычно начинает скрипеть при 10к-30к элеметов на одном уровне уже. Есть фс, менее страдающие от этого, типа всяких рейзерфс, бтрфс, но на серверах они встречаются чуть чаще, чем никогда.
Для равномерного распределения можно использовать как ид, так и партиционирование по хешу, например. Большинство предпочитает делать двойную вложенность по %256
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
флоппик, есть еще вариант класть все в специализированное место, типа S3
 

mstdmstd

Новичок
Можно чуть подробнее что такое "двойная вложенность по %256" ?
То же что писал я выше, но не с делением на 1000 а на 256 ?

А если переделать как я писал
productsGroup1-1000 - продукты с ID 1-1000,
productsGroup1001-2000 - продукты с ID 1001-2000,
То есть при 60 000 подкаталогах получим 60 каталогов в каждом из которых будет до 1000 подкаталогов ? Так будет лучше?
Это не будет вызывать проблемы ?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба

флоппик

promotor fidei
Команда форума
Партнер клуба
c0dex, unlimited != fast
Подкаталоги, или файлы - какая разница? Список приходится траверсить для поиска при обращении. Есть файловые системы с индексами в виде бинарных деревьев, и т.п. те ищут быстро, но у них другие проблемы.

Ну и число инод все равно конечно, что бы они там не писали.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
флоппик, это понятно, что может быть, не fast. 60к сабфолдеров у меня создались, как протестировать с ними IO не имея массового контента - думаю.
 

Активист

Активист
Команда форума
c0dex, unlimited != fast
Подкаталоги, или файлы - какая разница? Список приходится траверсить для поиска при обращении. Есть файловые системы с индексами в виде бинарных деревьев, и т.п. те ищут быстро, но у них другие проблемы.

Ну и число инод все равно конечно, что бы они там не писали.
В ext4 в этом плане улушилось)) Это основной плюс.

Код:
keeper@home:~$ mkdir test
keeper@home:~$ time ./t.sh

real    2m44.215s
user    0m12.604s
sys    0m18.104s
keeper@home:~$
keeper@home:~$ cat t.sh
#!/bin/bash

cd "test"
COUNTER=0
while [  $COUNTER -lt 100000 ]; do
    mkdir $COUNTER
    COUNTER=$[$COUNTER+1]
done

keeper@home:~$ time cd test
real    0m0.000s
user    0m0.000s
sys    0m0.000s
keeper@home:~/test$ time ls -lash > /dev/null
real    0m0.733s
user    0m0.500s
sys    0m0.228s
keeper@home:~/test$
keeper@home:~/test$ ls -lash | wc -l
100003
keeper@home:~/test$
keeper@home:~/test$ time touch 43563/test

real    0m0.002s
user    0m0.000s
sys    0m0.000s
keeper@home:~/test$

keeper@home:~/test$ time du -sh
393M    .

real    0m0.609s
user    0m0.148s
sys    0m0.448s
keeper@home:~/test$
А вот что касается inode на разделе (раздел заполнен на 90%, 900 ГБ)
Код:
oot@home:/home/keeper/test# tune2fs -l /dev/md0
tune2fs 1.42.11 (09-Jul-2014)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          7332f0e4-b38d-464e-818d-d98368ebd7fb
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              59998208
Block count:              239968000
Reserved block count:     11998400
Free blocks:              35886154
Free inodes:              59317614
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      966
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sun Feb 23 11:14:22 2014
Last mount time:          Tue Aug 19 19:31:19 2014
Last write time:          Tue Aug 19 19:31:17 2014
Mount count:              362
Maximum mount count:      -1
Last checked:             Sun Feb 23 11:14:22 2014
Check interval:           0 (<none>)
Lifetime writes:          1213 GB
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:       52297798
Default directory hash:   half_md4
Directory Hash Seed:      5a5df262-13b6-4963-b539-823f8ceb5f9a
Journal backup:           inode blocks
root@home:/home/keeper/test#
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
А зачем это все бенчить? =) Классическое решение с md5(value) и построением поддиректорий вида ab/cd/ прекрасно работает на любой ФС, делается в две лишние строки кода, и уж точно не навредит.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
fixxxer, а там ли узкое место, намек был на это =) Вопрос я автору задал, ответа мы не получили.
 

Вурдалак

Продвинутый новичок
А зачем это все бенчить? =) Классическое решение с md5(value) и построением поддиректорий вида ab/cd/ прекрасно работает на любой ФС, делается в две лишние строки кода, и уж точно не навредит.
ЗАЧЕМ МД5, ПОЩАДИ СЕРВЕР, ОКАЯННЫЙ
 
Сверху