GoldZone Web Hosting

Rédigé par Gaëtan Trellu (goldyfruit)

Outils pour utilisateurs

Outils du site


deux_trois_optimisations_c_est_toujours_ca_de_gagne

Deux, trois optimisations c'est toujours ça de gagné.

Viendra un moment ou votre serveur commencera à avoir “bobo” et ou vous commencerez à chercher à optimiser le moindre fichier de confifuration, le noyau, etc…

hdparm

Nous allons commencer par les disques durs, en effet certaines options ne sont pas activées par défaut, en les activants vous pourrez voir que des nettes différences peuvent se faire sentir au niveau des transferts, de la vitesse d'accès et d'autres petites choses qui feront que vous serez heureux d'avoir pris le temps de lire ces quelques lignes.

  • Avoir les caractéristiques du disque dur.
# hdparm -i /dev/hda

Résultat :

14:26 root@serveur ~# hdparm -i /dev/hda

/dev/hda:

 Model=HDS722580VLAT20, FwRev=V32OA60A, SerialNo=VNR81FC2S68X1L
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=52
 BuffType=DualPortCache, BuffSize=1794kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=160836480
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4
 DMA modes:  mdma0 mdma1 mdma2
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive conforms to: ATA/ATAPI-6 T13 1410D revision 3a:  ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6

 * signifies the current active mode
  • Informations sur le status de votre disque
# hdparm /dev/hda

Résultat :

14:27 root@serveur ~# hdparm /dev/hda 
/dev/hda:
 multcount    = 16 (on)
 IO_support   =  3 (32-bit w/sync)
 unmaskirq    =  1 (on)
 using_dma    =  1 (on)
 keepsettings =  0 (off)
 readonly     =  0 (off)
 readahead    = 256 (on)
 geometry     = 16383/255/63, sectors = 160836480, start = 0
  • Activation du DMA.

Le DMA, c'est la que ça devient intéressant. Si le DMA n'est pas activé le taux de transfert peut être divisé par trois.
Pour connaître le taux de transfert :

# hdparm -Tt /dev/hda

Résultat :

14:34 root@serveur ~# hdparm -tT /dev/hda

/dev/hda:
 Timing cached reads:   2856 MB in  2.23 seconds = 1283.57 MB/sec
 Timing buffered disk reads:  200 MB in  3.05 seconds =  65.52 MB/sec

Ici le DMA est bien activé car le taux est de 65.52MB par seconde ce qui est relativement bien.

Pour activer le DMA c'est simple, il suffit de faire ceci :

# hdparm -d1 /dev/hda

Résultat :

14:35 root@serveur ~# hdparm -d1 /dev/hda

/dev/hda:
 setting using_dma to 1 (on)
 using_dma    =  1 (on)
  • Le mode 32Bits.

Prise en charge du mode 32Bits, si le DMA est activé vous ne verrez quasiment aucunes différence mais vous pourrez toujours l'activer pour une meilleure syncro avec les récents chipsets.
Cette options est réprésentée par la ligne IO_support = 3 (32-bit w/sync) en sortie de commande hdparm /dev/hda

Activer le mode de transfert 32Bits :

# hdparm -c3 /dev/hda

Résultat :

14:40 root@serveur ~# hdparm -c3 /dev/hda

/dev/hda:
 setting 32-bit IO_support flag to 3
 IO_support   =  3 (32-bit w/sync)
  • Le support du multicount.

En passant le multicount à 16 voir 32 pour certains disques celui-ci pourra envoyer 16 secteurs simultanément ou 32 si votre disque le supporte.
La vitesse de transfert peut se voir augmenter de 50% !

Pour savoir quelle valeur mettre (16 ou 32) il suffit de regarder le résultat de la commande hdparm -i /dev/hda
La ligne qui nous intéresse est la suivante :

BuffType=DualPortCache, BuffSize=1794kB, MaxMultSect=16, MultSect=16

Et plus particulièrement MaxMultSect=16

Activer le multicount :

# hdparm -m16 /dev/hda

Résultat :

15:19 root@serveur ~# hdparm -m16 /dev/hda

/dev/hda:
 setting multcount to 16
 multcount    = 16 (on)
  • Le support de l'unmaskirq.

Cette option est à utiliser sur un système récent ou alors vous êtes seul(e) responsables des possibles dégats, elle permet de passer outre les interruptions c'est à dire qu'elle évite d'attendre qu'une ecriture/lecture soit finie avant de commencer autre chose.

Activer l'umaskirq :

# hdparm -u1 /dev/hda

Résultat :

15:30 root@serveur ~# hdparm -u1 /dev/hda

/dev/hda:
 setting unmaskirq to 1 (on)
 unmaskirq    =  1 (on)
  • Support du cache en écriture.

Utiliser le cache en écriture de votre disque dur apporte des performances en plus mais attention utiliser cette option sur un système de fichier non journalisé peut apporter une perte des fichiers en cours d'écriture en cas de coupure.

Activer le write buffer :

# hdparm -W1 /dev/hda

Résultat :

16:06 root@serveur ~# hdparm -W1 /dev/hda

/dev/hda:
 setting drive write-caching to 1 (on)

Pour avoir la liste des options disponibles avec hdparm :

# hdparm --help
  • hdparm au lancement du serveur.

