Catégories: "Informatique"

L'importance de l'optimisation

Novembre 1st, 2005

La fréquentation... On l'espère sur chacun des sites que l'on lance. Une des contre partie est l'accroissement de ressources utilisées. J'avais pas réalisé comment un trafic très important peut impacter rapidement un serveur via un site mal optimisé.

Durant ces dernières semaines, j'en avais marre de voir le processeur de [i]mes[/i] serveurs de plus en plus utilisés par quelques sites. Prenant le kangourou par les oreilles, j'ai décidé de m'attaquer aux problèmes... Avec, en toute modestie, succès. Voila donc les deux cas réels que j'ai du traiter ces derniers temps :

* Le premier exemple est le passage à la dernière version (dawn - 0.9.1) de b2evolution.
Mon blog et le blog groupé (http://blog.jovialyteam.com) sont hébergés sur le même serveur. Ils se font spammer à une moyenne de 2/3 connexions HTTP à la seconde pour des fake referents vers des sites porno ou de médicaments de tout genre. Malgré les protections, les spammeurs trouvent toujours des contournements et leurs robots spammeurs se connectent toujours sur le site et entrainent le traitement PHP et SQL du site.
J'ai donc mis à jour b2evolution et l'impact sur les performances est phénoménal comme on peut le voir sur ce graphe :
Avant et après la maj de b2evolution
Avant et après la maj de b2evolution sur une semaine

(les piques sont normaux et causés par un autre programme).
On voit clairement l'impact... Impact qui se voit aussi sur la base de données en terme de requêtes SQL et donc en utilisation du serveur SQL.
Comme quoi, bien choisir son logiciel est important et malheureusement, il est très difficile d'évaluer ce critère dans le monde réel...

* Deuxième exemple. J'ai développé pour l'association australia-australie.com un système de carnet de voyage http://www.carnets.australia-australie.com/ sur l'Australie. A l'époque, je ne pensais pas que ça prendrait autant d'importance donc les questions de performance n'avaient pas été un point crutial dans le développement du site mais voila, c'est devenu un succès en terme d'utilisation et de fréquentation causant ainsi un ralentissement notable dans l'accès au site. J'ai donc regardé le code (que je ne touchais plus depuis quelques temps vu que je développe la nouvelle version ...) et je me suis rapidement aperçu que j'avais zappé de créer les index sur les clés secondaires (je sais, j'ai honte).
Par exemple, les commentaires sur les carnets fonctionnent en arbre et du à la version de MySQL à l'époque, je dois faire une requête par branche dans une fonction récursive. Autant dire quelque chose qui tire sur un carnet à forte fréquentation avec beaucoup de commentaires.
Je l'ai donc généré les index à tous les endroits nécessaires (enfin, tout ceux que j'ai vu) et la rapidité a été vraiment augmentée et l'utilisation processeur réduite par un facteur énorme... (J'ai l'impression de vendre une lessive en disant ça).
Evolution sur un mois avant et apres les index
Evolution sur un mois avant et apres les index

Moralité... utiliser les index de base de données...

Ceci dit, une chose que je déplore dans les applications web comme par exemple mediawiki, c'est la non ou pauvre utilisation des caches. Par cache, j'entend conserver une copie de la page web générée pour la reservir directement si le contenu n'a pas changé... Evitant ainsi tout le processus de génération classique (boucles, traitement, connexion sql...). Au contraire, ils refont tous le processus à chaque connexion sachant pertinemment que le ratio (nouvelle page devant être généré)/(page déjà généré) est toujours à considérer... L'utilisation d'un moteur de template comme smarty réglant ce genre de problème (j'avoue que c'est long, parfois complexe et prévu depuis le début ou dans une refonte mais on y gagne tellement ...). A la place, on préfère demander de nouveaux serveurs...

Quick update of my kernel on a Dell Inspiron 8600

September 15th, 2005

Still boring to manage proprietary drivers with a Linux Kernel... Each time I want to update my kernel, I have to reinstall the ATI (ATI Technologies Inc RV350 [Mobility Radeon 9600 M10]) and WIFI (Intel Corp. PRO/Wireless LAN 2100 3B Mini PCI Adapter) drivers ...

So, I write down a quick procedure for a lazy copy/paste the next time.
Procedure for GNU/Linux with gcc 3.3 / kernel 2.6.13 / Ati Drivers fglrx 8.16.20 for X.org / ipw2100 1.1.0 / Alien 8.56 (RPM to .deb)
ATI drivers :

wget http://dlmdownloads.ati.com/drivers/linux/fglrx_6_8_0-8.19.10-1.i386.rpm

alien fglrx_6_8_0-8.19.10-1.i386.rpm
dpkg --force-overwrite -i fglrx-6-8-0_8.19.10-2_i386.deb
cd /lib/modules/fglrx/build_mod
chmod +x ./make.sh && ./make.sh
cd ..
chmod +x ./make_install.sh && ./make_install.sh

Wifi Card :

wget http://switch.dl.sourceforge.net/sourceforge/ipw2100/ipw2100-1.1.0.tgz
tar zxvf ipw2100-1.1.0.tgz
cd ipw2100-1.1.0
wget http://www.bughost.org/bugzilla/attachment.cgi?id=429
mv attachment.cgi\?id\=429 compilation_fix
patch < compilation_fix
make
make install


And the /etc/modules should have (the order does matter) :

agpgart
agp_ati
fglrx
i8k force=1
ipw2100

