Archiv für MyOOS Performance

Yahoo gibt Client-Performance-Tipps

Yahoos Exceptional-Performance-Team beschäftigt sich mit der Frage, wie man Webseiten schneller macht, von Maßnahmen auf Serverseite über die Inhalte bis hin zu Cookies, JavaScript, CSS-Bildern und den speziellen Anforderungen mobiler Webseiten. Nach den ersten 14 Regeln für schnellere Webseiten hat Yahoo 20 weitere Tipps veröffentlicht.

Die 14 Tipps decken Themen wie “Mache weniger HTTP-Anfragen”, “Nutze Content Delivery Network”, “Ergänze einen Expires Header” und “Mach Ajax Cacheable” ab.

Mit “YSlow” bietet Yahoo zudem ein Add-on für die Firefox-Erweiterung Firebug an, die aufzeigt, wie sich die Geschwindigkeit einer Website anhand dieses Regelgerüsts verbessern lässt.

Auf der PHP Quebec Conference in Montreal stellt Yahoo-Ingenieur Stoyan Stefanov 20 weitere Tipps für schnellere Webseiten vor. Die Vortragsfolien stehen bei Yahoo online.

via Golem

Tags: , , , ,

Der MySQL Query-Cache

Der MySQL Query-Cache beschleunigt in den meißten Fällen die Abfragen. Er ist ab der Version 4 von MYSQL enthalten.

Mit dem Query-Cache werden Querys und deren Ergebnismengen gespeichert. Wenn das gleiche Statement mehrmals benutzt wird und die betroffenen Datensätze sich nicht verändert haben, wird das Ergebnis aus dem Cache geliefert.

Hinweis: Der Abfrage-Cache gibt keine veralteten Daten zurück. Wenn Tabellen modifiziert werden, werden alle entsprechenden Einträge im Abfrage-Cache synchronisiert.

MySQL Dokumentation

Viel Spaß noch beim Optimieren. Sie können uns gerne einmal Ihrere Erfahrungen über die Vor- oder Nachteile des Query-Caches schreiben. Auf Feedback sind wir immer neugierig.

Wie man ein hochverfügbares Apache Cluster aufsetzt

Mit dem Ultra Monkey Projekt kann man Load balanced und hochverfügbare Server-Anwendungen auf einem lokalen Area Netzwerk mit Open Source Komponenten auf dem Linux Betriebssystem erstellen.

http://www.linuxvirtualserver.org/docs/ha/ultramonkey.html

Das Ultra Monkey Paket stellt heartbeat und ldirectord bereit, den eigentlichen Load Balancer.

Um Ultra Monkey zu installieren empfehlen wir diese Anleitung
apache-cluster

In mittelständischen Unternehmen wird das Thema Ausfallsicherheit und Performanz häufig aufgrund der im Markt befindlichen hochpreisigen Load Balancer Lösungen untergeordnet zur Kenntnis genommen.
Gerade für hochverfügbare Server-Anwendungen wie das MyOOS Projekt ist es unerlässlich ein Instrument einzusetzen, das sich ausschliesslich darum kümmert, die eingehenden Anfragen intelligent zu verteilen und sicherzustellen, dass diese nicht ins Leere gehen.

Weitere Möglichkeit ist mod_proxy_balancer
mod_proxy_balancer
Apache mod_proxy balancing with PHP sticky sessions

Tags: ,

MySQL Performance Monitoring mit AdoDB

Nützliches Utility im ADOdb Layer

http://phplens.com/lens/adodb/docs-perf.htm

Grundsätzlich “merkt” man Performance Probleme erst dann, wenn der Server sehr deutlich langsamer wird – allerdings kann man zu diesem Zeitpunkt nur raten, was denn nun die begrenzte Resource ist.

Im MyOOS stehen Ihnen umfassende Monitoring- und Diagnosefunktionen zur Verfügung.

Um harte Fakten zu bekommen (beziehungsweise permanent zu überwachen, bevor es zu Problemen kommt), sollte man sich des Performance Monitors bedienen:

~/shop/includes/

define('OOS_LOG_SQL', 'true');    // OOS Performance Monitor

Für die kurzfristige permanente Überwachung kann man die Ausgabe deaktiven in

~/shop/includes/oos_nice_exit.php

  if (OOS_LOG_SQL == 'true') {
    $dbconn->LogSQL(false); // turn off logging
    // output summary of SQL logging results
/*
    $perf = NewPerfMonitor($dbconn);
    echo $perf->SuspiciousSQL();
    echo $perf->ExpensiveSQL();
    echo $perf->InvalidSQL();
*/
  }

