Apache Performance .....

braegler

NGBler
Registriert
14 Juli 2013
Beiträge
871
Nabend zusammen,

ich bastle gerade an einem kleinen Projekt und bin auf etwas gestossen, dass ich nicht ganz verstehe
- läuft auf newscrawler.eu
Hintergrund: Britischer Kollege möchte die UK Klatschpresse "analysieren". Dazu werden die Headlines von bisher Express und Daily Fail in einer MySQL DB gespeichert.
Struktur:
Die Daten liegen in einer einzelnen Memory-table (1.6m Einträge).
Betrieben wird das ganze auf php Basis mit Apache.

Sobald ich grössere Datenmengen abfrage, sehe ich komische Effekte. Die Datebank-Abfrage läuft soweit "rund" (wildcard auf varchars, daher auch mal ein paar Sekunden).
Die Daten werden mit Smarty geparst und in einer riegigen Tabelle ausgegeben.

Beispiel:
Zeit vom start des php Skriptes bis Smarty alles geparst und ausgegeben hat: 1.2 Sekunden
Content Download Grösse: 2.9MB
Content Download Zeit: 1.3 Minuten
Lade ich eine Datei direkt vom Webserver, liefert Apache mir diese in "Fullspeed" (also was meine Land-DSL Leitung hergibt aus)

Mal ein Chrome-Debug-Screenshot:
newscrawler_debug.jpg

Hat jemand von Euch zufällig eine Ahnung woran des liegen könnte?
 
  • Thread Starter Thread Starter
  • #3
Hier mal die index.php

[src=php]
<?php
include_once("./loader.php");
$data = false;
$time_end = 0;
$cfg['searchtype'] = "list";
if(isset($_POST['search_type'])){
$cfg['searchtype'] = "list";
if($_POST['search_type'] == "Get the Graph"){
$cfg['searchtype'] = "graph";
$time_start = microtime(true);
$data = ProcessRequest();
$data = GetGraphData($data);
$time_end = microtime(true);
}else{
$time_start = microtime(true);
$data = ProcessRequest();
$time_end = microtime(true);
}
$cfg['dbquerytime'] = $time_end - $time_start;
}

if(!isset($_POST['year_from'])) $cfg['post']['year_from'] = date("Y") -1;



$smarty->assign('data',$data);
$smarty->assign('cfg', $cfg);
$smarty->display('index.tpl');

if($time_end >0){
$te = microtime(true);
$td = $te - $time_end;
error_log($td);
}

[/src]

Das interessante ist, dass der php-Code durchrennt. Nach 1.2 Sekunden wurde im meinem Testlauf die Zeile 34 ausgeführt.
Danach dauerte es noch über 1 Minute bis die 2.9MB Content komplett übertragen wurden

Der gesamte Code liegt auf



Info zum Indianer:
Server version: Apache/2.4.25 (Debian)
Server built: 2018-11-03T18:46:19
Server's Module Magic Number: 20120211:68
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"

Das Ding liegt auf

Zum Nachstellen:
Links auf das Listen-Icon gehen um die 3 vordefinierten Suchkombis auswählen zu können.
Dort z.B. EU & Brexit related wählen, und die Aanzahl der Suchergebnisse auf "unlimited" einstellen -> Get the list.
 
Ich glaube dein Javascript rechnet zu viel:

Mal drei Screenshots die das etwas verdeutlichen (Firefox Laufzeitanalyse):
Was auffällt, ständige Layout Änderungen/Stil-Neuberechnungen.

Flow 1:


Flow 2:


Flow 3:



Folgende Ideen dazu:
1) Die filltable.js ersetzen so fern nicht benötigt mit dem teuren [kw]$oldTbody.replaceWith[/kw] in der [kw]each[/kw] in filltable.js ab Zeile 118.
2) Eventuell hilft es auch die Tabelle zu verstecken so lange diese nicht komplett dargestellt ist, das könnte auch die Repaints verringern da der Browser nicht bei jeder neuen Zeile layoutet.
 
  • Thread Starter Thread Starter
  • #5
Danke für Deine Hinweise.
Hab filtable.js mal testweise deaktiviert, änder leider nichts an der Download-Ladezeit.

Die Tabelle zu verstecken bis alle Daten angekommen sind, hat merklich was gebracht. Die DL Zeit ist jetzt bei 8 Sekunden. Danach rendert er dann in weiteren 5-8 Sekunden.
 
Off:
Seit wann sammelst du denn da schon Daten? Oder hast du einfach nachträglich die beiden Seiten massenweise gecrawled? Gibt es da nicht Probleme, wenn du ganze Seiten crawlest? Gerade Nachrichtenportale haben da doch meistens diverse Sicherheitsmechanismen, um das zu verhindern oder täusche ich mich da?
 
  • Thread Starter Thread Starter
  • #7
Tachjen,
hab die Seiten in erst vor wenigen Wochen abgegrast. Beide bisherigen "Opfer" haben recht übersichtliche Archive.
Der erste Versuch war etwas harzig, da bin ich wohl in ein Rate-Limiter reingerannt.
Hab dann einfach einen kleinen Delay eingebaut.
Mit 0.5 Sekunden zwischen den einzelnen Anfragen ging es dann jedoch.
 
Zurück
Oben