[AlternC-dev] Fichiers logs Apache séparés

Retour à l'archive de la liste
Le site d'AlternC
Google Custom Search

The Anarcat anarcat at anarcat.ath.cx
Sam 13 Jan 20:45:49 CET 2007


Salut!

On Sat, Jan 13, 2007 at 07:51:46PM +0100, Dario Spagnolo wrote:
> Salut à tous,
> 
> ça faisait quelque temps que je réfléchissais à une solution pour avoir
> des fichiers logs Apache séparés pour chaque site/domaine/utilisateur/...

Pas un problème simple. :)

> La solution en place actuellement (rawstat.daily) ne me plait qu'à
> moitié, car :
> 
>  - parser un gros fichier de log (le mien fait actuellement 200Mo par
> jour mais grossit vite) une fois par jour me semble assez lourd

Mais il faut faire la rotation des logs! :)

>  - les utilisateurs n'ont pas leurs logs bruts en temps réel

"Too bad". :)

>  - qu'arrive-t-il aux requêtes écrites dans access.log pendant que
> rawstat.daily est executé ? Sont elles perdues ?

Ce que j'assume, c'est que rawstats.daily est roulé après la rotation
des logs, comme ça ils sont fermés et prêts à être splittés.

> J'ai donc réussi à avoir des fichiers séparés en modifiant la directive
> CustomLog dans /etc/apache/conf.d/alternc.conf :
> 
> 	CustomLog "|/opt/logsplit.sh" full

Idée intéressante! Ça évite le problème d'avoir un logfile d'ouvert
par domaine, par apache, ce qui est un hit de performance
inacceptable.

> Le script logsplit.sh écrit les lignes dans des fichiers differents en
> fonction du domaine qui a servi la requête :
> 
> while read line
> do
>         domain=`echo "$line" | awk '{ print $NF; }'`;
>         echo "$line" >> /var/log/apache/$domain;
> done

Évidemment, ceci est très sous-optimal. Un (deux? awk + sh?) fork par
ligne de fichier, ça bousillerait complètement notre serveur ici,
j'oserais même pas essayer ça. De plus, c'est un fopen/fclose par
ligne de log (plus précisément, un open, un seek, un write, un close,
4 syscalls!).

Je m'inquiète donc de la performance. Faire ceci en perl pourrait
éviter le hit des fork (le awk + ``), mais je vois mal comment ceci
contourne le problème original d'avoir un "file descriptor" d'ouvert
par domaine.

Autrement dit, le problème général ici, que ce soit dans apache ou
dans un script comme celui-ci, est de voir comment envoyer dans N
fichiers de logs M requêtes de façon efficace. Les approches
traditionnelles sont d'ouvrir les N logs, carrément, ce qui épuise
rapidement le nombre de "file descriptors" permis et est un hit de
performance. Nombre de syscalls: O(M), ce qui est pratiquement
optimal.

L'approche que tu proposes garde 0 file descriptors d'ouvert, mais va
invoquer environ 4 syscalls par requête, donc: nombre de syscalls
O(4*M), ce qui est un hit de performance encore plus grand...

Peut-être qu'une approche intermédiaire entre les deux serait
possible: garder une "cache" de file descriptors ouverts... Donc avoir
un overhead seulement pour les domaines plus rarement accédés. La
taille de la cache pourrait être configurable et tout...

Je crois cependant que ceci serait viable seulement pour les serveurs
ne traitant pas trop de requêtes.

> Cette configuation est actuellement utilisée sur mon serveur depuis
> bientôt une heure et semble fonctionner correctement. Je voulais vous en
> faire part pour savoir :
> 
>  - si cette séparation des fichiers de log vous paraît utile

C'est certainement utile.

>  - si vous avez des améliorations à proposer

Voir ci haut, mais en bref:

 * rewrite en perl (ou un autre language qui éviterait les 2 forks)
 * avoir une cache de file descriptors

>  - si il y a une chance pour que cette méthode soit reprise par AlternC

Je ne suis pas le grand manitou qui décide tout, mais si tu veux mon
avis: non. :) Ce n'est pas plus une approche viable que d'ouvrir un
"custom log" par domaine virtuel et ne serait pas "déployable" ici.

> Evidemment, le script logsplit.sh n'est qu'une ébauche et il ne gère
> notamment pas l'accès de la part des utilisateurs aux fichiers de leurs
> domaines.

Oui, peut-être que ceci aiderait la performance: ne pas ouvrir les
logs pour tout le monde, mais seulement ceux qui l'ont demandé.

J'espère aussi que le CustomLog ne fork pas le process de logging à
chaque ligne et qu'il le garde ouvert... Je me demande aussi ce qui
arrive quand le process plante, ou ce qui arrive quand plusieurs
processes apache lancent le process de logging en même temps.

> Merci pour vos remarques :)

J'espère que ça sera utile et que je suis compréhensible. :)

A.
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: signature.asc
Type: application/pgp-signature
Taille: 189 octets
Desc: Digital signature
URL: <http://lists.alternc.org/arch/dev/attachments/20070113/12daf99f/attachment.pgp>


Plus d'informations sur la liste de diffusion Dev