Über folgendes einfache Skipt

  define('OOS_VALID_MOD', 'yes');
  require_once(dirname(__FILE__) . '/includes/oos_main.php');
 
  $perf = NewPerfMonitor($dbconn);
  echo $perf->UI();

starten Sie den Monitor.

Smarty $use_sub_dirs=true

MyOOS verwendet in der Kundinstallation die Vorgabewert ‘false’ von
Smarty für [i]$use_sub_dirs[/i].

Wenn $use_sub_dirs auf ‘true’ gesetzt ist wird Smarty unterhalb der Verzeichnisse templates_c und cache Unterverzeichnisse anlegen. In einer Umgebung in der möglicherweise zehntausende Dateien angelegt werden kann das helfen, die Geschwindigkeit des Zugriffs auf das Dateisystem zu optimieren. Andererseits gibt es Umgebungen, in denen PHP-Prozesse nicht die Berechtigung zum Anlegen von Unterverzeichnissen haben, so dass diese Funktion nicht genutzt werden kann. Der Vorgabewert ist ‘false’, aus Performancegründen wird allerdings empfohlen diesen Wert auf ‘true’ zu setzen, wenn die Systemumgebung dies zulässt

Quelle: Smarty Handbuch

Wenn man die Dateistruktur mit 10 Verzeichnissen im MyOOS nutzen möchten, ändert man in
~/shop/includes/classes/class_template.php

von

$this->use_sub_dirs = false;

nach

$this->use_sub_dirs = true;

Mit xdebug dem Profiler / Debugger für PHP kann die Performance leicht feststellen.

weitere Informationen:
Smarty Handbuch
Installation von xdebug
www.oos-shop.de/doc/smarty/html/

Entlastung von MySQL mit Adodb

Wenn der Shop eingerichtet ist kann man die eingebauten Performance-Vorteile nutzen.

Eigentlich ist die Angelegenheit ganz banal. in der Datei
~/shop/includes/oos_define.php den Wert der Konstanten
USE_DB_CACHE auf true ändern.

  define('USE_DB_CACHE', 'true');   // OOS SQL-Layer Cache

Weitere Änderungen an den Sourcen vom Projekt sind nicht notwendig. Aber wer es einmal ausporbieren möchte….

~/shop/includes/oos_blocks.php

Über die Datenbankabfrage werden die Content Blöcke rechts und links zum Inhalt geladen.

 $block_result = $dbconn->GetAll($block_sql);

Wenn das Ergebnis der Datenbankabfrage für 24 Stunden gültig sein soll

 $dbconn->cacheSecs = 3600*24; // cache 24 hours

für 12 Stunden verwendet man

 $dbconn->cacheSecs = 3600*12; // cache 12 hours

für 30 Minuten

 $dbconn->cacheSecs = 1800;

Wir ersetzen nun

 $block_result = $dbconn->GetAll($block_sql);

durch

 if (USE_DB_CACHE == 'true') {
   $dbconn->cacheSecs = 3600*24; // cache 24 hours
   $block_result = $dbconn->CacheExecute($block_sql);
 } else {
   $block_result = $dbconn->GetAll($block_sql);
 }

Der Shop speichert nun in das $ADODB_CACHE_DIR das Ergebis für
einen Tag zwischen.

Weitere Informationen im adodb Handbuch und in unserem adodb Handbuch

eAccelerator Installieren

eAccelerator Installation und Konfiguration

1. Laden Sie die aktuelle Version von eAccelerator herunter.

cd /tmp && wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2

2. Datei überprüfen

sha1sum eaccelerator-0.9.5.3.tar.bz2

Die jetzt angegebene Prüfsumme gleichen Sie mit der Prüfsumme ab, die auf der
eAccelerator Homepage angegeben ist. Wenn die beiden Summen nicht übereinstimmen, ist die Datei
fehlerhaft und sollte nochmals heruntergeladen werden.

>http://eaccelerator.net/wiki/Release-0.9.5.3

3. Entpacken der Archivdatei

tar xvfj eaccelerator-0.9.5.3.tar.bz2

4. Kompilieren und Installieren des Moduls
Die Pakete gcc, autoconf, automake, libtool, m4 müssen installiert sein. Für phpize muss auch php-devel installiert sein.

cd eaccelerator-0.9.5.3
phpize
./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config
make && make install

5. Konfiguration in php.ini eintragen.

Am Ende der Datei folgendes anhängen:

extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/oos_tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

6. Verzeichnis für den Cache anlegen

mkdir /oos_tmp/eaccelerator
chmod 0777 /oos_tmp/eaccelerator

