Frage php hohes Speicherproblem


Hier ist der Stapel meiner Web-App. Einfach nginx + php-fpm + php5.3 + mysql + memcache. Vor kurzem haben wir etwas Refactored-Code implementiert. Dazu gehören SQL-Refactoring und Caching-Anpassungen. Wir haben festgestellt, dass die Serverlast nach der Bereitstellung stark zugenommen hat. Die Speicherauslastung stieg noch stärker. Und von oben kommend nutzten viele php-fpm-Prozesse 2-mal mehr Speicher als zuvor. Es stimmt also, dass der verwendete Code nicht stimmt. Das Problem ist nur in der Produktion env aufgetreten, in Test & Dev envs ist alles in Ordnung, also ist es mit dem Verkehr korreliert.

Meine Frage ist allgemein, wie kann ich herausfinden, welche Anfragen (Skripte) oder welche Teile meines Codes zu viel Speicher verbrauchen? Was ist der einfachste Weg, das herauszufinden?

Danke vielmals.


7
2018-06-08 09:53


Ursprung


Antworten:


Erstellen Sie eine Include-Datei, um die Speicherbelegung beim Beenden des Programms zu protokollieren, und ordnen Sie sie dann mit Auto-Prepend zu. Wenn dies Apache wäre, wäre es sicher, dies in stderr zu schreiben und es würde in der Fehlerliste erscheinen - nicht sicher, ob dies mit nginx funktioniert:

<?php
 function logit()
 {
    $line = $_SERVER['REQUEST_URI'] 
       . ' ' . memory_get_peak_usage(true);
    // if stderr works...
    $stderr = fopen('php://stderr', 'w');
    fputs(stderr, date('r') . ' ' . $line);
    fclose($stderr);
    // alternatively
    openlog("php_memory", LOG_PID | LOG_PERROR, LOG_LOCAL0);
    syslog(LOG_INFO, $line); 
    closelog();
 }
 register_shutdown_function('logit');

1
2018-06-08 11:33



Wir benutzen XHProf für das Speicherprofilieren. Es ist nicht perfekt, aber man hat ein gutes Gefühl dafür, was passiert. Wenn Sie es mehr als einmal ausführen (was Sie tun müssen, um das Spiking-Request zu finden), empfehle ich Ihnen auch die folgende GUI: XHPROF GUI

Grüße


1
2018-06-08 11:07