18 déc. 2012

Identifier les fichiers volumineux avec NCDU

Lorsque votre système unix devient encombré et que l'espace disque vient à manquer, identifier les fichiers volumineux peut s’avérer une tâche fastidieuse, en particulier lorsque l'on ne maîtrise pas les outils du ou find  et leurs options.

Heureusement pour les plus paresseux (ou pragmatiques) d'entre nous, une bonne âme a eu la bonne idée de créer NCDU : un outil graphique pour identifier les répertoires et fichiers prenant le plus de place sur vos disques. A l'initialisation le programme scannera l’intégralité du répertoire courant et vous permettra de naviguer a travers l'arborescence à l'aide des touches directionnelles du clavier.


Une application très utile que vous pouvez ajouter a la panoplie des outils pour gérer votre serveur distant lorsque vous disposez uniquement d'un shell ssh.

Pour l'installer, yum install ncdu, ou apt-get install ncdu, ou sinon vous pouvez le télécharger sur le site de l'auteur.

Merci aux sysadmins de chez Rackspace pour m'avoir fait découvrir cet outil :).

29 nov. 2012

Virtualbox and Centos: Frozen network, Detected Tx Unit Hang

Since few days I had a really annoying issue with one of my virtual machine:

I run a python script using urllib2 to collect some data from various online APIs. Everything seems to run smoothly when sudenly the script starts to hang and becomes unresponsive (CTRL+C does not have any effect). I open a new shell to see what's going on and I notice that any application that triggers a network activity starts to hang (yum, pip...). I open my TTY console and I notice that some error messages are popping : "eth0: Detected Tx Unit Hang", "eth0 Reset Adapter" and something about kernel hang timeout... A lot of signs that something really bad is happening on this machine. The only way to recover from it consists in performing a hardware reset of the Guest machine, but the problem arises again shortly after.


Screenshot of the situation

The issue had nothing to do with my script or my VM setup, but was in the configuration of the VirtualBox instance. I have a Intel i7-2600 CPU with 4 cores on my Host, so I though it was a good idea to assign multiple cores to my VM to improve performances and to have something closer to my production server. Turns out that by doing this I caused the problem: assigning more than 1 cpu to my VM results in the network interface to hang and freeze the kernel after a certain amount of data is transmited. I'm using the last version of Virtualbox to date (4.2.4) with Centos (6.3). Hopefully this will be fix in the next release.

TL;DR: If your VM is hanging and shows some network errors, check how many CPU you assigned to it, and if this is more than one, reduce it.

I posted this fix in English because I ran into this annoying situation and I wanted it to be available to more than my usual French audience, considering I didn't find that much info about it except this old entry in Virtualbox bugtracker.

15 nov. 2012

Windows VS Linux VS Mac, quel OS choisir pour le développement web.

Ça faisait un moment que je voulais lancer un sujet trolesque sur mon blog histoire de faire du trafic facile et aussi pour traiter d'un sujet de fond (c'est bien beau de balancer une astuce de temps à autre, mais parler des vrais sujets de sociétés, c'est quand même autre chose).

J'ai conscience de l'aspect hautement polémique d'un tel billet, en effet dans le milieu informatique tout ce qui touche à un choix tourne souvent à la guerre de religion.

Dans la vie on vous demande souvent de faire des choix, parfois de façon consciente et réfléchie et parfois par habitude ou parce que votre entourage vous y contraint un peu il peut arriver que l'arbitraire se retrouve biaisé. Les systèmes d'exploitation n’échappent pas à la règle et il est difficile de se débarrasser de ses habitudes avec le temps, c'est pourquoi j'ai décidé de partager mon opinion sur les 3 systèmes d'exploitation les plus communs sur lesquels vous pouvez être amené a travailler dans le cadre du développement web (il va de soit que je n'oserai vous conseiller quoi que ce soit dans le cadre de tout autre activité y compris l'utilisation personnelle, chacun ses goûts après tout).

Cet article s'adresse surtout au développeur(euse) débutant(e) qui se poserait éventuellement la question, mais même si vous êtes un vétéran sûr de son choix, ça ne coûte rien d'avoir un peu d'ouverture d'esprit.


7 sept. 2012

Surveiller votre système avec Glances

Le principal avantage d'un serveur Linux sans interface graphique c'est le minimalisme et l'optimisation de ressources, une couche graphique pouvant s’avérer gourmande alors que notre but c'est de faire tourner une application web, pas de faire un solitaire...