Um die Änderungen zu aktivieren, muss der Webserver neu gestartet werden. Danach kann über phpinfo (Admin => Hilfsprogramme => Server Info hier PHP Version) validiert werden, ob eAccelerator unter PHP verfügbar ist.

Memcache mit MyOOS

Mit Memcache lassen sich Teile eines Programmes in den Hauptspeicher verlagern, für die z.B. Datenbankzugriffe oder Dateizugriffe notwendig wären. Memcache nimmt der Datenbank fantastisch
viel Arbeit ab. Alle Objekte sind im Memcache, kein Code greift direkt auf die Datenbank zu.
Die Datenbank wird dadurch um eine Größenordung entlastet. Was die Datenbank leisten müsste
sieht man dann, wenn der Cache leer ist.

Der Memcache ist ein verteilter Speicher. Er ist verteilt über mehrere Rechner. Will man keine Rechner extra für den Memcache abstellen, dann verwendet man traditionell die Webserver auch als Memcache-Server. Das heißt nicht, dass es schneller wird, weil die meisten Zugriffe nicht lokal sind, aber billiger weil man keine extra Rechner braucht. Die Webserver hat man ja sowieso. Die Standardvorgehensweise ist also: 10 Webserver hinter einem Loadbalancer. Auf jedem Webserver ein memcached. Das wird deshalb empfohlen, weil Webserver vor allem CPU brauchen (CPU bound) und der Memcache vor allem Speicher (memory bound). Man kann also die jeweils “andere” Ressource auch noch nutzen.

Installation und Konfiguration von memcache
memcached herunterladen

cd /tmp && wget http://www.danga.com/memcached/dist/memcached-1.2.3.tar.gz

Kompilieren und Installieren

cd memcached-1.2.3
./configure --prefix=/usr --sysconfdir=/etc
make && make install

Starten des Dienstes

/usr/bin/memcached -d -m 2048 -l 10.0.0.40 -p 11211
    Erklärung zu den verwendeten Parametern:

  • -d Startet memcached als Dienst
  • -m Gibt an, wieviel Hauptspeicher memcached benutzen kann. Diese Angabe wird in MB angegeben
  • -l Unter welcher IP der Daemon angesprochen wird
  • -p Unter welchem Port der Daemon angesprochen wird
r23@home:~> /usr/bin/memcached -h
memcached 1.2.3
-p <num>      TCP port number to listen on (default: 11211)
-U <num>      UDP port number to listen on (default: 0, off)
-s <file>     unix socket path to listen on (disables network support)
-l <ip_addr>  interface to listen on, default is INDRR_ANY
-d            run as a daemon
-r            maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num>      max memory to use for items in megabytes, default is 64 MB
-M            return error on memory exhausted (rather than removing items)
-c <num>      max simultaneous connections, default is 1024
-k            lock down all paged memory
-v            verbose (print errors/warnings while in event loop)
-vv           very verbose (also print client commands/reponses)
-h            print this help and exit
-i            print memcached and libevent license
-b            run a managed instanced (mnemonic: buckets)
-P <file>     save PID in <file>, only used with -d option
-f <factor>   chunk size growth factor, default 1.25
-n <bytes>    minimum space allocated for key+value+flags, default 48

Memcached mit PHP nutzen

Um memcached mit PHP nutzen zu können, muss das PECL Modul memcache verwendet werden.

Da PECL-Erweiterungen nicht mit PHP mitgeliefert werden, müssen sie nachträglich installiert werden. Danach kann man sie, wie andere Erweiterungen auch, von PHP aus verwenden.

pecl install memcache

Der Installer kümmert sich darum, dass die Erweiterung automatisch in der neusten Version heruntergeladen, das Archiv entpackt, die Erweiterung kompiliert und in das Erweiterungs-Verzeichnis (./ext) kopiert wird. Im Anschluss muss die Erweiterung noch in der php.ini eingetragen werden.

extension=memcache.so

Um die Änderungen zu aktivieren, muss der Webserver neu gestartet werden. Danach kann über phpinfo (Admin => Hilfsprogramme => Server Info hier PHP Version) validiert werden, ob memcache unter PHP verfügbar ist.

Passen Sie nun noch die Port und IP Adresse von Ihren Memcach Server in
~/shop/includes/functions/function_db.php an

      $dbconn->memCache = true; // should we use memCache instead of caching in files
      $dbconn->memCacheHost = '126.0.1.1'; // $db->memCacheHost = array($ip1, $ip2, $ip3); // $db->memCacheHost = $ip1; still works
      $dbconn->memCachePort = '11211'; // this is default memCache port
      $dbconn->memCacheCompress = false; // Use 'true' to store the item compressed (uses zlib)