Nov 172012
 

Ce matin, mon écran Samsung 2233RZ s’est éteint.
J’ai abord cru a un problème de carte graphique, puis à un problème de câble mais en éclairant l’écran avec une lampe puissante, l’image apparaissait sur la dalle.
Le rétroéclairage ne fonctionnait plus que faiblement et seulement pendant environ 1 seconde et après l’allumage (mise en sécurité).

Après démontage de l’écran, (difficile à cause de saloperies de clips en plastiques dont la plupart se sont cassés (bravo samsung, les vis sont trop chères ? ou est-ce une intention délibérée de rendre le truc non-réparrable ?) Je constate que l’écran est en 3 parties: La dalle, une carte ‘logique’ et une carte d’alim qui comprends l’inverter du rétroéclairage.

Première inspection : Le PCB est un peu marron par endroits, ce qui prouve que même si ça n’est pas forcément la cause de mon problème, la machine est mal conçue et il y a des point trop chauds.
Étonnement, les condensateurs (marqués max 120°C) sont en parfait état (apparent) alors que la bakélite brunit à des températures plus élevées. Par précaution, je les change. mais le problème n’est pas résolu. La secondes pièce suspecte est la puce de mosfets au dos de la carte. Cependant, je remarque qu’une seule des deux lampes à cathode froide fonctionne alors que le transformateur n’a qu’un seul enroulement primaire et 2 secondaires.
J’ai inversé le branchement des deux lampes, visiblement, ce n’est pas un défaut de la lampe.

J’ai donc supposé un composant claqué (problème d’isolement) dans les sécurités et la boucle de feedback.
J’ai donc déconnecté les composants reliant la HT à la boucle de feedback (varistors 3kV et 6kV). Sans aucune amélioration.

Faute de meilleure piste j’ai donc fini par dessouder le transformateur.
Sur les premiers tests, il semblait marcher : pas de fil coupé : 0.3 Ohm pour le primaire et environ 1 kOhm pour les enroulement secondaires.

Je l’ai donc testé en mettant de petites lampes au néon sur les secondaire et en envoyant quelques pulses au primaire. Les deux lampes marchaient. Ne comprenant pas, j’ai ressorti une vieille cold-cathode que j’avais récupérée dans un vieil écran et la surprise. L’enroulement suspect ne produit qu’une très légère luminescence à l’extrémité alors que l’autre enroulement fait flasher tout le tube. C’est donc bien le transformateur HT qui a un enroulement de mort. J’imagine qu’il y a un défaut d’isolement dans le transfo qui réduit sa tension de sortie à quelques centaines de volts plutôt que quelques milliers. C’est quand même étrange que cet enroulement ne soit pas franchement coupé ou en court-circuit (résistance ohmique similaire à l’autre) mais révèle un défaut à l’usage.
Je ne saisis pas non plus comment une pièce pareille peut lâcher après 2 années de fonctionnement mais apparemment il y en a pas mal en vente sur ebay, donc ça doit arriver relativement souvent.

La pièce est commandée. (fournisseur chinois)
3 semaines plus tard, pièce reçu.
10 minutes plus tard, ça fonctionne.

Le boiter plastique a été un peu dur à refermer. je m’en suis sorti avec un peu de colle car une partie de clips en plastique avaient été cassé au moment de l’ouverture.
Cet écran est reparti pour quelques temps.

Gestion de l’horloge Linux

 Trucs et astuces techniques  Commentaires fermés sur Gestion de l’horloge Linux
Sep 272012
 

Il y a deux horloges principales dans un système Linux :

L’horloge machine : Il s’agit de l’horloge utilisant un quartz dédié (généralement identique à ceux d’une montre bracelet) Cette horloge fonctionne d’une manière indépendante des programmes et même lorsque la machine est éteinte. elle a une précision de l’ordre de la seconde.
A divers endroits cette horloge est communément appelée l’horloge machine (« hardware clock »), l’heure temps réelle (« real time clock »), le RTC, l’horloge BIOS ou l’horloge CMOS.

L’horloge système : C’est l’horloge gérée par le noyau Linux et contrôlée par un timer. (Attention, Linux peut utiliser plusieurs clocksource différentes selon la configuration)
L’heure système est le nombre de secondes écoulées depuis Epoch (le 1er janvier 1970 00:00:00 UTC)
L’heure système est initialisée avec la valeur de l’horloge machine au démarrage de Linux, l’horloge machine n’est ensuite plus utilisée.
Le timestamp unix a la structure suivante :

struct timeval {
   time_t      tv_sec;     /* secondes */
   suseconds_t tv_usec;    /* microsecondes */
};

On peut remarquer que le timestamp est toujours UTC. C’est seulement au moment de l’affichage que l’on calcule la date et l’heure locale en tenant compte de la timezone (fuseau horaire plus ajustement heure d’été/d’hiver). Attention la timezone est une variable d’environnement et un ensemble de règles du paquet tzdata. Il existe une structure timezone historique qui est obsolète

struct timezone {
int tz_minuteswest; /* minutes à l'ouest de Greenwich  */
int tz_dsttime;     /* type de changement horaire      */
};

l’argument tz doit en général être NULL. Le champ tz_dsttime n’a jamais été utilisé sous Linux, il n’a jamais été géré, et ne le sera jamais par la libc ou glibc.

la fonction gettimeofday() retourne le timestamp.

Historiquement le timestamp est 32bits () mais sur debian squeeze 64 bits

sizeof time_t = 8
sizeof suseconds_t = 8

Ce sont donc « déjà » des entiers 64 bits signés.

Pour corriger la dérive de l’horloge, il existe une fonction adjtime() qui ajuste graduellement l’horloge système en l’accélérant ou la ralentissant à un rythme constant de 0.5ms/s.

int adjtime(const struct timeval *delta, struct timeval *olddelta);

si delta est NULL olddelta est peuplé avec le temps à ajuster restant.

La commande ntpdate utilise adjtime() si l’écart entre l’horloge locale et l’horloge de référence est inférieur à +-128 ms. Cela permet de recaler l’horloge tout en gardant un timestamp monotone. (qui ne reviens jamais en arrière et sans saut dans le futur) Au delà, comme il faudrait plus de 5 minutes pour recaler l’horloge , celle ci est réglée de façon abrupte.
Tout nouvel appel à adjtime avec un décalage non NULL conserve le décalage déjà effectué mais fait perdre le décalage restant à faire.
L’utilisation de ntpdate pendant la période d’ajustement induit de légères erreurs de mesure du delta à cause du fait que l’horloge est déjà en cours d’accélération ou de ralentissement. Il vaut donc mieux attendre que adjtime ait fini avant de faire à nouveau appel à ntpdate.

Enfin il exite une fonction permettant de modifier de façon permanente la derive de l’horloge soft.
by adjusting the rate at which the system time is advanced with each timer interrupt, using adjtimex(8).

Raid 3ware Rebuild

 Trucs et astuces techniques  Commentaires fermés sur Raid 3ware Rebuild
Déc 082010
 

Dans tw_cli , commencer par retirer le disque defaillant avec

/cx/px remove

Remplacer le disque (ou pas) puis rescanner le disque avec

/cx rescan

enfin lancer le rebuild avec

/cx/ux start rebuild disk=n

avec n le numero du port px où est connecté de disque (La doc n’est absolument pas claire à ce sujet)

Sep 142009
 

Si vous avez un gros serveur dédié dans un datacenter très connu. Allez lachons le morceau : Si vous avez un bi-xeon Quad core chez OVH. Il se peut que vous soyez déçu par les performances.

Dans la plupart des cas, ce manque de performances est du à une mauvaise configuration de la RAM.
Sur les machines qui ont beaucoup de coeurs, la bande passante mémoire est primordiale.

Voici donc comment faire quelques benchs de la bande passante mémoire.

Ci dessous un petit code C (membench.c) qui passe son temps à écrire et lire dans la RAM

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 #define nbbank 64
 5 #define banksize 1048576
 6 #define banktype int
 7
 8 int main (void)
 9 {   banktype * ptr[nbbank];
10  banktype * p;
11  unsigned int i=0;
12  unsigned int j=0;
13         banktype c=0;
14  unsigned int nbelements;
15
16  nbelements = banksize / sizeof(banktype);
17
18  for ( i=0 ; i<nbbank ; i++ )
19  {        ptr[i] = (banktype *) malloc( nbelements * sizeof(banktype) );
20          if ( ! ptr[i] )
21          {       fprintf(stderr , "erreur alloc memoire");
22                         return 1;
23                 }
24         }
25
26         while (1)
27         {       c++;
28                 for ( i=0 ; i<nbbank ; i++ )
29                 {       p=ptr[i];
30                  for ( j=0 ; j< nbelements ; j++ )
31                         {       p[j] = c;
32                         }
33                 }
34
35                 for ( i=0 ; i<nbbank ; i++ )
36                 {       p=ptr[i];
37                  for ( j=0 ; j < nbelements ; j++ )
38                         {       if ( p[j] != c )
39                                 {       fprintf(stderr , "erreur mutation memoire");
40                                         return 1;
41                                 }
42                         }
43                 }
44                 fprintf(stdout,".");
45                 fflush(stdout);
46         }
47 }

puis un petit script de lancement (bench.sh)

#!/bin/bash

nb=$1
gcc -O3 main.c -o bench.bin

(
while true ; do
 echo -ne "\n1---5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100"
 for j in $(seq 5) ; do
  echo 
  sleep 1
 done
done
) &
p=$!

for i in $(seq $nb) ; do 
  ./bench.bin &
done

read l
killall bench.bin
kill -9 $p

Tout d’abord inspecter la type de carte mère avec dmidecode

for i in baseboard-manufacturer baseboard-product-name baseboard-version ; do 
   dmidecode -s $i
done

dans mon cas j’obtient

ASUSTek Computer INC.
DSEB-D16/SAS
Rev 1.xxG

Rendez vous donc sur le site du constructeur et lancez le download du manuel.
Pendent ce temps inspectez la version du bios

dmidecode -s bios-version

et comparez avec le site du constructeur. Le cas échéant, demmandez à votre hebergeur de mettre le bios à jour. (Attendez quand même d’avoir fait la suite au cas où il faudrait lui faire faire plusieurs manipes en même temps)

Maintenant, inspectez la répartition des barrettes mémoire

dmidecode memory | 
grep -E '(Size|Bank|Locator:)' | 
grep -v -E '(Runtime|ROM|Maximum|Minimum|Range)' | 
sed 's/^\t*//g' | 
grep -v '^Installed Size' |
sed 's/ /_/g ; s/:_/ /' |
while read f v ; do 
   if [ "$f" = "Size" ] ; then echo ; fi
   echo -n " $v"
done | 
sed 's/^ //' |
grep -v '^$' | 
awk '{print($3" "$2" "$1)}' 

Ce qui dans mon cas donne

BANK0 DIMM_00 No_Module_Installed
BANK0 DIMM_01 2048_MB
BANK0 DIMM_02 No_Module_Installed
BANK0 DIMM_03 No_Module_Installed
BANK1 DIMM_10 No_Module_Installed
BANK1 DIMM_11 2048_MB
BANK1 DIMM_12 No_Module_Installed
BANK1 DIMM_13 No_Module_Installed
BANK2 DIMM_20 2048_MB
BANK2 DIMM_21 No_Module_Installed
BANK2 DIMM_22 No_Module_Installed
BANK2 DIMM_23 No_Module_Installed
BANK3 DIMM_30 2048_MB
BANK3 DIMM_31 No_Module_Installed
BANK3 DIMM_32 No_Module_Installed
BANK3 DIMM_33 No_Module_Installed

Allez ensuite vérifier dans le manuel de la carte mère que cette configuration est correcte pour des performances optimales : Horreur ! Eh ben non! evidemment dans une telle configuration la mémoire ne peut pas fonctionner en double canal car il n’y a pas symétrie parfaite entre les quatre banques.
Appelez donc votre hebergeur et dites lui de vous mettre les barettes comme suit :

BANK0 DIMM_00 2048_MB
BANK0 DIMM_01 No_Module_Installed
BANK0 DIMM_02 No_Module_Installed
BANK0 DIMM_03 No_Module_Installed
BANK1 DIMM_10 2048_MB
BANK1 DIMM_11 No_Module_Installed
BANK1 DIMM_12 No_Module_Installed
BANK1 DIMM_13 No_Module_Installed
BANK2 DIMM_20 2048_MB
BANK2 DIMM_21 No_Module_Installed
BANK2 DIMM_22 No_Module_Installed
BANK2 DIMM_23 No_Module_Installed
BANK3 DIMM_30 2048_MB
BANK3 DIMM_31 No_Module_Installed
BANK3 DIMM_32 No_Module_Installed
BANK3 DIMM_33 No_Module_Installed

Dans mon cas, les DIMM 0 de chaque banque étaient repérés en blanc sur la carte mère. n’hésitez pas à mentionner ces détails à votre hebergeur, ils ont parfois la tête dure.

Remarquez que pour une configuration 12Go de RAM il faut employer 4x2Go + 4x1G de façon à conserver la symetrie et non 6x2Go comme que j’ai souvent vu. Le plus simple reste de fonctionner avec 8 ou 16Go de RAM mais pas de solutions intermédiaires.