Edit : Comments are closed. Thank you spammers

Le Spam tue !

Septembre 3rd, 2005

J'administre le serveur sur lequel tourne mon blog. Il héberge pas mal de sites. Aucun ne générant des trafics délirant mais des sites de trafic moyen.
En autre sur ce blog, c'est entre 400 et 1200 connexions par jour. Il y a aussi quelques autres blogs qui générent entre 200 et 500 connexions par jour. Bref, rien d'énorme. Ceci dit, dans ces chiffres se cachent les robots des Spammeurs qui viennent pourrir les commentaires, les référents et les trackballs. Les robots vont simuler les interventions humaines. C'est-à-dire qu'ils vont consulter les pages HTML et mettre le texte et valider les formulaires. Bien sur, pour chaque page générée pour un robot, le serveur doit parser et traiter les pages PHP, lancer les requêtes SQL, etc d'où une surcharge du serveur inutile.

Suite au commentaire de Ralphy, j'ai testé une fonction (BlockUntrustedVisitors() qui en plus a le bon gout de ne pas être limité à b2evolution) qui se rajoute dans le code de b2evolution. Celle-ci se charge de refuser l'accès au site dès la connexion (c'est-à-dire avant le gros du traitement PHP) les robots hébergés sur des IPs connues comme étant détournées (essentiellement des PC sous Windows bourrés de Spywares).

Bref, j'ai donc rajouté cette fonction et j'ai été très surpris de voir l'impact évident que ça a eu sur le serveur.
Ce graphe (généré par MRTG à partir d'un script qui utilise le programme sar fourni par sysstat) montre l'utilisation processeur avant l'ajout de la fonction et après (vers 7 heure du matin).


Utilisation CPU avant et après l'ajout de la fonction

On voit facilement une diminution de plus de moitié de l'utilisation processeur (25 % d'utilisation à 8/9 %, les piques étant le programme de génération des stats - donc rien à voir) alors que le traitement SQL n'est même pas réalisé sur ce serveur mais sur un autre en LAN.

Par là, je ne veux pas montrer que b2evolution est lent, ça n'est pas le point. C'est surtout pour montrer l'impact économique que le SPAM a actuellement sur Internet car pour être capable de gérer cet utilisation anormale, il faut mettre à jour les serveurs ou en rajouter ... (la modification du code n'étant pas toujours possible). J'en fait déjà fait la désagrable expérience avec les serveurs mail tous les jours depuis des années mais je n'avais pas réalisé qu'elle touchait tant les serveurs web ...

Les packages debian avec dotdeb

Juillet 21st, 2005

J'avais écris un petit truc pour expliquer comment forcer debian à utiliser des packages spécifiques. Mais comme Gui ne tagge (release) plus ses packages , j'ai du changer les informations dans /etc/apt/preferences pour :

# En global
Package: *
Pin: origin packages.dotdeb.org
Pin-Priority: 990

# Pour un package spécifique
Package: php4
Pin: origin packages.dotdeb.org
Pin-Priority: 990

Package: php4-common
Pin: origin packages.dotdeb.org
Pin-Priority: 990

Package: libapache-mod-php4
Pin: origin packages.dotdeb.org
Pin-Priority: 990
[...]

X Drive III from Memup under Linux (2.6)

July 8th, 2005

Just a quick memo for me and other who will get this external harddrive/card reader.

This box contains a 60 go (in fact 56) and can read a few memory card : CF I and II, MS, MS Pro, SD, MMC, IBM MicroDrive, RS-MMC, mini-SD, MS Duo and MS Pro Duo.

As I don't want to reboot under Windows each time I want to use it, here is the procedure to have it working under Linux.

You need a few modules :

- SCSI disk support (BLK_DEV_SD)
-> Device Drivers
  -> SCSI device support
    -> SCSI device support (SCSI [=y])
      ->  SCSI disk support

- Qlogic QLA 1240/1x80/1x160 SCSI support (SCSI_QLOGIC_1280)
-> Device Drivers
  -> SCSI device support
    -> SCSI device support (SCSI [=y])
      -> SCSI low-level drivers
        -> Qlogic QLA 1240/1x80/1x160 SCSI support

- USB Mass Storage support (USB_STORAGE)
-> Device Drivers
  -> USB support
    -> Support for Host-side USB (USB [=y])
      -> USB Mass Storage support 

It should be enough. Recompile kernel/modules. Reboot

Plug the two USB connectors (DON'T forget to plugin both if it is not working with only one because of the lack of energy provided by my laptop).
If you try the command lsusb, you should see that :

Bus 001 Device 008: ID 0d7d:1470 Phison Electronics Corp.

And in /var/log/kern.org, you should get messages :

Jul  8 16:34:18 zoidberg kernel: usb-storage: scsi cmd done, result=0x0
Jul  8 16:34:18 zoidberg kernel: usb-storage: *** thread sleeping.
Jul  8 16:34:18 zoidberg kernel: SCSI device sda: 117210240 512-byte hdwr sectors (60012 MB)
Jul  8 16:34:18 zoidberg kernel: sda: assuming drive cache: write through

Then, you should be able to mount the /dev/sdXX (sda1 for me) partition where you want with the command :

mount -t vfat /dev/sda1 /mnt/external

Or add in the /etc/fstab this line :

/dev/sda1	/mnt/external			vfat    rw,user

Edit : comments are closed. Thank your spammer.