LINUX.ORG.RU
ФорумTalks

Приключения с полнотекстовым поиском recoll. Или SSD и всё, всё, всё

 , ,


0

2

Я уже пару раз создавал темы на LOR:

(ещё в 2015) Фризы системы, iotop 99.99% но W/R = 0

(и 5 дней назад) Во что упирается индексатор recall/xapian

В 2015-м году я так и не разобрался, забросил. Сейчас кажется до истины дошёл. Просто история успеха или неуспеха, как считать.

Индексируется для локального поиска порядка 500 тысяч разных документов, общим объёмом где-то более 600Гб в пожатом виде. Хранятся внутри .zip, zip в свою очередь в более крупных.

Ещё в 2015 году столкнулся с большими и нарастающими тормозами из-за чего процесс стал занимать недели и я даже не дождался после примерно как раз недели общего времени. За которое было проиндексировано менее половины.

Сейчас с новыми версиями на новых дисках примерно тоже самое. Какие были советы можно почитать в вышеприведенных темах.

В общем, я наконец-то прикупил SSD - Samsung EVO 860 на 500 Гб., отформатировал в XFS и поместил туда индексы. «Процесс пошёл» куда резвее и уже за 15 минут было проиндексировано 14 тысяч документов.

Однако, замедление стало и тут заметно! Не так явно как на HDD, но тоже. Даже составил таблицу:

Обработано док-вВремя, мин.Файлов/сек
140001515.5
200003011.1
30000575.8
34000678.4
40000887.5
500001216.9
550001396.6
565511456.5

Как можно видеть скорость падает, не считая не совсем понятной аномалии в районе 30 тысяч.

Что интереснее, по мере падения скорости, растёт объем записываемых данных на SSD. При примерно равном общем занятом объёме. Общее количество записанных гигабайт берётся из SMART для SSD (поле 241 Total_LBAs_Written) затем * 512/1024/1024/1024) = Gb

Обработано док-вЗаписано на SSD, Гбdu -sh в Гб
2650022423
2806024823
3000027923
3200030924
3400033923
3800041224
4000044524
5000062328
5500071833
5655175130

Итак за 2 часа 25 минут на SSD было записано уже 751 Гб.
Что это не случайно показывает команда iotop -obPat в которой можно посмотреть, что процесс recollindex записал уже 261 Гб за 39 минут после возобновления индексации. (прочитал 25 Гб за это же время)

Причём из таблицы следует, что объём перезаписываемых данных всё время растёт. В районе 14 тысяч файлов 1Гб набирался на 118 обработанных файлов. К 56 тысячам уже 1 Гб перезаписи генерируют 75 файлов.

Оставлю-ка я до утра.

Мораль сей басни или какие предсказания:

  1. Справится ли SSD или тоже упрётся в потолок производительности, как и HDD?

  2. Насколько мне хватит SSD? вот так вот одна единственная программка и хренак ресурса нет ;-)) Чую полная обработка будет стоить как бы не менее 10% от гарантийных 300 TBW

  3. Как-то я недооценивал важность SSD

  4. Можно ли сказать, что архитектура recoll/xapian кривая, косая?

  5. Смех, смехом, но как бы не тот случай, когда Optane 900p имеет преимущество. Или во всяком случае что-то серверное с большим количеством циклов перезаписи. Обычных SSD с их ресурсом мало для разных там recoll’ов.

★★★★★

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

Хм, тут есть несколько моментов:

1. У 860 EVO на 500ГБ, на полной скорости, можно записать около 25ГБ, потом следет просадка до ~300МБ/с. Пруфы, картинка взята отсюда

2. Если я правильно понял, данные для индексации хранятся в zip архивах. Я не знаю как xapian индексирует zip файлы. Но если он их распаковывает, то хорошо бы понять куда именно. И по возможности перенести это место в оперативку — tmpfs или zram (на всякий случай уточню, что zram это прежде всего сжатое блочное устройство в оперативке и совсем не обязательно swap). Собственно, если tmpfs есть, то можно дать ему больше оперативки

3. Если верить документации, то Xapian пишет изменения на диск атамарно и гарантирует целостность данных при условии, что диски/RAID гарантируют, что данные отданые им в direct режиме будут записаны. Такое поведение, конечно же сильно уменьшает скорость записи на диск. И его можно отключить. Из документации:

