Kamelot Blog

Aller au contenu | Aller au menu | Aller à la recherche

mardi 24 février 2009

mar
24
fév '09

mysql archive et partition

Petite expérience sur mysql 5.1

4 tables de même structure mais 4 stockages différents : MyISAM et archive, avec et sans partition. un peu plus de 500 enregistrements ....

sans partition

MyISAM 52Ko ->Archive : 20 Ko

avec partition

Myisam 63 Ko -> Archive 12.1Ko

Là je suis étonné, l'archive avec partition est 40% plus petite.

J'ai ajouté 31000 enregistrements

sans partition

  • MyISAM : 52Ko -> 1.59Mo
  • Archive : 20 Ko -> 90Ko !!!!

avec partition

  • MyISAM : 63 Ko -> 1.6Mo
  • Archive : 12.1Ko -> 82Ko

2 grande conclusions

  • L'archive ça vaut vraiment le coup quand on peut supporter ses limites
  • Le partitionnement ne change rien (il y a des différences négligeables)

Je reste quand même étonné que le partitionnement d'une table archive réduit le stockage.

Voir la suite pour plus de détails

Lire la suite...

lundi 23 février 2009

lun
23
fév '09

Een victoire.

J'en parlais, il y a un mois, un groupe sur facebook défandant l'option du sous-titrage à la place du doublage sur nos antennes.

J'ai entendu au petit journal des médias de pure FM, qu'une première victoire s'annonce : Le sous-titrage à la place du doublage à la RTBF, c'est ok pour le néerlandais à partir d'avril, en septembre ocotbre pour l'anglais et l'allemand suivra si ca se passe bien.

Extrait du communiqué sur le groupe Facebook en faveur de cela.

Jean-François Raskin, pdt du conseil d'administration de la RTBF annonce que dès le mois d'avril, 
les interventions en néerlandais seront sous-titrées au cours de journaux télévisés. 
Idem pour l'anglais à partir du mois de septembre. 
Certains essais ont déjà eu lieu, plusieurs parmi vous l'ont d'ailleurs remarqué.
Mr Raskin n'y est pas favorable, il n'y a pas de public pour ce genre d'expérience 
comme semble le prouver les résultats d'audience obtenus
lors de la diffusion simultanée des films en VO 
et avec doublage sur les deux chaînes de la RTBF.
Le professeur Yzerbyt de l'UCL propose une idée originale: 
la diffusion du JT de la VRT en version sous-titrée à des heures 
de faible audience (la nuit par exemple), le journal pourra être enregistré 
et regardé afin de parfaire un apprentissage de la langue, 
idem avec celui de la RTBF sous-titré en néerlandais.
Le débat tourne également autour de l'efficacité du doublage 
dans le cadre de l'apprentissage d'une langue, 
le professeur Ginzburg de l'ULB nous apprend que relativement 
peu de gens admettent avoir appris une langue via la vision de films en VO.

Jean-François Raskin nous assure qu'une marche arrière n'est pas envisageable.

JM Delroeux rappelle l'intérêt suscité par le groupe facebook 
(créé en septembre, plus de 5600 membres) 
et la réaction vive à la pétition (près de 1900 en un mois) 
qui signifient la présence d' une minorité "conséquente" qui demande le sous-titrage. 
Il déplore aussi le manque d'écoute d' RTL-TVI. (...)
Régine Florent rappelle que le sous-titrage est un facteur positif pour l'acquisition  
de vocabulaire et l'entraînement à la compréhension (2 éléments essentiels dans l' apprentissage), 
redit l' importance des langues sur le marché de l' emploi, insiste sur la mission de 
service public de la RTBF et plaide pour l' introduction d' un mini-minimum de fiction
en V.O.( commencer par une dose "homéopathique" : ex. 1 film ou 1 série par semaine ?)

Journal de la VRT traitant du sujet, avec interviews de Jean-François Raskin et Jean-Michel Delroeux

samedi 21 février 2009

sam
21
fév '09

Claroline pour contrer les grèves

Repéré par Mathieu.

Reportage du journal télévisé de France2 de ce vendredi 20 février.
Depuis 1 mois, la Guadeloupe est touchée par une grève générale.
Tous les lycées sont fermés, pourtant le lycée de BAIMBRIDGE à Point-à-pitre les cours continuent.

vendredi 20 février 2009

ven
20
fév '09

Belgium Testing Day

Belgium Testing Day

Belgium Testing Day le 23/02/2009 à l'Hotel Bloom, de Bruxelles

  • Stephan Goericke : Assure Quality - Keep Training Testers
  • Erik van Veenendaal : Risk Based Testing In Practice
  • Alon Linetzki : Root Cause Analysis: Dealing with Problems, Not Symptoms
  • Geoff Thompson : Software failures – can we learn from them
  • Manu Cohen-Yashar : Security testing using free tools
  • Steven Mertens : Usability Testing
  • Geert Vanhove : When testing stops and politics takes over
  • Claus Gittinger : Model-Based Test Development
  • Geert Lemmens : Agile: Testing at the speed of light
  • Yaron Tsubery : ATP – The Factors behind Success
