sphinx не хватает памяти.

Тема в разделе "Базы данных", создана пользователем KillDead, 12 мар 2016.

Модераторы: latteo
  1. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    563
    Здравствуйте. Пытаюсь настроить сфинкс, Есть 2 базы , одна на 4 миллиона записей, вторая на 2. Выделено 8гигов памяти. Запускаю только один индекс (на 4) - работает нормально, если включаю сразу два, первый создаётся нормально второй крашится с ошибкой
    WARNING: index 'index2': preload: mmap() failed: Cannot allocate memory (length=1734936233); NOT SERVING
    Увеличение памяти до 16 гигов ничего не дало.
    Так же дела обстоят с ротацией,
    WARNING: rotating index 'index1': prealloc: mmap() failed: Cannot allocate memory (length=2186139320 is over 2GB, impossible on some 32-bit systems); using old index
    Вообще у меня да, "i686 GNU/Linux" 32 битная система. Это значит что большие индексы поднять нельзя?
     
  2. Black Hat

    Black Hat

    Регистр.:
    15 май 2015
    Сообщения:
    155
    Симпатии:
    101
    Походу только на 64 битную ось переходить. Странно что так много памяти кушает - покажи конфиг
     
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    563
    Сфинкс висит в процессах и занимает 1100МБ . Вообще конфиг очень даже простой,
    Код:
    searchd
    {
        listen            = 9312
        listen      = 3307:mysql41
        pid_file    = /etc/sphinxsearch/data/searchd.pid
        log         = /etc/sphinxsearch/data/log/log.txt
        query_log   = /etc/sphinxsearch/data/log/query_log.txt
        binlog_path = /etc/sphinxsearch/data/binlog/
    }
    common
        {
             lemmatizer_base = /local/sphinx/dicts/
        }
    
    indexer
    {
            # Максимальный лимит используемой памяти RAM
            mem_limit = 1500M
    }
    
    
    
    # Источник данных для поиска
    source shop
    {
        # Тип данных
        # Доступные типы: mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc
        type            = mysql
    
        # Необходимые параметры для подключения к базе данных
        sql_host        = localhost
        sql_user        = x
        sql_pass        = x
        sql_db        =  x
        sql_port        = 3306    # опциональный, по умолчанию 3306
    
       
        sql_query_pre        = SET NAMES utf8
    
        sql_query        = \
            SELECT id, name, search_text,  model, vendor\
            FROM table
    
            sql_field_string = name
            sql_field_string = search_text
            sql_field_string = model
            sql_field_string = vendor
      
    
    }
    index shop
    {
         # Источник данных для индексирования
        source            = shop
        mlock = 0
        # Адрес, где будут хранится данные индекса
        path            = /etc/sphinxsearch/data/shop
    
    
        # Индекс с учетом морфологии
     
        morphology = lemmatize_ru_all, stem_en
    
    
        charset_table = 0..9, A..Z->a..z, _, a..z, \
        U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+0435, U+451->U+0435
    
        # хранить и оригинальное слово в индексе.
        index_exact_words = 1
     
        #Минимальный размер слова для индексации
        min_word_len =3
     
    }
    
    Индексы в папке /etc/sphinxsearch/data/shop занимает 3 гига.
    Нашёл пару ответов http://sphinxsearch.com/forum/view.html?id=10409 у чела 64 бита и всё равно ругается.
     
  4. Black Hat

    Black Hat

    Регистр.:
    15 май 2015
    Сообщения:
    155
    Симпатии:
    101
    Вообще sphinx у меня несколько раз чудил. На последний релиз 2.2.10 не жалуюсь.
    В конфигах, ничего криминального не вижу, единственное index_exact_words хорошо кушает память.
    min_infix_len = 0 ("0" - это значение по-умолчанию если не выставлено), кучу гигабайт диска не должен забивать как при "2"
    Что будет если index_exact_words исключить и поставить mem_limit = 256M?
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    563
    Спасибо за ответ. Стоит как раз 2.2.10
    mem_limit вообще никак не повлияло. Что 256M что 2000M
    Пробовал разные настройки, ноль внимания.
    В общем вроде как решил проблему - надо было тупо поставить 64 битную систему. Видимо расширение адресного пространства глючило.
    Если и на 64х он начинает ругаться

    WARNING: index '': preload: read error in /etc/sphinxsearch/data/xxx.sps (Bad address); 276627456 of 1734936233 bytes read; NOT SERVING

    Значит памяти ему мало. Причём требует какое то большее кол-во для загрузки:
    - индексы sps весят - по 2 гиг, вообще все файлы в папке /etc/sphinxsearch/data/ - 6 гигов, 12 гигов оперативки не хватило (система чистая, там ничего нету), добавил до 16 - загрузил нормально, В процессах остался searchd - 4000M. Нахрен ему такой простор в оперативке- не пойму. + если добавляете память обязательно нужно ребутать серв)
     
  6. Black Hat

    Black Hat

    Регистр.:
    15 май 2015
    Сообщения:
    155
    Симпатии:
    101
    Попытка номер 2 - попробуй индексировать не сразу все результаты, а частями как в мане http://sphinxsearch.com/docs/current.html#ranged-queries

    Код:
    sql_query_range = SELECT MIN(id),MAX(id) FROM documents
    sql_range_step = 1000
    sql_query = (твой запрос) WHERE id>=$start AND id<=$end
    
    Сейчас по логу мускула посмотрел - если не указывать такой лимит, идет сплошняком запрос, если указать лимит - то с лимитами.
    Причем
    43 тыс docs/sec - без лимитов
    45-48 тыс docs/sec - с лимитами
    хотя не могу ручиться за статистическую достоверность
     
    Последнее редактирование: 13 мар 2016
    KillDead нравится это.
  7. Virtual

    Virtual Постоялец

    Регистр.:
    17 фев 2007
    Сообщения:
    84
    Симпатии:
    15
    Так конечно в память упрется, если запускать индексацию без ranged queries. Без них - сфинкс пытается загрузить сразу все строки из базы. А если база крупная - то логично что валится. У меня индексация идет по 10к строк, и без проблем индексируются таблицы на 18-20млн строк (общим весом 40-60гб). С достаточно большим количеством атрибутов, при этом - в памяти сфинкс жрет не более 4гб.
    Мало того, в ранних версиях сфинкса - был еще такой параметр - как id64. т.е. 64 битные айдишки у документов. Не помню, в 2.2.10 включены они по умолчанию или нет.
     
  8. Economig

    Economig Создатель

    Регистр.:
    1 апр 2016
    Сообщения:
    22
    Симпатии:
    3
    С лимитами на sql-запрос нормально индексировалась база документов с 10 млн. записей. Время индексации кажется около 30 минут.
     
  9. a1exe1

    a1exe1 Создатель

    Регистр.:
    7 июн 2011
    Сообщения:
    24
    Симпатии:
    31
    очевидно, что дело не в памяти, установи все по-новой
     
  10. Sadzi

    Sadzi Создатель

    Регистр.:
    5 окт 2012
    Сообщения:
    10
    Симпатии:
    10
    Я думаю здесь лажа (простите за выражение) в запросе, а не с памяти. Вы посылаете в базу некорректный запрос