Finally, note that it is possible to compile Xapian such that it doesn’t make modifications in an atomic manner, in order to build very large databases more quickly (search the Xapian mailing list archives for “DANGEROUS” mode for more details). This isn’t yet integrated into standard builds of Xapian, but may be in future, if appropriate protections can be incorporated.

4. Если пункт 3 будет выполнен, то можно попытаться оптимизировать запись на диск — увеличить dirty_ratio с дефолтных 20% до 70-80%, что позволит держать в оперативной памяти больше данных.

5. Дополнительно, можно попробовать увеличить очередь чтения/ записи на диск (сработает, вероятно, и без пункта 3). Не факт, что станет лучше, но можно проверить
Сначала отключаем mq-blk — ставим параметр загрузки
scsi_mod.use_blk_mq=0
Затем в уже перезагруженой системе выставляем очередь и шедулер
echo 10000 > /sys/block/sda/queue/nr_requests
echo deadline > /sys/block/sda/queue/scheduler
где sda — SSD. Значение в 10000, обычно, более чем достаточно.

chaos_dremel ★★
()
Последнее исправление: chaos_dremel (всего исправлений: 1)

Итак за 2 часа 25 минут на SSD было записано уже 751 Гб.

В таких условиях write amplification сильно больше. Для ssd серии EVO серьёзная нагрузка.

greenman ★★★★★
()

Кто бы мог подумать. Прогресс железа глобально не решает проблему алгоритмов с экспоненциальной сложностью.

r_asian ★☆☆
()

Вам подобные тесты и вопросы лучше всего показывать и задавать разработчикам ПО непосредственно, а не на ЛОРе.

ValdikSS ★★★★★
()
Ответ на: комментарий от chaos_dremel
  1. У 860 EVO на 500ГБ, на полной скорости, можно записать около 25ГБ, потом следет просадка до ~300МБ/с. Пруфы, картинка взята отсюда

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

Сейчас уже 1 Гб набегает на 46 проиндексированных файлов, в отличие от 118 в начале.

Попробую кое-что сделать из предложенного. Но в общем, убедился, что дело скорее вообще в алгоритме, хотя конечно SSD радикально ускорил.

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

Интересно, задача индексации для полнотекстового поиска обязательно экспоненциально сложная?

Что-то мне подсказывает, что на практике вовсе не обязательно.

Например, можно с самого начала предусмотреть словарь слов/словоформ какого-то языка и не заниматься всё время его обновлением. Отдельные, не входящие в него слова, записывать в отдельный файл, даже не обязательно с сортировкой. Или с сортировкой по завершении.

Да даже с непрерывным составлением на лету можно что-то придумать с Radix сортировкой.

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

НА ЛОРе скорее для чего-то вроде отчёта по темам, которые создал и околотехнического контента ради. Думаю кому-то интересного.

anonymous_incognito ★★★★★
() автор топика

SLC-кэш.
Вот сюда как раз будет очень хорош Optane из соседних тредов.
Вообще, самсунги - read intensive девайсы (по терминологии HP). Даже Pro'шки.
У нас ящик двухтерабайтных 850 про валяется без применения из-за того, что они не способны выдать стабильную производительность.

pekmop1024 ★★★★★
()

https://github.com/aerospike/act

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

pekmop1024 ★★★★★
()
Ответ на: https://github.com/aerospike/act от pekmop1024

если SSD не тащит однократную нагрузку, это консумерский шлак, и ни на что, кроме пускания ОС ноутбука, он не годится.

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

Но тут проблема уже очевидно, что вообще в алгоритме работы. Более производительный SSD просто отложил бы сильное падение скорости (в несколько раз) подольше, но если она падает экспоненциально из-за роста объёмов записи, то что тут делать?

Вписаться может, если только этого отодвигания хватит для конкретного случая.

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

Вот сюда как раз будет очень хорош Optane из соседних тредов.

Или другая программа индексации. Хотя жаль, recoll достаточно симпатичный и удобный.

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

Более шустрый SSD, скорее всего, перестанет быть бутылочным горлышком. Ибо сейчас он просто не успевает записывать. Даже 970 про даст тебе стабильную скорость записи в 5 раз большую, и в 10 раз больше иопсов. Про оптан промолчу. Я очень сильно не уверен, что дело в индексаторе.

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

У нас ящик двухтерабайтных 850 про валяется без применения

Вышли мне парочку, я найду им применение)

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

Я, вроде бы, как раз описал общие шаги направленные на минимизацию объёма данных пишушихся на диск, хоть, я и не обозначил этот момент сразу, каюсь. Собственно, атамарность записи данных это одна из причин таких объёмов записи.

