par jdh » 20 Mars 2012 00:45
La taille de swap ?
Avant de discuter, je voudrais revenir sur ce que je sais de l'objectif et du fonctionnement swap.
* objectif du swap :
=> compléter la mémoire en cas de besoin = s'il n'y a pas assez de mémoire vive.
Pourquoi la mémoire vive ne serait pas suffisante ? Parce que les programmes sont dynamiques : ils reçoivent une qté de mémoire, mais peuvent en avoir besoin de plus = ils demandent au système de la mémoire supplémentaire. Par exemple un moteur de base de données peut avoir en cas de charge importante besoin de plus de mémoire, un serveur web en fonction du nombre de requêtes, un tableur qui charge des fichiers avec 10 sur 10 puis avec 2500 sur 20 et avec 12 colonnes calculées, ...
* fonctionnement :
décrit dans le lien wikipedia fourni, en résumé :
- découpage de la mémoire en pages,
- gestionnaire de pages : envoi de pages vers le swap, récupération de pages depuis le swap,
- nécessité d'une stratégie : qui doit aller dans le swap, qui doit revenir, ...
* problèmes :
- le gestionnaire doit interrompre les programmes en attente de chargement ou en écriture,
- la vitesse de la mémoire swap est d'environ 3000 fois moins rapide que la mémoire vive,
- que faire si on sature les deux ?
- comment sizer ? (le problème d'origine)
NB : Le principe du swap existe aussi pour un OS tel Windows !
Le sizing
Historiquement, le swap a été créé quand on disposait de peu de mémoire vive.
Il a de l'intérêt quand on a le besoin : un desktop peu chargé n'a pas ou peu de besoin, un serveur avec un service de BD chargé peut en avoir besoin.
=> un PDP 11/73 qui a servi à créer Unix dispose de 4 Mo de mémoire (oui !)
Au milieu des années 80, on recommande la règle swap= 2x mémoire vive.
Ce qu'il faut considérer, c'est le besoin : sans swap, si on sature la mémoire, bing (en fait non, car il y a des mécanismes pour killer des process !)
Un noyau Linux est facile à imaginer : vmlinuz est la version compressée du noyau, initrd.img contient le minimum en terme de file system, modules, ..., puis il faut charger les modules (non minimum), puis créer des buffers pour tous les disques, cartes réseaux, pilotes, ...
Un noyau Linux 3.0 ça doit tenir en moins de 20 à 30 Mo : des systèmes embarqués peuvent se contenter de 64 Mo avec interfaces web, ...
Donc avec un Linux en 64 bits, avec plus de 4 Go de mémoire (limite 32 bits), a-t-on encore besoin d'un swap ?
Ma réponse est "oui par sécurité" mais limité à quelque chose de raisonnable !
Si je créé un serveur "outils" (amp + quelques applis web + partage samba + bind/dhcp), je vais avoir besoin de 2 Go de mémoire et un cache de 512 Mo est suffisant.
Si je créé un serveur "bd" (mysql ou postgresql pour accès distant), avec 4 Go de mémoire et 1 Go de cache on doit pouvoir travailler sur des bases de ~50 Go voire 100 Go.
Créer un cache de plus d'1 Go me semble avoir peu d'intérêt, parce qu'il en faut du temps pour lire sur un espace d'1 Go.
Lire 32 ko ou 64 ko, on s'en fout, mais lire 700 Mo de données c'est un film divx, et vous connaissez le temps de copie d'un répertoire vers un autre.
Néanmoins, un serveur LSTP est un serveur "terminal" : chaque utilisateur ouvre une session sur le serveur et lance un desktop à la manière de TSE. Donc cela exige de la mémoire qui va être fluctuante avec le nombre de sessions ouvertes et de la charge crée. J'aurais tendance à créer un swap de 2 ou 4 Go pour ne pas crasher : quand le serveur va commencer à ralentir, il utilisera du swap et restera dispo, on pourra faire fermer les utilisateurs correctement car même lent il restera dispo, et ce qui comptera sera que les process ne soient pas killés n'importe comment.
L'intelligence artificielle n'est rien à côté de la stupidité naturelle.