ven
20
fév '09

Créer une file de traîtement avec Innodb

Ce post est à moitié une manière de faire , et une autre une façon de mieux le faire?

Donc, vous voulez construire un système qui effectue des tâches. Vous voulez que le travail puisse être organisé en parallèle pour la vitesse, mais aussi pour la redondance. Ce système doit être coordonnée de façon, par exemple, les mêmes tâches ne sont pas faites deux fois, le statut de chaque tâche est facile à voir, et de multiples serveurs peuvent effectuer les tâches simplement en interrogeant la source centrale.

Voici la traduction de Creating a Job queue in Innodb Comment peut-on construire cela avec innodb pour avoir MySQL comme système central de notre système?

[MYSQL]
CREATE TABLE IF NOT EXISTS job_queue(
   id int(10) not null auto_increment,

   updated timestamp not null,
   started timestamp not null,

   state ENUM('NEW', 'WORKING', 'DONE', 'ERROR' ) default 'NEW',

   PRIMARY KEY ( id ),
   KEY( STATE )
) ENGINE=Innodb;

Dans ce schéma, notre table de tâches a un identifiant unique, une heure de démarrage et de mise à jour et un statut.

Dans un système réel, il y aura sans doute un peu plus de méta-données ici sur la nature des tâches.

Lorsque de nouvelles tâches doivent être programmées, les lignes sont insérées dans la table (avec started à NOW (), et updated est mis à jour automatiquement)

[MYSQL]
insert into job_queue set started=NOW();

Maintenant, en perl, nous écrivons un contrôleur de tâches. Ce programme peut être exécuté sur chaque serveur qui pourrait accomplir les tâches.

[perl]
#!/usr/bin/perl

# Don't leave zombies around, shamelessly stolen from 'man perlipc'
use POSIX ":sys_wait_h";
sub REAPER {
    my $child;
    while (($child = waitpid(-1,WNOHANG)) > 0) {
        $Kid_Status{$child} = $?;
    }
    $SIG{CHLD} = \&REAPER;
}
$SIG{CHLD} = \&REAPER;

use DBD::mysql;

my $dbh = DBI->connect(
'DBI:mysql:database=test;host=127.0.0.1;port=3306',
'test', 'test',
{ RaiseError => 1, AutoCommit => 0 }
);


