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.

  2 Responses to “Tuning de serveur hautes performances”

  1. Cette manitulation à permi de réduire le load average de 45 à 2 sur un serveur web (Sans modifications au niveau des demandes.)

  2. Le script d’inspection memoire ne fonctionne pas sur les machines ayant de la mémoire fixe (c’est à dire soudée à même la carte et non sous forme de barettes)

Sorry, the comment form is closed at this time.