PostSearchIndexRebuildDataWorker mit ElasticSearch wird immer langsamer und stürzt irgendwann ab.

  • Affected App
    WoltLab Suite Forum

    Wenn man in einem großen Forum mit Elasticsearch-Plugin über das CLI den Post-Index neu erstellen lässt, wird das Füllen des Index mit steigender Prozentzahl immer langsamer und langsamer, und der Task verbraucht mehr und mehr Ressourcen. Bei uns (knapp 1,7 Mio postings) war es bei laufendem Forum nicht möglich, den Index neu erzeugen zu lassen.

    Grund dafür ist ein Bug in der Klasse ElasticsearchSearchIndexManager. Der Worker füllt den Index in Tausenderschritten, dabei werden immer 1000 Posts in ein Array "stack" gefüllt, und dieses ganze Array von 1000 Posts wird dann in der Methode commitBulkOperation() mit einem bulkAdd() als großer JSON-String an Elasticsearch übergeben.

    Der Bug besteht darin, dass der "stack" danach vor der nächsten Runde und den nächsten 1000 Posts nicht geleert wird. Es werden also in jeder Iteration alle Posts erneut an ES übergeben. Beim ersten Mal 1000, beim zweiten Mal 2000, beim dritten Mal 3000, beim 1000sten Mal 1000 000 Postings etc., Dass die Operation dabei immer langsamer wird ist klar. In einem kleinen Forum geht das vielleicht noch, aber in einem größeren Forum stürzt PHP irgendwann ab.

    Lösung: In der Methode ElasticsearchSearchIndexManager->commitBulkOperation() am Ende folgendes einfügen:

    Code
    $this->stack = array(); // empty the stack

    Danach waren die 1,7 Mio Posts dann in 5 Minuten erledigt, während der Server vorher immer eine Nacht gebraucht hat, um sich dann irgendwann doch totzulaufen. :)

    Und der Herr Ebert schuldet mir was - das hat echt viel Zeit gekostet, dahinter zu kommen... ;)

    VG Marcus

  • wird das Füllen des Index mit steigender Prozentzahl immer langsamer und langsamer

    Das Problem habe ich auch, allerdings beim WBB 4.0 (schon seit Beginn an) und ohne ElasticSearch. Ich muss daher den Index immer in einer lokalen VM in einer RAM-Disk erzeugen, alles andere geht schlicht nicht (habe es mal 48 Stunden auf meinem Server laufen lassen, da war er bei 5% oder so),

  • D. h. wenn ich auf 4.1 aktualisiere lohnt sich ein Austesten der Postindex-Aktualisierung?

    Sie funktioniert grundsätzlich anders, aber pauschal lässt sich deine Frage nur bedingt beantworten. Letztlich bleibt die Frage ungeklärt, welcher Teil für die hohe Laufzeit tatsächlich verantwortlich ist, respektive an welcher Stelle sich der Flaschenhals befindet.

    Oder redest du von ElasticSearch?

    Elasticsearch dient vor allem der Lösung eines zentralen Problems: MySQLs FULLTEXT skaliert nicht, d.h. ab einer gewissen Datenmenge wisst du immer in die Röhre schauen, unabhängig von der zu Grunde liegenden Hardware. Einen messbaren Vorteil kann man ab ca. 500k Beiträgen feststellen, spätestens ab 2 Mio Beiträgen tritt bei MySQL eine rapider Leistungsabfall an, Dinge hinzuzufügen wird sehr langsam und auch die Suchgeschwindigkeit nimmt drastisch ab.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!