Toutefois il est toujours agréable d'ajouter un peu de couleur et des éléments visuels lorsque l'on monitor son serveur. Il existe la célèbre commande top, qui affiche la liste de processus en temps réel, mais l'absence de couleur rends la chose triste comme un jour sans pain (et les utilisateurs les plus avertis auront déjà supplanté celle-ci par htop).

Voici une nouvelle option : Glances. Ce programme est écrit en python et propose une interface similaire à htop en y ajoutant des fonctionnalités bien pratiques tel que l'activité sur les interfaces réseaux, l'occupation des disques... Le tout en couleur, permettant de voir d'un coup d'oeil les valeurs potentiellement critiques.


Notez au passage la présence de log lorsque des valeurs ressources atteignent un point critique (vous pourrez constater que mon script python est gourmand en ram... il va falloir optimiser tout ça).

Vous pourrez télécharger ce programme sur le github de l'auteur, ou si vous disposez de pip installer, tapez simplement pip install glances.

Merci à Freuh pour la trouvaille.

9 juil. 2012

Réplication MySQL : synchroniser les serveurs en minimisant l’indisponibilité du maître

Pour l'amour d'un dauphin
Je viens de m’apercevoir que je n'avais encore rien posté à propos de MySQL. Je corrige donc ce tort en partageant ici une note sur le processus permettant de répliquer un serveur en minimisant le temps d'innacessibilité du serveur maître. La procédure classique suggère habituellement d’arrêter le serveur maître, faire un backup avec mysqldump, importer le backup sur le (ou les) serveur(s) esclave(s), et enfin relancer le tout avec les paramètres de configuration appropriés.

Si l'on prends mon cas, j'ai un serveur MySQL dédié contenant plus de 300 Go de données et qui se doit d’être accessible (seul les redémarrages pour appliquer divers patchs le week-end sont tolérés). La procédure habituelle rendrait mon serveur indisponible pendant beaucoup trop longtemps pour que ça soit acceptable. Voici comment synchroniser un serveur maître et esclave en ne nécessitant qu'un seul redémarrage du maître.

21 juin 2012

Putty + Vim + Pavé numérique

Ah ce bon vieux Vim, cauchemar du néophyte, il a donné du fil à retordre  à plus d'un développeur, mais il se révèle assez puissant une fois la bête maîtrisée. Je vais partager une solution à un problème qui m'a longtemps pourri mon quotidien lors de l'usage de ce rustique éditeur.

S'il vous est arrivé de vous connecter à une machine unix via Putty et que vous avez tentez d'utiliser Vim, vous avez probablement constaté ne pas pouvoir utiliser le pavé numérique, obtenant un comportement étrange du curseur au lieu de voir les chiffres voulus s'afficher. En fait le problème ne vient pas de Vim, mais de Putty, qui est configuré par défaut en "application keypad mode", un mode permettant d'envoyer des commandes particulières à l'application plutôt que des chiffres.

Pour changer ce comportement, ouvrez les paramètres de Putty (Putty Configuration), naviguez jusqu'à Terminal > Features. Vous obtiendrez la fenêtre suivante :


Cochez la case "Disable application keypad mode", sauvegardez la session, et voilà. Ça ne mange pas de pain et ça simplifie le quotidien (en plus ça rime).

14 juin 2012

Pas de réseau après l'installation minimale de Centos 6

Si après une nouvelle installation en mode minimal de Centos 6 (sans GUI) il vous arrivait de ne pas pouvoir accéder à vos interfaces réseaux, cette note pourrait vous intéresser.

Je prendrais pour hypothèse que votre interface principale est eth0 et qu'un serveur DHCP attribue les adresses IP quelque part sur votre réseau.