Но, в любом случае, важно понять откуда такой объём берётся. Если на SSD идёт только запись в файлы индексов, там не создаются временные файлы, не распаковываются архивы и т.п., то такой объём записи это нихрена не нормально. Если там таки создаются временные файлы и т.п., то этот, конечно «нормально», но от этого не легче. В любом случае надо перенести записи по максимуму в оперативку

Ещё, файловая система может давать write amplification, но у XFS этим как раз, обычно, проблем нет

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

Вышли мне парочку, я найду им применение)

как гарантия выйдет - напомни) еще года три осталось

pekmop1024 ★★★★★
()

я наконец-то прикупил SSD - Samsung EVO 860 на 500 Гб

Это стратегическая ошибка, надо было Optane покупать, у него скорость постоянная вне зависимости от величины файлов, опять же EVO 860 это потребительский сектор а ты пихаешь его в энтерпрайз.

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

echo deadline

Вообще anticipatory будет побыстрее, хотя для SSD будет целесообразнее использовать простой FIFO - «noop», ибо планировщик i/o есть в самом контроллере SSD не уверен что он сильно хуже тех что есть в линуксе. Зато простой FIFO полностью отдаст управление внутреннему контроллеру SSD.

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

Или другая программа индексации. Хотя жаль, recoll достаточно симпатичный и удобный.

А какие ещё варианты есть? С юникодом и cjk на многогигабайтной коллекции.

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

anticipatory уже чёрт знает сколько времени как выпилен из ядер большинства дистров, а может даже и из ядра вообще. Например:

The Anticipatory I/O scheduler is deprecated and is not present in Red Hat Enterprise Linux 6.

Практика показывает, что deadline всё же универсальнее. Иногда очень полезным оказывается его выстроение блоков по порядку. Так рандомный ввод-вывод становиться вполне последовательным и т.п.

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

чёрт знает сколько времени как выпилен из ядер большинства дистров

ничто не мешает его установить, ну это так к слову.

что deadline всё же универсальнее.

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

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

ничто не мешает его установить, ну это так к слову. Его удалили из ядра в версии 2.6.33 https://kernelnewbies.org/Linux_2_6_33 и заменили на CFQ. Даже если взять его код оттуда, то надо будет его модифицировать под менявшийся с тех пор код блочных устройств.

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

и заменили на CFQ

тже мне истина в последней инстанции, CFQ выкинули, а anticipatory я привел в качестве примера что он быстрее cfq, и если хочется производительности то не надо использовать то что идет по дефолту, опять же из-за специфичности задачи.

It is worth noting that there is little difference in throughput between the mq-deadline/none/bfq I/O schedulers when using fast multi-queue SSD configurations or fast NVME devices. In these cases it may be preferable to use the 'none' I/O scheduler to reduce CPU overhead.

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

Индексируется для локального поиска порядка 500 тысяч разных документов, общим объёмом где-то более 600Гб в пожатом виде. Хранятся внутри .zip, zip в свою очередь в более крупных.

А что за индекс? Его никак не ускорить?

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

Более шустрый SSD, скорее всего, перестанет быть бутылочным горлышком. Ибо сейчас он просто не успевает записывать.

Но потом и более шустрого не хватит.

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

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

Попробую. Я так понял, что надо пересобрать xapian?

Но, в любом случае, важно понять откуда такой объём берётся. Если на SSD идёт только запись в файлы индексов, там не создаются временные файлы, не распаковываются архивы и т.п., то такой объём записи это нихрена не нормально.

Да, на SSD сейчас пишутся только индексы и лог, но лог небольшой (относительно).

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

Дело очень вряд ли в SSD, просто с увеличением объёма перезаписи не станет хватать и оптана.

а ты пихаешь его в энтерпрайз.

Кстати, а где тут энтерпрайз? Даже миллиона документов нет и объём меньше терабайта - это по нынешним понятиям ну ни разу не энтерпрайзистый энтерпрайз. Хотя и за пределами обычных интересов среднего в вакууме пользователя.

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

https://www.lesbonscomptes.com/recoll/perfs.html

Check that multithreading is enabled (it is, by default with recent Recoll versions).

Increase the flush threshold until the machine begins to have memory issues. Maybe add memory.

Store the index on an SSD. If possible, also store the data on an SSD. Actually, when using many threads, it is probably almost more important to have the data on an SSD.