hdparm ne garde pas les paramètres en mémoire ce qui signifie qu'au prochain reboot vous devrez refaire la démarche d'optimisation.
Pour éviter ceci vous pouvez créer un script qui s'occupera de ça au lancement du serveur, vous pouvez aussi modifier le fichier hdparm.conf qui se trouve dans /etc mais je ne le trouve pas pratique pour un novice, puis l'ajouter au runlevel.

Le script que j'utilise (nommé hdparm) :

#!/bin/sh
 
# Affiche Optimisations hdparm : à l'écran.
echo "Optimisations hdparm :"
 
# Optimisations.
/sbin/hdparm -q -d1 -c3 -m16 -W1 -u1 /dev/hda
 
# Affiche Terminé. à l'écran.
echo "Terminé."

-q = Modifications effectuées en silence.

Ajout du script au runlevel :

update-rc.d hdparm defaults

Voila c'est fini pour hdparm, ça vous a plus ?

Les sources Debian.

Les sources du noyau se trouvant dans la branche de Debian sont patchées pour corriger des bugs, des trous de sécurités, etc…
Je ne dis pas qu'en utilisant celles-ci vous obtiendrez de meilleures performances mais vous n'aurez pas besoin de patcher votre noyau vous même.

Une petite recherche sur les noyaux disponibles dans votre petite Sarge :

# aptitude search linux-source-2.6

Résultat :

0:13 root@mysql ~# aptitude search linux-source-2.6
v   linux-source-2.6                                 -
p   linux-source-2.6.14                              - Linux kernel source for version 2.6.14 with Debian patches
p   linux-source-2.6.15                              - Linux kernel source for version 2.6.15 with Debian patches
p   linux-source-2.6.16                              - Linux kernel source for version 2.6.16 with Debian patches
p   linux-source-2.6.17                              - Linux kernel source for version 2.6.17 with Debian patches

Installer les sources pour le noyau 2.6.17 :

$ aptitude install linux-source-2.6 bzip2 libncurses5-dev

Les sources se trouveront dans /usr/src

scheduler

Le shelduler varie suivant l'utilisation de votre serveur, pour un serveur dédié à l'hébergement il est préconiser d'utiliser l'ordonnanceur CFQ à un Deadline ou à un Anticipatory.
Vous pouvez modifier le IO Schelduler dans votre noyau ou une fois le noyau compilé.

Dans le noyau :

Une fois le noyau compilé :

# cd /sys/block/hda/queue
# echo "cfq" > schelduler

Pour vérifier que CFQ est bien votre nouveau schelduler :

# cat /sys/block/hda/queue/scheduler

Résultat :

16:30 root@serveur ~# cat /sys/block/hda/queue/scheduler
noop anticipatory deadline [cfq]

Le timer du noyau.

En modifiant la fréquence du timer vous influez sur l'ordonnanceur système, c'est à dire que plus vous augmentez cette fréquence (1000hz maximum) plus votre système sera réactif mais attention rendre plus réactif votre système incite votre processeur à passer plus de temps sur certaines tâches.

Par défaut depuis le noyau 2.6.13 le timer est à 250hz ce qui est un bon choix pour un serveur multiprocesseur, pour un serveur uniprocesseur il est recommandé d'utiliser le timer 100hz mais l'utilisation du 250hz est un bon compromis. Ne pas dépasser en Hz la moitié de la fréquence du processeur en MHz. Pour les serveurs de jeux un timer 1000hz est recommandé.

La modification du timer se fait directement dans le noyau, section “Processor Type and feature” puis “Timer frequency”.

Pour connaître le timer de votre noyau il suffit de taper ceci :

# zcat /proc/config.gz | grep HZ

Si cette commande ne passe pas essayez celle-ci :

# cat /usr/src/linux/.config | grep HZ

Résultat :

17:32 root@serveur ~# zcat /proc/config.gz | grep HZ
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250

Linux et la préemption.

En activant la préemption dans le noyau Linux vous rendez votre système plus réactif, en effet cela rend votre noyau multitâche.
La préemption permet au noyau de gérer les processus en fonction de leur charge.

Sur un serveur LAMP (Linux Apache MySQL PHP) vous pouvez activer la préemption suivant la charge du serveur.

Un petit exemple :

Si le processus numéro 1 demande beaucoup de ressources le noyau peut clore ce processus pour laisser la place à un processus numéro 2 ayant besoin des ressources à ce moment précis.

Voila pourquoi j'ai précisé que vous pouviez activer la préemtion sur un serveur LAMP suivant la charge de celui-ci.

Pour activer le mode préemptif ça se passe dans le noyau, section “Processor Type and feature” puis “Preemption Model”.

Pour savoir si la préemtion est activée sur votre système c'est simple :

# zcat /proc/config.gz | grep HZ

Si cette commande ne passe pas essayez celle-ci :

# cat /usr/src/linux/.config | grep HZ

Résultat :

18:51 root@serveur ~# zcat /proc/config.gz | grep PREEMPT
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y

L'option Use register arguments

Je donne cette astuce car c'est toujours un optimisation en plus.
Elle apporte un gain de performance très modeste de l'ordre de 0.1% à 1% (je vous l'avais dis hein ;-)).

Concrétement elle diminue les temps d'accès du noyau mais en contre-partie elle peut générer certains problèmes avec la compilation de module externe au noyau n'étant pas préparer pour être compilé avec cette option (NVIDIA et ATI passent quand même).

L'activation de cette option se passe dans la section “Processor Type and feature” du noyau.

deux_trois_optimisations_c_est_toujours_ca_de_gagne.txt · Dernière modification: 2011/01/05 16:05 (modification externe)