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”
Sorry, the comment form is closed at this time.
Cette manitulation à permi de réduire le load average de 45 à 2 sur un serveur web (Sans modifications au niveau des demandes.)
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)