If you have many files which will need temporary copies (email attachments, archive members, compressed files): use a memory temporary directory. Add memory.

Собственно, подтверждается теория о распаковке архивов. /tmp в оперативке положительно влияет на производительность. Ну и оказывается, что есть параметр позволяющий указать какой объем индекса держать в оперативке перед записью на диск. Тут желательно поэксперементировать, возможно очень большие значения не дадут прироста. Я бы протестировал от гига и до половины оперативки.

Количество потоков, вероятно и так уже настроено, но можно проверить.

З.Ы. Как его правильно пересобрать, я не в курсе. Ну и пересборку я бы оставил на случай, если всё остальное не поможет.

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

Собственно, подтверждается теория о распаковке архивов. /tmp в оперативке положительно влияет на производительность.

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

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

Уже стоит 250 Мб. Такое ощущение, что влияет слабо.

Вообще после нескольких экспериментов, есть чувство, что recoll заточен на примерно 30-40 тысяч документов максимум и с объёмом до 30-50 Гб. Вот в этих пределах регулировки сказываются.

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

250 мб по сравнению с десятками гигов в индексах это как-то не серъёзно. Тут же идея в том, чтобы держать в оперативке максимум данных перед записью на диск и «молиться» чтобы индексы обновлялись именно в оперативке.

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

Но потом и более шустрого не хватит.

Это если проблема в индексаторе, а не в нагрузке на него.

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

Если бы в ней, скорость сразу была бы низкой, а она уменьшается

Так это в свои права вступает SLC-кэширование на SSD, тут ничего, кроме выкидывания не предназначенного для этого драйва и установки соответствующего паттерну, не поможет.

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

Дело очень вряд ли в SSD, просто с увеличением объёма перезаписи не станет хватать и оптана.

Оптан дает стабильную скорость записи, у него нет ничего похожего на SLC-кэширование. Поэтому просадки будут из разряда «забился буфер ОС, перешли на прямую запись, вот это и есть реальная производительность».

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

ну ни разу не энтерпрайзистый энтерпрайз.

ну ты же не в кружке «Юный техник» этим занимаешься, да еще и за зарплату наверняка, а это и есть ентерпрайз.

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

Так это в свои права вступает SLC-кэширование на SSD, тут ничего, кроме выкидывания не предназначенного для этого драйва и установки соответствующего паттерну, не поможет.

Я же несколько раз сказал (и из таблиц заметно), что вырастает объём перезаписываемых данных на единицу проиндексированных файлов.

Грубо говоря, на 1 файл на SSD писалось 9 Мб вначале, и 14 мегабайт в конце таблицы. Вначале - это 139Мб/сек (учитывая скорость индексации), далее 90Мб/сек. Может, учитывая всякие умножители и действительно сказывается [b]в том числе[/b] и уменьшение скорости SSD. Но в первую очередь все же особенность алгоритма.

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

ну ты же не в кружке «Юный техник» этим занимаешься, да еще и за зарплату наверняка, а это и есть ентерпрайз.

Нет, совершенно не за зарплату, это чисто моё собственное хобби, хотя потенциально возможно, что и предложу на работе.

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

250 мб по сравнению с десятками гигов в индексах это как-то не серъёзно. Тут же идея в том, чтобы держать в оперативке максимум данных перед записью на диск и «молиться» чтобы индексы обновлялись именно в оперативке.

Ну OK, попробую 10 Гб указать, посмотрю к чему приведёт.

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

Попробовал 10 Гб указать.

Принципиально вроде ничего не изменилось в итоге. Не считая отожранной памяти. За 1 ч. 50 минут recollindex записал 521 гигабайт по данным iotop, по данным smart диска - 509 Гб, видимо небольшая разница - это на распаковках в /tmp. XFS - очень хорошо себя проявляет, ничего лишнего не пишет.

Скорость индексации ещё чуток понизилась. Кроме того, влияние исчерпания кэша SSD сказывается при непрерывной записи, при достаточном времени на Trim это не должно сказываться.

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

Индексируется для локального поиска порядка 500 тысяч разных документов, общим объёмом где-то более 600Гб в пожатом виде. Хранятся внутри .zip, zip в свою очередь в более крупных.

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

crypt ★★★★★
()

Хранятся внутри .zip, zip в свою очередь в более крупных

ну шо за песец.:( 2020 год, а он все в зипы пихает. хотя бы на ФС со сжатием есть смысл перейти.

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