Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Gesucht: xtc_db_close()!

    Taste

    • Frisch an Board
    • Beiträge: 86
    Re: Gesucht: xtc_db_close()!
    Antwort #15 am: 28. Januar 2015, 12:01:20
    Wir hatten mal ähnliche Probleme und eine Ursache waren die Session Einstellungen, liegen bei dir die Sessions in der Datenbank?
    Shop Hosting

    HHGAG

    • Frisch an Board
    • Beiträge: 61
    Re: Gesucht: xtc_db_close()!
    Antwort #16 am: 28. Januar 2015, 12:06:44
    Das Verbindungen nicht geschlossen werden ist nichts neues. Der Garbage Collector wird auf aktuellen Debian basierenden Systemen jeweils 9/39 nach ausgeführt und bis dahin verweilen alle Verbindungen als offen, es sei denn der Garbage Collector von MySQL (Default: wait_timeout = 28800) greift ein. Da das Problem seit der "1&1 Administratoren Invasion" anno 2005  im alten Projektforum bekannt ist, gibt es auf unseren Servern in der
    Zitat
    /etc/mysql/my.cnf
    die Einstellung:
    Code: SQL  [Auswählen]
    wait_timeout            = 30

    timopaul

    • modified Team
    • Beiträge: 360
    • Geschlecht:
    Re: Gesucht: xtc_db_close()!
    Antwort #17 am: 28. Januar 2015, 12:36:01
    Hallo ihr Guten,

    Mir fallen da 2 Sachen ins Auge:
    Ein weiterer Dienst füttert im Hintergrund die Datenbank regelmäßig mit neuen Daten, den haben wir auch schon optimiert.
    und
    Zu den 14 Sekunden muss ich auch sagen, dass dies nur die Startseite betraf, wo alle Neuheiten (bis zu 1.000 Artikel) angezeigt wurden. Einzelne Kategorie- und Detailseiten mit weniger Artikeln waren schneller, doch teilweise auch bis zu 4 Sekunden, was deutlich zu lange ist.

    1. Bist Du sicher, dass der Hintergrund-Dienst nicht die offenen DB-Verbindungen erzeugt? Führt der u. U. zu Datensatzsperren, welche sich natürlich auf den Shop auswirken?

    Der Hintergrund-Dienst schließt seine Verbindung(en) zur Datenbank wieder. War ein Teil der Optimierung.
    An die Sperren hab ich noch gar nicht gedacht, sehr guter Hinweis. War mir im slow_query.log bisher noch gar nicht aufgefallen ist, bei mehr als der Hälfte steht "State: Waiting for table level lock". Muss ich mich noch mal genauer mit befassen.

    2. Nur neue Artikel? Wie werden die rausgesucht? Fehlt da am Ende ein Index?

    Anhand des 'products_date_available' innerhalb der letzten 52 Tage. Indizes gibt es für 'products_id', 'products_date_added' und 'products_date_available'.

    Wir können nichts explizites als Ursache erkennen. Einziger Anhaltspunkt den wir aktuell haben, ist dass sobald von den Jungs im Rechenzentrum der MySQL-Dienst neu gestartet wurde beziehungsweise manuell die offenen Anfragen gekillt werden alles vergleichsweise flott läuft.

    Heißt das, dass alle eure Querys in unter 0.05s durchgehen?
    Alles darüber sollte die Ausnahme sein, z.B. die Suche.

    Kann ich leider keine genaue Auskunft drüber geben da mir bisher vom Rechenzentrum nur ein Log der langsamen Queries zur Verfügung gestellt wurde.

    Was auch noch eine Möglichkeit wäre, gerade wenn auf der Startseite schon 1000 Produkte angezeigt werden, das Query umzubauen. Statt über eine while-Schleife immer wieder die einzelnen products_id abzufragen, die WHERE-Klausel mit products_id IN () zu beschelunigen.

    Sollten wir keine bessere Lösung finden würden wir dies mittels AJAX lösen, da die ca. 1.000 neuen Artikel eh in Blöcken anhand des Labels/Kategorie zusammen gefasst sind. Werde diese Lösung aber mla im Hinterkopf behalten.

    Je länger ich darüber nachdenke, glaube ich dass das nicht mal unbedingt an Abfragen, Indizes oder Shop liegt, sonder eher an der Config von Apache und mysql.

    Was ist immer gleich, wenn die Zugriffe langsam werden? Es gibt offene Verbindungen. Sobald die aber gekillt werden ist es wieder flott. Was ich mir vorstellen könnte, ist das im Hintergrund die max. Anzahl an Verbindungen erreicht ist und der Server wartet bis der Garbage-Collector sich bequemt mal wieder eine Verbindung zu schließen. Manchmal hatl nicht rechtzeitig und es timeouted.

    Wenn ich das richtig im Kopf habe, dann gibt es Verbindungslimits für mysql, httpd und max open files. wenn eine davon zu niedrig ist, dann blockt das den Rest. Aber für sowas gibt es ja Profi-Apachen.

    Klingt auch alles logisch. Wie bereits gesagt handelt es sich um einen managed Cloud-Server. Ich habe dieses nicht ausgesucht und hatte auch keinen Einfluss bei der Entscheidung wo und welcher Server mit welchem Dienst verwendet wird. Aber wo kommen wir denn hin wenn man sich nicht mal auf die "Profis" im RZ verlassen kann?

    Wir hatten mal ähnliche Probleme und eine Ursache waren die Session Einstellungen, liegen bei dir die Sessions in der Datenbank?

    Ja, die Sessions liegen in der Datenbank. Werde mal mit meinem Ansprechpartner klären ob das unbedingt relevant ist.

    Das Verbindungen nicht geschlossen werden ist nichts neues. Der Garbage Collector wird auf aktuellen Debian basierenden Systemen jeweils 9/39 nach ausgeführt und bis dahin verweilen alle Verbindungen als offen, es sei denn der Garbage Collector von MySQL (Default: wait_timeout = 28800) greift ein. Da das Problem seit der "1&1 Administratoren Invasion" anno 2005  im alten Projektforum bekannt ist, gibt es auf unseren Servern in der
    Zitat
    /etc/mysql/my.cnf
    die Einstellung:
    Code: SQL  [Auswählen]
    wait_timeout            = 30

    Da habe ich leider keinen Zugang. Werde es aber den entsprechenden Personen weiter leiten. Vielen Dank für diesen Hinweis.

    Und auch an alle anderen ein dickes Dankeschön für die Beteiligung an unserem Problem. Ihr scheibt hier schneller als ich antworten kann, daher ist dieser Post etwas länger geworden.

    Besten Gruß,
    Timo

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Gesucht: xtc_db_close()!
    Antwort #18 am: 29. Januar 2015, 15:30:58
    ...
    Ein weiterer Dienst füttert im Hintergrund die Datenbank regelmäßig mit neuen Daten, den haben wir auch schon optimiert.
    ...

    Das scheint mir aber ein entscheidender Knackpunkt zu sein, optimiert oder nicht (wie überhaupt optimiert ?).
    Je mehr Indizes man setzt um so langsamer werden INSERTs durchgeführt. SELECT-Queries gehen schneller wenn die richtigen Indizes gesetzt sind aber eben mit dem Nachteil der langsamen INSERTs.
    Da muß man ein gutes Mittelmaß finden, je nach Anwendung.
    Die DB-Manager sollten mal genau schauen wann diese extrem langen Zeiten zustandekommen.
    Wenn dies immer dann geschieht wenn "im Hintergrund die Datenbank" gefüttert wird, ist das der Haupt-Knackpunkt.

    Gruß,
    noRiddle

    timopaul

    • modified Team
    • Beiträge: 360
    • Geschlecht:
    Re: Gesucht: xtc_db_close()!
    Antwort #19 am: 05. Februar 2015, 16:22:03
    Liebe Community,

    mittlerweile habe wir es geschafft mit vielen kleinen Modifikationen unser Problem in den Griff zu bekommen. Von den ehemals 14 Sekunden sind es jetzt nur noch 2 Sekunden, mit eigenem AJAX Content-Loader sogar nur noch 800 Millisekunden bis die Startseite angezeigt wird. Und das ganze sogar mit der Anzahl der Artikel zu jeder Kategorie.

    die größte Zeitersparnis geht dabei auf mein kleines Script aus diesem Post. Daher möchte ich jedem Shopbetreiber ans Herz legen, der Probleme mit seiner Datenbank und mehreren tausenden Artikeln hat, es damit einmal zu versuchen. Zu Hause lässt ja auch keiner die Haustür ständig auf und hofft dass Jemand "zufällig" vorbei kommt und diese zu macht.

    Des weiteren haben wir die erweiterte Suche mal "aufgeräumt", beziehungsweise die originale Datei wieder verwendet und nur mit den nötigsten Erweiterungen ausgestattet. Die Ermittlung der Preise wurde ebenso angepasst da die Regeln dazu etwas spezieller sind als im Standart-Shop.

    Soviel um das Thema abzuschließen.

    Viel vergnügen,
    Timo

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Gesucht: xtc_db_close()!
    Antwort #20 am: 27. Mai 2015, 12:39:48
    Guten Tag Genossen,...
    Sehe ich ja jetzt erst. Shopbetreibern können doch keine Genossen sein  :hust:

    Code: PHP  [Auswählen]
    // BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2015-01-28 - close all resources
    function close_resources($vars) {
      foreach ($vars as $k => $v) {
        global $$k;
        if (is_resource($$k)) {
          switch (get_resource_type($$k)) {
            case 'mysql link':
              mysql_close($$k);
              break;
            case 'mysql result':
              mysql_free_result($$k);
              break;
          }
        }
      }
    }
    register_shutdown_function('close_resources', get_defined_vars());
    // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2015-01-28 - close all resources
    Wenn das in application_bottom.php steht, dann müßte es doch nach wie vor offene DB-Verbindungen geben, weil an etlichen Stellen im Shop ein xtc_redirect (etwa Artikel in Warenkorb) steht, was zwar die Session-Daten sichert, aber nicht die DB-Verbindung schließt. Bis zur application_bottom kommt man dann aber gar nicht mehr. Nach dem Redirect wird doch dann in application_top wieder eine neue Verbindung aufgebaut.

    Richtig?

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Gesucht: xtc_db_close()!
    Antwort #21 am: 27. Mai 2015, 13:12:12
    Jein

    Es ist zwar richtig, das die application_bottom.php bei einem redirect ausgelassen wird aber offene, nicht persistente Verbindungen werden automatisch mit Beendigung des PHP-Skripts geschlossen -> http://php.net/manual/de/function.mysql-close.php

    Der Code von Timo gehörte aber nach meiner Meinung in die function xtc_session_start() in includes/functions/sessions.php um auch bei einem redirect ausgeführt zu werden.

    Gruss
    Hanspeter

    timopaul

    • modified Team
    • Beiträge: 360
    • Geschlecht:
    Re: Gesucht: xtc_db_close()!
    Antwort #22 am: 27. Mai 2015, 13:18:52
    Ahoi webald,

    [ ... ]

    Richtig?

    Richtig!

    Der Fall eines Redirects wurde bei der Lösung nicht berücksichtigt.

    Theoretisch kann man die Funktion close_resources auch in der /includes/application_top.php (oder auch /includes/functions/sessions.php) definieren und modifizieren sodass die $vars optional zum Zeitpunkt der Ausführung gefunden werden:

    Code: PHP  [Auswählen]
        // BOF - Timo Paul (mail[at]timopaul[dot]biz) - 2015-01-28 - close all resources
        function close_resources($vars = false) {
          $vars = false === $vars ? get_defined_vars() : $vars;
          foreach ($vars as $k => $v) {
            global $$k;
            if (is_resource($$k)) {
              switch (get_resource_type($$k)) {
                case 'mysql link':
                  mysql_close($$k);
                  break;
                case 'mysql result':
                  mysql_free_result($$k);
                  break;
              }
            }
          }
        }
        register_shutdown_function('close_resources');
        // EOF - Timo Paul (mail[at]timopaul[dot]biz) - 2015-01-28 - close all resources

    Habe gerade keinen Shop um diese Theorie zu testen.

    Besten Gruß,
    Timo

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Re: Gesucht: xtc_db_close()!
    Antwort #23 am: 28. Mai 2015, 17:07:28
    Wir haben in r8249 nun das xtc_db_close() entsprechend ergänzt.
    Das sollte so ausreichen um die Ressourcen wieder frei zu geben.

    Grüße

    Torsten
    1 Antworten
    1313 Aufrufe
    03. August 2017, 10:24:25 von awids
    1 Antworten
    1700 Aufrufe
    18. November 2016, 10:07:03 von jumpM
    13 Antworten
    5337 Aufrufe
    07. November 2014, 10:11:24 von fishnet
    2 Antworten
    1842 Aufrufe
    14. Oktober 2015, 08:25:30 von kirt
               
    anything