while( 1 ) {
 my $row;
 eval {
     my $sth = $dbh->prepare( "select id from job_queue where state='NEW' li
mit 1 for update" );
     $sth->execute();
     $row = $sth->fetchrow_hashref();
     $sth->finish();
 };

 if( $@ or !$row ) {
     # Couldn't lock or lock wait timeout
     $dbh->commit();
     sleep 10;
     next;
 }

 # Got one, change state, commit, and fork a worker

 $dbh->do( "update job_queue set state='WORKING' where id=" . $row->{id} );
 $dbh->commit();

 # Fork a worker
 if( fork )  {
     # Parent, let the child have the old connection and reconnect to
     # the db.
     $dbh->{InactiveDestroy} = 1;
     $dbh = DBI->connect(
        'DBI:mysql:database=test;host=127.0.0.1;port=3306',
        'test', 'test',
        { RaiseError => 1, AutoCommit => 0 }
     );
 } else{
     # fils
     print "Création du verrou\n";
     $dbh->do( "select * from job_queue where id=" . $row->{id}
         . " for update " );

     print "Travail en cours\n";
     #On simule un traitement
     srand( time );
     sleep rand 30;

     $dbh->do( "update job_queue set STATE='DONE' where
         id=" . $row->{id} );
     print "On Commit\n";
     $dbh->commit();

     $dbh->disconnect();

     exit;
 }
 sleep 1;
}

Maintenant, ce n'est pas mauvais. Mais il a au moins une chose que je n'aime pas. Si une des tâches n'aboutit pas, il n'existe aucun moyen pour réaffecter la tâche.

Ideally each worker would have a lock on his job row inside of a transaction, which it is doing now, but, instead of the job being in the 'WORKING' state first, I'd rather it was 'NEW' before the transaction started. If that were the case, if a worker died, it's unfinished transaction would be rolled back, and the job would be unlocked and NEW again.

Idéalement, chaque travailleur aurait un verrou sur son travail dans une transaction, ce qui est fait maintenant, mais, au lieu du travail en cours dans le «travail» d'abord, je préfère c'est "NOUVEAU" avant l'opération a commencé . Si tel était le cas, si un travailleur est mort, il est inachevé transaction serait annulée, et la tâche serait déverrouillé et NEW nouveau.

However, because of the way SELECT ... FOR UPDATE works, Innodb will deadlock waiting for 'NEW' jobs to unlock from the workers (or wait until they are done). This is sub-optimal, since my parent process could be forking new jobs in the meantime. What would fix this is a SELECT ... FOR UPDATE that skipped locked rows without blocking. Toutefois, en raison de la façon SELECT ... MISE À JOUR DE œuvres, InnoDB va impasse d'attente pour les «nouveaux» pour déverrouiller l'emploi des travailleurs (ou d'attendre jusqu'à ce qu'ils soient fait). Cela est sous-optimale, car mon père pourrait être forking de nouveaux emplois dans l'intervalle. Qu'est-ce que ce correctif est un SELECT ... MISE À JOUR DE verrouillé ignoré que des lignes sans blocage.

If anyone knows a good way to achieve this, please let me know!

However, assuming we have no better alternatives, we can create a reaper process like this:

[perl]
#!/usr/bin/perl

use DBD::mysql;

my $dbh = DBI->connect(
   'DBI:mysql:database=test;host=127.0.0.1;port=3306',
   'test', 'test',
   { RaiseError => 1, AutoCommit => 0 }
);


while( 1 ) {
    my $row;
    eval {
        my $sth = $dbh->prepare( "select id from job_queue where state='WORKING' limit 1 for update" );
        $sth->execute();
        $row = $sth->fetchrow_hashref();
        $sth->finish();
    };

    if( $@ or !$row ) {
        # Couldn't lock or lock wait timeout
        $dbh->commit();
        sleep 10;
        next;
    }

    # Got one, change state, commit, and fork a worker

    $dbh->do( "update job_queue set state='NEW' where id=" . $row->{id} );    $dbh->commit();

    sleep 1;
}

This will find the first WORKING row and try to lock it. Since normal jobs will be moved to DONE before they are committed, this should only ever find jobs that are in WORKING and unlocked, which means the worker died.

However this isn't perfect. Because SELECT ... FOR UPDATE will try to lock a row already locked, we have to wait until all jobs before our stalled job are complete, getting deadlocks along the way (be sure to set your innodb_lock_wait_timeout fairly low!. Even further, I've seen dead worker processes leave behind idle mysql connections that hold onto their row locks.

Is there any smoother way to do this? I'd love to hear other people's advice.

jeudi 12 février 2009

jeu
12
fév '09

Petit délassement

Quelques vidéos, rien d'utile. Du temps perdu et des images amusantes

Lire la suite...

dimanche 8 février 2009

dim
08
fév '09

FOSDEM 2009 la room mysql est full

La room mySql rencontre un très beau succès. Entré a l'heure juste du début de la conférence de Kris, j'ai eu une des dernières places confortables.

La présentation concernait les solutions de monitoring. Je ne vais pas m'étendre sur le contenu. Il est plus simple d'aller voir ça sur le site.

Si j'écris c'est pour dire aussi combien il est plaisant de voir la qualité de ces présentations. Mais qu'en plus les liens entre elles sont établis. Les différents orateurs connaissent les présentations des autres.

samedi 7 février 2009

sam
07
fév '09

Enter You - METALLICA VS BRYAN ADAMS

Les bootleg que j'écoute sont nombreux. Ils passent de plus en plus à la radio.

En voici un qui m'a particulièrement plus pour sa qualité de fusion.

Enter You

Il nous est proposé par wax audio.

Composantes

Résultat : Enter You 3:39 / 8.4MB / 320kbps

Lire la suite...

vendredi 6 février 2009

ven
06
fév '09

Contrôles de mes logs d'erreur

Dans l'idée des changements en douceur évoquée précédemment, voici un autre outil, qu'en son temps j'avais demandé à avoir chez Skynet et que je remet en place.

Voici l'état d'avancement de mon script qui check mon log d'erreur php

Je vais encore le compléter pour

  1. ° différencier le type d'erreurs (fatal, warning, ...) pour prioriser les corrections
  2. ° avoir un diff journalier
  3. ° avoir un "temps moyen de réparation" des bugs rencontrés.
[shell]
WORKPATH="/var/tmp/worksfile/"
LOGPATH="/var/log/"
mkdir -p $WORKPATH
mkdir -p $LOGPATH

PRODERRORLOG=$WORKPATH"prod.error.log"
FINALLOG=$LOGPATH"error.log"
echo "result in : "$PRODERRORLOG;
da=`date -d yesterday +'%d-%b-%Y'`
echo $da
grep $da /var/log/php/prod.err | cut -c 2-12,23- |sort | uniq -c |sort -nr | head -n 50 > $PRODERRORLOG
clear

echo "--------On PROD------------------------------------------------------------------------" >>$FINALLOG
echo "=======================================================================================" >>$FINALLOG
cat $PRODERRORLOG > $FINALLOG

cat $FINALLOG

Les objectifs sont

  • Repérer les nouvelles erreurs apparues la veille (priorité 1).
  • Repérer les erreurs les plus récurentes (et donc priorité 2).
  • Obtenir de la matière première pour des stats sur la qualité du code.

Tags