12 Oct 02, Valentin Nechayev writes to Slawa Olhovchenkov:
>>>> Как линейный? А dirhash?
VD>>> Создай миллион файлов в одной дире, а? А потом уничтожь.
SO>> Вредно так долго спать, слезь со своего старья.
VN> У меня 4.7-release. Тоже старье? Результат меня не радовает.;((
Ты б еще sync включил. Всякие акселерации с раздачи не включаются -- в данном
случаее необходими опции в ядро добавить
... Командир сказал хорек! И никаких сусликов!
>>>>Как линейный? А dirhash?
VD>>> Создай миллион файлов в одной дире, а? А потом уничтожь.
SR>> Да я бы с удовольствием. Hо вот нет у меня достаточно современного
SR>> FreeBSD. А в чём, собственно, проблема? Миллион - это же совсем немного
SR>> :)
VN> Если рост от 10000...50000, на которых я это проверил, линейный, то эта
VN> операция - создание и удаление - займет 50 минут на моем железе (i815E,
VN> Cel800, IBM + ATA100 + tags). Скорость поиска в созданном я не проверял.
Я как-то тестировал и в ru.unix постил после чего флейм на эту тему
там кончился.
/* quote start */
Newsgroups: nkz.fido.ru.unix
From: Eugene Grosbein <eu...@grosbein.pp.ru>
Subject: Re: www.linux.ru =?koi8-r?Q?=D0=CF=C4?= FreeBSD :)
References: <9sf1d5$1sv5$4...@ddt.demos.su> <9sl84o$17jf$1...@news.pu.ru>
X-Comment-To: v...@sqdp.trc-net.co.jp
Message-Id: <slrn9usji...@D00015.dialonly.kemerovo.su>
11 ноя 2001, воскресенье, в 09:59 KRAST, v...@sqdp.trc-net.co.jp написал(а):
vstncj> Берёшь FreeBSD. Любую файлуху на выбор. Создаёшь директорию. В ней
vstncj> 1000000
Как я люблю такие задачи, с миллионом файлов одном каталоге.
Под такую задачу систему и настроить не грех.
#!/bin/sh
mkdir dir
cd dir
n=250000 # на этой fs у меня свободно только 36% инодов, около 260,000
stamp=`date +%s`
jot $n 1 | while read file
do
echo -n > $file.file
done
spent=$((`date +%s`-$stamp))
sysctl vfs.ufs
echo "$spent sec, `echo $n/$spent | bc` files/sec"
cd ..
stamp=`date +%s`
rm -rf dir
spent=$((`date +%s`-$stamp))
echo "$spent sec, `echo $n/$spent | bc` files/sec"
vstncj> (один миллион) мелких файлов. Чтобы иноды неожиданно не кончились (что
vstncj> само
vstncj> по себе суксь), можешь создать 1000 файлов по 1000 хардлинков на
vstncj> каждый.
vstncj> Потом уничтожаешь эту директорию. Постишь результаты в эху.
vfs.ufs.dirhash_minsize: 2560
vfs.ufs.dirhash_maxmem: 8388608
vfs.ufs.dirhash_mem: 2131064
vfs.ufs.dirhash_docheck: 0
47 sec, 5319 files/sec # создание четверти миллиона файлов
34 sec, 7352 files/sec # удаление этой кучи
Это noasync+softupdates+dirhash, диск дергался изредка, из этого времени
99% system time, так что измерена именно скорость fs. При async время то же.
Celeron-450/320Mb RAM/64Mb kmem/8Mb dirhash mem.
Для миллиона файлов памяти все еще хватит, так что прогнозируем
47*4=188 sec на создание и 34*4=136 sec на удаление.
vstncj> А потом узнаёшь, что под полуосью эта опреация занимет меньше
vstncj> получаса,
vstncj> включая написание скриптов - и глубоко задумываешься об авторитетах,
vstncj> ламерстве и тому подобных вещах.
Задумываешься. И в каком месте тут полчаса или даже 5 минут чистого времени?
Eugene
/* quote stop */
Eugene
--
Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения
с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что
жизнь меняется необычайно быстро.
EG> Как я люблю такие задачи, с миллионом файлов одном каталоге.
EG> Под такую задачу систему и настроить не грех.
И как?
root@iv:/usr/src/sys/i386/conf##sysctl vfs.ufs
vfs.ufs.dirhash_minsize: 2560
vfs.ufs.dirhash_maxmem: 2097152
vfs.ufs.dirhash_mem: 66615
vfs.ufs.dirhash_docheck: 0
На машине 256M оперативки. OK,
root@iv:/usr/src/sys/i386/conf##sysctl vfs.ufs.dirhash_maxmem=8388608
vfs.ufs.dirhash_maxmem: 2097152 -> 8388608
root@iv:/usr/src/sys/i386/conf##sysctl vfs.ufs.dirhash_mem=2097152
sysctl: oid 'vfs.ufs.dirhash_mem' is read only
Запустил с этими значениями. Ускорения нет.
В конфиге ядра параметров для ufs_dirhash нету.
В /boot/defaults/loader.conf тоже ничего нет.
Я должен стать кр00тым кернельным хакером, чтобы это сделать?
Ладно, я-то смогу при необходимости. Но называть это наличием возможности
настройки нельзя.
/netch
12 Oct 02, Valentin Davydov writes to Slawa Olhovchenkov:
>> >> Как линейный? А dirhash?
>>
>> VD> Создай миллион файлов в одной дире, а? А потом уничтожь.
>>
>> Вредно так долго спать, слезь со своего старья.
>>
>> ЗЫ: Результаты эксперемнта -- в гугле. Год назад.
VD> Эксперимент был. Миллиона не было.
Был. Обучение пользования гулом и читалкой ньюсов -- $50/h.
Тогда это заняло полторы минуты.
... Hе тратьте силы, возьмите молоток побольше!
12 Oct 02, Valentin Nechayev writes to Slawa Olhovchenkov:
>>>>>> Как линейный? А dirhash?
VD>>>>> Создай миллион файлов в одной дире, а? А потом уничтожь.
SO>>>> Вредно так долго спать, слезь со своего старья.
VN>>> У меня 4.7-release. Тоже старье? Результат меня не радовает.;((
SO>> Ты б еще sync включил. Всякие акселерации с раздачи не включаются -- в
SO>> данном случаее необходими опции в ядро добавить
VN> UFS_DIRHASH в ядре есть. Что еще включить и где оно описано?
VN> Я буду работать только в dumpty mode в этом вопросе ;)
очевидно, что async на этом разделе.
параметры ядра подкрутить
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.h
tml
http://www.FreeBSD.org/cgi/getmsg.cgi?fetch=685987+0+/usr/local/www/db/text/200
1/cvs-all/20010715.cvs-all
... Ангелы от дьвола недалеко падают
EG>> Как я люблю такие задачи, с миллионом файлов одном каталоге.
EG>> Под такую задачу систему и настроить не грех.
VN> И как?
VN> root@iv:/usr/src/sys/i386/conf##sysctl vfs.ufs
VN> vfs.ufs.dirhash_minsize: 2560
VN> vfs.ufs.dirhash_maxmem: 2097152
VN> vfs.ufs.dirhash_mem: 66615
VN> vfs.ufs.dirhash_docheck: 0
VN> Hа машине 256M оперативки. OK,
VN> root@iv:/usr/src/sys/i386/conf##sysctl vfs.ufs.dirhash_maxmem=8388608
VN> vfs.ufs.dirhash_maxmem: 2097152 -> 8388608
Вот этого достаточно.
Сейчас у меня достаточно железа, чтобы провести полный тест с миллионом.
Скрипт переписал для возможности следить, что происходит.
Очень занимательно :-)
#!/bin/sh
create() {
echo creating...
stamp=`date +%s`
jot $count 1 | while read j
do
jot $step 1 | while read i
do
echo -n >> $j.$i
done
n=$(($n+$step))
spent=$((`date +%s`-$stamp))
echo created $n: $spent sec, `echo $n/$spent | bc` files/sec, \
`sysctl vfs.ufs.dirhash_mem`
done
}
remove() {
echo -n removing...
cd ..
stamp=`date +%s`
rm -rf d
spent=$((`date +%s`-$stamp))
echo "removed: $spent sec, `echo "$count*$step/$spent" | bc` files/sec"
}
mkdir d
cd d
n=0
step=20000 # создаем пачками по 20000 за раз
count=50 # 50 пачек, итого миллион
sysctl vfs.ufs.dirhash_maxmem
create
remove
# EOF
Результат, скрипт пущен не от рута:
vfs.ufs.dirhash_maxmem: 8388608
creating...
created 20000: 2 sec, 10000 files/sec, vfs.ufs.dirhash_mem: 192064
created 40000: 4 sec, 10000 files/sec, vfs.ufs.dirhash_mem: 328549
created 60000: 6 sec, 10000 files/sec, vfs.ufs.dirhash_mem: 450564
created 80000: 9 sec, 8888 files/sec, vfs.ufs.dirhash_mem: 634613
created 100000: 11 sec, 9090 files/sec, vfs.ufs.dirhash_mem: 634613
created 120000: 14 sec, 8571 files/sec, vfs.ufs.dirhash_mem: 909660
created 140000: 17 sec, 8235 files/sec, vfs.ufs.dirhash_mem: 909660
created 160000: 21 sec, 7619 files/sec, vfs.ufs.dirhash_mem: 1323257
created 180000: 23 sec, 7826 files/sec, vfs.ufs.dirhash_mem: 1323257
created 200000: 25 sec, 8000 files/sec, vfs.ufs.dirhash_mem: 1323257
created 220000: 28 sec, 7857 files/sec, vfs.ufs.dirhash_mem: 1323257
created 240000: 33 sec, 7272 files/sec, vfs.ufs.dirhash_mem: 1942626
created 260000: 36 sec, 7222 files/sec, vfs.ufs.dirhash_mem: 1942626
created 280000: 38 sec, 7368 files/sec, vfs.ufs.dirhash_mem: 1942626
created 300000: 40 sec, 7500 files/sec, vfs.ufs.dirhash_mem: 1942626
created 320000: 43 sec, 7441 files/sec, vfs.ufs.dirhash_mem: 1942626
created 340000: 52 sec, 6538 files/sec, vfs.ufs.dirhash_mem: 2873222
created 360000: 54 sec, 6666 files/sec, vfs.ufs.dirhash_mem: 2873222
created 380000: 57 sec, 6666 files/sec, vfs.ufs.dirhash_mem: 2873222
created 400000: 59 sec, 6779 files/sec, vfs.ufs.dirhash_mem: 2873222
created 420000: 61 sec, 6885 files/sec, vfs.ufs.dirhash_mem: 2873222
created 440000: 63 sec, 6984 files/sec, vfs.ufs.dirhash_mem: 2873222
created 460000: 66 sec, 6969 files/sec, vfs.ufs.dirhash_mem: 2873222
created 480000: 84 sec, 5714 files/sec, vfs.ufs.dirhash_mem: 4268088
created 500000: 86 sec, 5813 files/sec, vfs.ufs.dirhash_mem: 4268088
created 520000: 88 sec, 5909 files/sec, vfs.ufs.dirhash_mem: 4268088
created 540000: 91 sec, 5934 files/sec, vfs.ufs.dirhash_mem: 4268088
created 560000: 93 sec, 6021 files/sec, vfs.ufs.dirhash_mem: 4268088
created 580000: 95 sec, 6105 files/sec, vfs.ufs.dirhash_mem: 4268088
created 600000: 97 sec, 6185 files/sec, vfs.ufs.dirhash_mem: 4268088
created 620000: 99 sec, 6262 files/sec, vfs.ufs.dirhash_mem: 4268088
created 640000: 102 sec, 6274 files/sec, vfs.ufs.dirhash_mem: 4268088
created 660000: 104 sec, 6346 files/sec, vfs.ufs.dirhash_mem: 4268088
created 680000: 107 sec, 6355 files/sec, vfs.ufs.dirhash_mem: 4268088
created 700000: 109 sec, 6422 files/sec, vfs.ufs.dirhash_mem: 4268088
created 720000: 146 sec, 4931 files/sec, vfs.ufs.dirhash_mem: 6359873
created 740000: 148 sec, 5000 files/sec, vfs.ufs.dirhash_mem: 6359873
created 760000: 150 sec, 5066 files/sec, vfs.ufs.dirhash_mem: 6359873
created 780000: 153 sec, 5098 files/sec, vfs.ufs.dirhash_mem: 6359873
created 800000: 155 sec, 5161 files/sec, vfs.ufs.dirhash_mem: 6359873
created 820000: 157 sec, 5222 files/sec, vfs.ufs.dirhash_mem: 6359873
created 840000: 159 sec, 5283 files/sec, vfs.ufs.dirhash_mem: 6359873
created 860000: 162 sec, 5308 files/sec, vfs.ufs.dirhash_mem: 6359873
created 880000: 164 sec, 5365 files/sec, vfs.ufs.dirhash_mem: 6359873
created 900000: 167 sec, 5389 files/sec, vfs.ufs.dirhash_mem: 6359873
created 920000: 169 sec, 5443 files/sec, vfs.ufs.dirhash_mem: 6359873
created 940000: 171 sec, 5497 files/sec, vfs.ufs.dirhash_mem: 6359873
created 960000: 174 sec, 5517 files/sec, vfs.ufs.dirhash_mem: 6359873
created 980000: 176 sec, 5568 files/sec, vfs.ufs.dirhash_mem: 6359873
created 1000000: 179 sec, 5586 files/sec, vfs.ufs.dirhash_mem: 6359873
removing...removed: 134 sec, 7462 files/sec
Тут на хорошо видно, как dirhash скачкообразно забирает по 50%
дополнительной памяти, когда хеши переполняются. В этом месте
наблюдается очень нехороший эффект: в это время, пока dirhash
инициализирует новую память структурами, все процессы встают.
Даже top, запущенный через rtprio, замирает. Последний такой скачек
после 700 тысяч файлов длился аж 40 секунд и именно из-за этих
скачков падала средняя скорость создания файлов, а пока
память есть, она заполняется с константной скоростью, последние
20000 созданы за 3 секунды, как и третья порция. Это хороший плюс.
Стоит отметить, что rm -rf существенно по разному ведет
себя для рута (euid) и для обычного юзера. От рута он работает вдвое
дольше у меня и ест вдвое больше памяти. Это связано с какими-то
тонкостями работы с fts, а точнее сказать с "толстостями" :-)
Hо и от обычного юзера для миллиона он скушал 123M памяти.
Похоже, память ест не он сам, а fts. find -delete ведет себя не лучше.
Железо: Celeron 900E, 320M, диск IBM 40G ATA100 в режиме ATA33+tags,
noasync+softupdates, раздел 15G с 1.5Gb и 3.5 миллионов inode свободных.
Hа async не тестировал.
Итого: три минуты на создание и чуть больше двух на удаление миллиона
файлов в одном каталоге. Практически все время system time, диск,
как и прежде, при создании почти не дергался, при удалении softupdates
сбрасывали изменения пачками, тут скорость диска тоже имела некоторое
значение.
Hеобязательно ядро хачить. Хотя с затыками надо что-то делать,
после четверти миллиона (на чем год назад я остановился :) затыки
уже существенные в момент скачка.
Eugene
VD> А ты попробуй. Я поднимал этот вопрос вскоре после появления dirhashа -
VD> так и то даже на специально заточенной машинке больше 600000 не смогли.
Плохо пробовали.
Eugene
EG> Сейчас у меня достаточно железа, чтобы провести полный тест с миллионом.
Повторил.
Нашел, где я тормоз - я вызывал touch на каждый файл, а это внешняя программа.
В итоге получилось в два раза медленнее, чем у тебя. Но основные характеристики
те же.
EG> Тут на хорошо видно, как dirhash скачкообразно забирает по 50%
EG> дополнительной памяти, когда хеши переполняются. В этом месте
EG> наблюдается очень нехороший эффект: в это время, пока dirhash
EG> инициализирует новую память структурами, все процессы встают.
Угу. Причем на клавиатуру он тоже отзывается странно - консоли еще
переключаются, а вот чтобы bash отрисовал команду - такого нет.
То есть прерывания не закрыты, но свитчинга нет - сидим в top half и крутим
какую-то хрень.
EG> Hеобязательно ядро хачить. Хотя с затыками надо что-то делать,
EG> после четверти миллиона (на чем год назад я остановился :) затыки
EG> уже существенные в момент скачка.
Это должна быть алгоритмическая оптимизация. Потому что в 4.* нельзя
аккуратно держать лок на базовую подсистему, переключаясь при этом на другие
процессы.
/netch
13 Oct 02, Valentin Nechayev writes to Slawa Olhovchenkov:
VN>>> UFS_DIRHASH в ядре есть. Что еще включить и где оно описано?
VN>>> Я буду работать только в dumpty mode в этом вопросе ;)
SO>> очевидно, что async на этом разделе.
VN> Hе-а.
Телепаты все еще в отпуске
... Если глюк оказался вдpуг, и не дpуг и не вpаг, а баг...
EG>> Тут на хорошо видно, как dirhash скачкообразно забирает по 50%
EG>> дополнительной памяти, когда хеши переполняются. В этом месте
EG>> наблюдается очень нехороший эффект: в это время, пока dirhash
EG>> инициализирует новую память структурами, все процессы встают.
VN> Угу. Причем на клавиатуру он тоже отзывается странно - консоли еще
VN> переключаются, а вот чтобы bash отрисовал команду - такого нет.
VN> То есть прерывания не закрыты, но свитчинга нет - сидим в top half и
VN> крутим
VN> какую-то хрень.
Аналогично. И еще в DDB можно вывалиться.
Eugene
13 Oct 02, Valentin Nechayev writes to Slawa Olhovchenkov:
VN>>>>> UFS_DIRHASH в ядре есть. Что еще включить и где оно описано?
VN>>>>> Я буду работать только в dumpty mode в этом вопросе ;)
SO>>>> очевидно, что async на этом разделе.
VN>>> Hе-а.
SO>> Телепаты все еще в отпуске
VN> При чем тут телепатия?
Ты так понятно изъясняешься, что без них не разобраться.
... Пpи использовании тpекбола надевайте ковpик на палец