Memcached - Performance Tuning für Webseiten

Aus Laub-Home Wiki

Memcached ist ein Dienst, der es möglich macht zum Beispiel eine Mediawiki oder eine Wordpress Installation zu cachen, um somit die Performance und die Webseiten Auslieferungszeit zu verbessern. Ich werde hier beschreiben, wie man memcached für Mediawiki und für Wordpress verwenden kann.

Instalation

Unter Debian/Ubuntu Systemen kann Memcached einfach via aptitude installiert werden:

aptitude install memcached php5-memcache

Konfiguration

Die Konfiguration spielt sich in der sehr gut dokumentierten /etc/memcached.conf ab. Die wichtigste EInstellung ist, wieviel Arbeitsspeicher Memcached als Cache nutzen darf.
/etc/memcached.conf

# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default
# Note that the daemon will grow to this size, but does not start out holding this much
# memory
-m 128

Nach der Konfiguration sollte der Dienst neu gestartet werden

/etc/init.d/memcached restart

ein Blick in den netstat sollte folgende Zeilen beinhalten:

netstat -an
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN 
udp        0      0 127.0.0.1:11211         0.0.0.0:*        

hier ist zu sehen, das memcached standardmäßig auch auf UDP lauscht, will man dies deaktivieren muss man folgende Zeile in der memcached.conf einfügen:

# Disable UDP
-U 0

Konfiguration des Mediawiki

Die Anbindung des Mediawiki geht ganz einfach über die LocalSettings.php:

$wgMainCacheType = CACHE_MEMCACHED;
$wgParserCacheType = CACHE_MEMCACHED; # optional
$wgMessageCacheType = CACHE_MEMCACHED; # optional
$wgMemCachedServers = array( "127.0.0.1:11211" );
$wgSessionsInMemcached = true; # optional

Konfiguration des Wordpress

Wordpress kann unterstützt nicht, wie das Mediawiki, die Memcached Anbindung von sich aus. Dafür muss das Plugin FlexiCache nachinstalliert werden. Also einfach im Wordpress einloggen und unter Plugins installieren nach FlexiCache suchen und es installieren und aktivieren. Danach wird es unter "Einstellungen --> FlexiCache" konfiguriert:

  1. Main Options: Enable caching = Yes
  2. Main Options: Storage engine = Memcache

Fertig!

Memcache Statistik

Hat man Memcache am Laufen, will man natürlich auch wissen wie effektiv das ganze ist und wieviel des eingerichteten Speichers verwendet wird. Hiefür hat Ron Yayli ein kleines PHP Skript geschrieben, das hier zum Download bereitsteht:

Das Skript kann einfach in den Webserver Root gelegt werden. Dannach sollte man es erstmalig editieren und die Variablen oben im Skript anpassen:
memcache.php

define('ADMIN_USERNAME','admin');  // Admin Username
define('ADMIN_PASSWORD','yourpassword');  // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);

$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
//$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array

Ich habe, da ich eh eine Digest Auth vor dem gesamten vhost habe, den eingebauten Passwortschutz deaktiviert:

/*if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
           $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {
                        Header("WWW-Authenticate: Basic realm=\"Memcache Login\"");
                        Header("HTTP/1.0 401 Unauthorized");

                        echo <<<EOB
                                <html><body>
                                <h1>Rejected!</h1>
                                <big>Wrong Username or Password!</big>
                                </body></html>
EOB;
                        exit;
}
*/

Testen

Will man wissen ob memcached seinen Job macht, kann man ganz einfach eine Abfrage an ihn schicken:

echo stats | nc 127.0.0.1 11211

oder am Docker Container

docker exec -t CONTAINERNAME /bin/sh -c "/bin/echo stats | /usr/bin/nc 127.0.0.1 11211"

Die Ausgabe sollte dann so aussehen:

STAT pid 1
STAT uptime 9132
STAT time 1579460560
STAT version 1.5.20
STAT libevent 2.1.10-stable
STAT pointer_size 64
STAT rusage_user 2.846882
STAT rusage_system 11.130412
STAT max_connections 1024
STAT curr_connections 3
STAT total_connections 925
STAT rejected_connections 0
STAT connection_structures 8
STAT reserved_fds 20
STAT cmd_get 30187
STAT cmd_set 1870
STAT cmd_flush 0
STAT cmd_touch 137
STAT cmd_meta 0
STAT get_hits 27262
STAT get_misses 2925
STAT get_expired 137
STAT get_flushed 0

...

Quellen