Commencez par taper la commande dhclient eth0 dans votre shell, vous devriez obtenir une ip depuis le serveur dhcp, vérifiez le avec un ifconfig :
[root@localdev ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:4A:B5:3C
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe4a:b53c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1949 (1.9 KiB)  TX bytes:1731 (1.6 KiB)

Maintenant que vous avez un accès à Internet, profitez-en pour installer l'outil de configuration réseau avec la commande : yum install system-config-network-tui

Une fois installé rendez-vous dans le dossier /etc/sysconfig/network-scripts/,  vous y trouverez le fichier ifcfg-eth0 que vous allez ouvrir dans votre éditeur favoris. (Notez que votre adresse MAC sera différente de la mienne)
DEVICE="eth0"
HWADDR="08:00:27:4A:B5:3C"
NM_CONTROLLED="yes"
ONBOOT="no"
Vous pouvez alors effectuer les modifications suivantes :
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="08:00:27:4A:B5:3C"
NM_CONTROLLED="yes"
ONBOOT="yes"
Les modifications que j'y ai apporté sont l'ajout de la ligne BOOTPROTO="dhcp" pour activer la configuration de l'interface par le serveur DHCP, ainsi que le ONBOOT="yes" afin que l'interface soit activée au démarrage du système. Sauvegardez le fichier et redémarrez votre machine (avec un shutdown -r now des plus gracieux).

Votre serveur est maintenant connecté au démarrage, mission accomplie.

Dans le prochain post je vous expliquerai comment optimiser votre synergie corporate.

13 juin 2012

mount error: Cannot allocate memory sous Windows 7 via CIFS

Puisque je suis dans ma lancée, un autre post pour parler d'un problème complètement différent : le partage de fichiers depuis une machine sous Windows 7 vers une machine Centos (qu'elle soit physique ou virtualisée). Je ne couvrirais pas ici le détail du comment faire, certains l'ont déjà traité bien mieux que moi, mais je vais décrire une astuce si il vous arrive d'avoir votre dossier partagé innaccessible avec le message d'erreur suivant "mount error: cannot allocate memory" et que le seul moyen de la récupérer consiste à redémarrer votre machine Windows.

La solution consiste à modifier le fichier de registre (Touche Windows + R, tapez regedit.exe) et naviguez jusqu'aux valeurs suivantes :


HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\LargeSystemCache

Assignez-y la valeur 1. Puis même chose pour :

HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size

Où vous y assignerez la valeur 3, puis vous pouvez redémarrer.

Voilà, maintenant votre partage devrait être complètement stable. Un grand merci à l'auteur de ce billet original dont je me suis villement contenté de reprendre l'astuce.

12 juin 2012

Django: erreur ViewDoesNotExist

Django pony
Etant débutant sous Django il m'arrive de perdre beaucoup de temps sur des erreurs triviales (surtout une fois la solution sous les yeux). Je partage ici une erreur simple qui détient la palme du temps perdu jusqu'ici.

Lors de la création d'une nouvelle fonction dans mon fichier views.py, je me suis retrouvé face à une erreur ViewDoesNotExist at /myapp/edit ... Une erreur plutôt étrange étant donné que cette fonction edit est bel et bien existante dans mon fichier views.py dont voici un extrait :
# /myapp/views.py
from myapp.forms import EditUserForm

def edit(request):
    ''' Edit things to do stuff '''
    editUserForm = EditUserForm()
    return render_to_response('myapp/edit_user.html', {
        'editUserForm': editUserForm,
    }, context_instance=RequestContext(request))
une view plutot simple qui ne fait pas grand chose. Pourquoi donc ce message d'erreur, la vue étant bien présente ?

La réponse se trouve dans le fichier forms.py :
# /myapp/forms.py
from django import forms
from myapp.models import User

class User(forms.modelForm):
    class Meta:
        model = User

Vous avez remarqué ? Et oui, une erreur de typo bien bête ligne 5 : forms.modelForm au lieu de forms.ModelForm... Ca parait idiot vue comme ça, mais le message d'erreur n'aide absolument pas dans ce cas, vue que l'erreur n'était pas dans le fichier views.py mais dans forms.py. J'espère que les futures version de Django afficheront des messages d'erreur moins géneriques...

Bref cette erreur n'est pas très claire, ni très explicite, donc si vous vous trouvez face à ce problème n'hésitez pas à commenter ce que vous importez dans votre vue jusqu'a ce que ça marche (pensez-y au niveau des from blahblah import stuff aussi).

J'en profite au passage pour changer le design du blog, le fond noir étant passé de mode depuis la fin des années 90 je pense qu'il était temps que je dépoussière tout ça. J'ai aussi rajouté un petit outil javascript pour rendre mon code plus lisible sous blogger. En parlant de ça, je suis plutot surpris de voir comment l'outil a evolué, impressionnant toutes ces nouvelles fonctionnalités. Cela suffira-t-il a m'inciter à poster plus souvent ? La réponse dans le prochain post (ou pas).