Caching-Fehler während eines Testlaufs diagnostizieren 0

Posted by fwoeck
on Tuesday, April 14

In Projekten, die z.B. memcached als Cachingserver für SQL-Anfragen und Seitenfragmente einsetzen, kann das Cachemanagement selbst eine erhebliche Fehlerquelle sein.

Da sich die Inhalte des Cachingservers nicht ohne weiteres zwischen zwei Testabschnitten löschen lassen, ist es wohl am sichersten, den Server in jedem Scenario neu zu starten. Hierzu spricht man am besten eine separate Instanz auf einem eigenen Port an, z.B. 11213 anstelle 11212.

Cucumber

Ich benutze hier cucmber und Selenium als Testplattform. Um den Caching-Dienst für den Testlauf zu starten, trage ich ein entsprechendes Statement als Before-do-Schritt ein und anschließend einen kill-Befehl als After-Do-Schritt:

1
2
3
4
5
6
7
Before do
  system("memcached -l 127.0.0.1 -p 11213 -d")
end

After do
  system("killall memcached 2>/dev/null")
end

Ein eventuell regulär laufender memcached sollte unter einem anderen Useraccount laufen als der cucumber-Task, um zu vermeiden, dass er vom kill kurzerhand mitgetilgt wird.

Rails-Konfiguration

Damit der Server letztlich auch benutzt wird, muss er in der config/environments/test.rb aktiviert sein:

config.cache_store = :mem_cache_store, "localhost:11213"

Auch das Caching sollte aktiv sein – sonst ist es nicht das echte Leben:

config.cache_classes = true
config.action_controller.perform_caching = true
config.action_view.cache_template_loading = true

ein Testlauf

Jetzt kann man den Testlauf starten und währenddessen die aktive Cachingserverinstanz prüfen:

~ > memstat --servers=127.0.0.1:11213
Listing 1 Server

Server: 127.0.0.1 (11213)
         pid: 13500
         uptime: 4830
         time: 1239700285
         ...

10x schnellerer Memcache mit libmemcached 0

Posted by fwoeck
on Tuesday, March 17

Seit einiger Zeit gibt es eine in C geschriebene Memcached-Library, die deutlich schneller funktionieren soll, als z. B. die native Anbindung in Rails. Da bei der Migration nach Rails 2.3 ohnehin ein paar Fehler bei der Standardanbindung aufgetreten sind, war das ein guter Zeitpunkt für mich, die Alternative zu testen.

Leider ließen sich die aktuellen Versionen (März 2009) nicht zusammen kompilieren, und so musste ich auf etwas ältere zurückgreifen, die nun aber fluppen. Benötigt werden die libmemcached, das libmemcached_store-Plugin, das den Defaultmechanismus in Rails ersetzt und etwas Konfiguration:

Setup

wget http://blog.evanweaver.com/files/libmemcached-0.25.14.tar.gz

tar -xzvf libmemcached-0.25.14.tar.gz

cd libmemcached-0.25.14

./configure && make && make install

wget http://blog.evanweaver.com/files/memcached-0.13.gem

gem install memcached-0.13.gem

Das Plugin:

script/plugin install git://github.com/cheald/libmemcached_store.git

Konfiguration

Zumindest muss das Plugin in der environment.rb aktiviert werden:


config.cache_store = :libmemcached_store

Wer es etwas ausgefallener möchte, kann für Sessions und Fragmente separate Server ansprechen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GENERAL_CACHE_SERVERS = ["localhost:11211"]
GENERAL_CACHE_OPTIONS = {:untaint => true}
SESSION_CACHE_SERVERS = ["localhost:11211"]
SESSION_CACHE_OPTIONS = { :prefix_key => "session:marsxpress" }
SESSION_MEMCACHE_CLIENT = Memcached.new(SESSION_CACHE_SERVERS, 
    SESSION_CACHE_OPTIONS)

config.cache_store = :libmemcached_store, GENERAL_CACHE_SERVERS, 
    GENERAL_CACHE_OPTIONS
config.action_controller.session_store = :libmemcached_store
config.action_controller.session = {
    :cache => SESSION_MEMCACHE_CLIENT,
      :expires_after => 86400
}

andere Funktionen

Das libmemcached-Paket bringt einige Tools mit, mit deren Hilfe man sich die Betriebstemperatur seiner Cachingserver ansehen kann:

  • memcat – Copy the value of a key to standard output
  • memflush – Flush the contents of your servers
  • memrm – Remove a key(s) from the serrver
  • memcp – Copy files to a memached server
  • memstat – Dump the stats of your servers to standard output
  • memslap – Generate testing loads on a memcached cluster

Weblinks

  1. github.com/cheald/libmemcached_store
  2. tangent.org/552/libmemcached.html
  3. blog.evanweaver.com