WordPress Performance Guide : From 5 to 6100 requests/sec on a 1Vcpu/1GB Ram VPS

After teasing in my last post, here is the full tutorial on how to improve your WordPress performances.

This idea started last week. As a Solution Architect @Hegerys, I had to provide a new solution for Magento hosting on a unique dedicated server.
But as we all know, if Magento is a very good and competitive eCommerce Software, it is also one of the slower, if not the slowest and heavyest. Getting good performance for this kind of web application on a unique dedicated server just seemed impossible.

Then before delivering, I wanted to test out how I could improve performances on a web software without having to get my hands directly into the code.
I had this wordpress blog (the one you’re reading) on a non-optimized WordPress behing a non-optimized apache+mod_php, on a very little VPS (1VCore, 1GBram).

When I started this work, http://blog.brigato.fr was only handling 5 requests/sec. It now handles more than 6000 requests/sec.

By following this tutorial, you should be able to improve a fresh untouched Wordbress performances by a factor 1000, and an optimized (W3 Total Cache, APC Enabled…) WordPress by a factor 400.

Continue reading

WordPress 2700 rq/s on a 1Vcpu/1GB Ram VPS

Update 23 Dec
Please see my new post here.
Managed to go through 6100rq/s by playing with Keepalive requests between backends. Seems even 1 rq/s more from apache can mean up to 200+rq/s at varnish frontend.

———————————


2012, December the 22, 0h50 a.m..
I’ve done it. One whole night of work, but it’s done. Passed the 150rq/s gap. Then the 300. Then it happened.


Results are here : 2694rq/s on a 1Vcpu/1GBRam VPS for a WordPress3.3 Instance on Index page. 0.003sec Average request time.

I’ll write a real paper on this during the next week. Meanwhile, first handmade schema explains it all. Virtous circle.

Oh, and teaser:
APC Opcode Cache is slower than on-disk static files served by Nginx. More than 3 times slower than on-disk files on a poor 80 I/Ops SATA Hard-drive.

Debian Squeeze : From Zero to Ruby1.9 with RVM


When using ruby in everyday life, there are definitives well-known drawbacks.
Managing ruby versions, multiples rubygems instance, dealing with distribution packaging-system, libreadline inconsistency…

There is also a well known solution : Ruby Version Manager (RVM)

However, if you’ve never done it, rvm can be a real pain to install and manage.

This is why I made, for every Debian Squeeze users, this little script, which should get you From Zero to Ruby1.9 in a matter of time.

Here : ruby1.9.2-rvm-ready-debian-squeeze

And for Readme’s haters :

bash < <(curl -s -k -B https://raw.github.com/khemael/ruby1.9.2-rvm-ready-debian-squeeze/master/ruby1.9.2-rvm-ready-debian-squeeze.sh)

Note this script May also work under :

  • Debian 5 Lenny
  • Ubuntu 10.04 LTS
  • Ubuntu 11.02

Let me know if this was usefull.

Rdirbrowser : Mini File Repository/Browser in ruby-cgi


A very short port about this code which has aged, but was asked several times.
This short ruby file-browser/uploader pretends to “do the work” without relying under the Big Mama Rails

This is old, flawfull and unpolished, but has the merit of having been functionnal and still be.

No Ruby on Rails/Sinatra/Rack/Whatever here, too much “simple” to need such a framework. A mod_ruby or mod_cgi is enough.

Video : Here
On Github : And there

Resolving .42 Top Level Domains


As the CEO of 42registry I feel quite confortable to give you this short tutorial about resolving the new .42 Unnoficial Top Level Domain :

Bind9 Users

Add this in your /etc/named.conf (or /etc/bind/named.conf.local) :

zone “42″ IN {
type forward;
forwarders {91.191.147.246; 91.191.147.243;};
};

Reload bind:

/etc/init.d/bind9 reload

If you don’t have local dns cache/resolver
Simply change your DNS configuration, using theses :

DNS1: 81.93.248.69
DNS2: 81.93.248.68

Et voila !
You will still resolve ICANN Accredited TLDs, plus .42

More Information

Des bons conseils pour une WeatherMap lisible et utile


Vous avez Cacti. C’est bien.
Vous savez vous en servir. C’est formidable.
Vous utilisez php Network Weathermap. Vous êtes pleins de bon sens.
Vos Weathermap sont lisibles. Vous êtes impressionnant.
Vos Weathermap sont utiles. Vous êtes exceptionnel.
Vos Weathermap sont belles, utiles, lisibles, exploitables. Vous êtes unique.

On me souffle dans l’oreillette que j’exagere quelque peu, mais avouons nous les choses : Weathermap, tout juste sorti de la boite, c’est tout de même moche, rapidement compliqué quand il y commence à y avoir du monde, très vite grossier, voir quasi abstrait et ce sans parler de l’éditeur php qui est une vrai plaie.

Malgré tout, il arrive un moment ou l’on se dit qu’avec un peu de temps et de conviction, il est possible de faire quelque chose. Cet article vous donnes quelques conseils, qui vous permettront je l’espere, de faire de vos weathermap un meilleur outil de travail
Continue reading

Du plaisir de travailler en 3g dans un Train à Grande Vitesse


Je laisserais l’ICMP parler de lui même quand à la qualité d’une connection 3g dans un TGV Paris-Bordeaux :

64 bytes from 8.8.8.8: icmp_seq=342 ttl=50 time=52315 ms
64 bytes from 8.8.8.8: icmp_seq=344 ttl=50 time=50536 ms
64 bytes from 8.8.8.8: icmp_seq=343 ttl=50 time=51540 ms
64 bytes from 8.8.8.8: icmp_seq=346 ttl=50 time=48540 ms
64 bytes from 8.8.8.8: icmp_seq=345 ttl=50 time=49540 ms
64 bytes from 8.8.8.8: icmp_seq=347 ttl=50 time=47568 ms
64 bytes from 8.8.8.8: icmp_seq=348 ttl=50 time=46568 ms
64 bytes from 8.8.8.8: icmp_seq=349 ttl=50 time=45568 ms
64 bytes from 8.8.8.8: icmp_seq=350 ttl=50 time=44568 ms
64 bytes from 8.8.8.8: icmp_seq=354 ttl=50 time=40588 ms
64 bytes from 8.8.8.8: icmp_seq=352 ttl=50 time=42588 ms
64 bytes from 8.8.8.8: icmp_seq=353 ttl=50 time=41588 ms
64 bytes from 8.8.8.8: icmp_seq=351 ttl=50 time=43588 ms
64 bytes from 8.8.8.8: icmp_seq=355 ttl=50 time=39616 ms
64 bytes from 8.8.8.8: icmp_seq=356 ttl=50 time=38620 ms
64 bytes from 8.8.8.8: icmp_seq=357 ttl=50 time=37635 ms
64 bytes from 8.8.8.8: icmp_seq=358 ttl=50 time=36635 ms
64 bytes from 8.8.8.8: icmp_seq=361 ttl=50 time=33639 ms
64 bytes from 8.8.8.8: icmp_seq=360 ttl=50 time=34640 ms
64 bytes from 8.8.8.8: icmp_seq=363 ttl=50 time=31640 ms
64 bytes from 8.8.8.8: icmp_seq=359 ttl=50 time=35639 ms
64 bytes from 8.8.8.8: icmp_seq=362 ttl=50 time=32640 ms
64 bytes from 8.8.8.8: icmp_seq=364 ttl=50 time=30644 ms
64 bytes from 8.8.8.8: icmp_seq=371 ttl=50 time=23947 ms
64 bytes from 8.8.8.8: icmp_seq=373 ttl=50 time=21948 ms
64 bytes from 8.8.8.8: icmp_seq=370 ttl=50 time=24948 ms
64 bytes from 8.8.8.8: icmp_seq=369 ttl=50 time=25952 ms

C’est tout. Les paquets arrivent même pas dans l’ordre :’)

Du routage d’un bloc d’IPv4 publiques à la maison [Partie Une]


Alors que les opérateurs de téléphonie mobile continuent d’appeler “Internet” une connexion sans adresse IP publique, alors que la Chine cherche désespérément çà et là quelques adresses à délivrer à ces filtrés connectés, alors que les FAI peinent à attribuer des IP fixes au foyers non-dégroupés, alors que j’étais moi-même devenu un “Maestro du NAT”, presque prêt à engager un coach en séduction afin de convaincre mes amis que “Non, ce n’est pas http://khemael.net, c’est http://khemael.net:8080, le port 80 de mon IP publique est déjà pris par le ssh que j’utilise pour contourner le filtrage du boulot”,

Je me suis décidé à tenter d’obtenir d’un bloc d’ adresses IPv4 publiques pour chez moi, à la maison.
Continue reading

De la solution pour lutter contre les démarcheurs téléphoniques


Je fais partie de cette catégorie de gens qui n’ont de téléphone fixe que parce qu’ils ont bien dû souscrire à un abonnement internet.
Si cela s’avère toujours pratique parce que permettant d’appeler pas cher au turkmenistan et assimilés, je ne m’en sers en revanche pas pour recevoir des appels et ne communique pas ce numéro.

Curieusement, je reçois malgré cela beaucoup d’appels indésirables, parmi lesquels divers démarcheurs et autres vendeurs de carte de membre de témoin de Jehovah religions pittoresques.

J’ai bien essayé de communiquer publiquement sur le fait que non, je ne suis pas intéressé par des voyages pas chers vers Istanbul, que non, je ne souhaite pas me faire arnaquer résilier EDF pour passer cher Direct Energie, que non, je ne vends pas de véhicule, que non, je ne souhaite pas participer à une vente pyramidale, que non, je ne souhaite pas remettre mon entière vie entre les mains d’une idole religieuse louche et que, finalement, je ne souhaite pas non plus un financement pour me lancer dans la poterie artisanale, mais tout cela n’a eu aucun effet.
Continue reading

De la manière de faire de l’exec() et system() root en PHP

|elephant| aurait été plus juste
J’ai ces derniers temps dû faire face à ce que je redoute le plus depuis que les ports 80 de par le globe ont commencé à s’ouvrir.

Tel Freddy contre Jason, tout comme Batman face au Joker, tout comme  Demis Roussos devant son rasoir, il eut à se battre dans une joute mortelle et sans fin contre sa plus grande chimère, à la fois sa pire peur et son pire cauchemar, contre L’Engeance Malsaine Du Web 1.5 : PHP

Continue reading