Citation:
Envoyé par
Bktero
J'ai trouvé la démonstration intéressante sur le principe, ça m'a permis de découvrir l'overcommiting, de revoir des notions de gestions de la mémoire sous Linux qui accepte d'allouer plus de mémoire qu'il n'en existe, ...
L'overcommitting n'est pas spécifique à Linux mais existe avec à peu près tous les Unix. De plus, tous les OS classiques (hors exceptions exotiques donc) permettent d'allouer plus de mémoire que la mémoire physique.
Citation:
Je dis bien "sur le principe" car après quelques lectures sur le net, j'ai l'impression que la situation que tu as créée ressemble à :
"Hey les mecs ! J'ai construit un couloir de 100m de long pour rester l'étirement de mon élastique.
Par contre, comme l'élastique pète si on l'étire de plus de 5m, on ne l'étirera pas de plus de 3m pour ne pas prendre de risque..."
Pas tout à fait. L'idée est bien de présenter un couloir de 100 m de long, mais dont on sait n'avoir besoin que de tronçons éparpillés sur les 100m et dont la longeur cumulée ne va pas dépasser quelques mètres.
Citation:
Parlons du principe d'overcommiter la mémoire. Si j'ai bien compris, tu désactives juste la protection de l'OS servant à contrôler la taille de la mémoire allouée. Ainsi, la quantité de mémoire n'est pas vérifiée et ton programme n'est pas tué au démarrage. Ce n'est qu'une réserve potentielle, puisque la limite réelle est donnée par la RAM et le swap. Tant que la mémoire réellement disponible n'est pas entièrement consommée, il n'y a pas de soucis ; dans le cas contraire, l'OOM killer s'active et tue des programmmes.
C'est exactement cela. Pour être franc, je suis un farouche adversaire du principe de l'OOM killer.
D'ailleurs, je travaille le plus souvent sous Solaris où l'overcommiting est possible mais uniquement au niveau de l'allocation d'un bloc mémoire, pas de manière globale comme avec Linux. Il n'y a donc pas d'OOM killer avec Solaris. Ceci permet d'éviter qu'un processus qui n'a rien demandé se fasse tuer.
Citation:
Parlons maintenant du programme. Tu alloues un espace gigantesque (nécessitant à un adressage sur 64 bits et non 32 bits) sachant pertinemment que tu ne pourras pas l'utiliser. Ça tombe bien que le fichier utilisé soit, pour le coup, seulement de 800 Mo.
Je n'alloue rien en fait, je déclare juste un tableau d'une taille gigantesque. La question initiale avait défini des limites en terme de paragraphes, lignes et caractères. Comme j'ai configuré l'OS pour overcommiter la mémoire je n'alloue (et ne réserve) rien du tout. C'est lors de l'écriture des données que quelques zones éparses du tableau gigantesque vont correspondre à de la "vraie" mémoire virtuelle.
Citation:
Si le fichier grossi, cela étant probable puisqu'il y a un pire cas qui n'est pas atteint, alors le programme plantera (d'autres programmes pour être OOM-killed ?).
La question initiale ne dit pas que le fichier va grossir mais qu'il a une taille de 800 Mo, donc je ne m'inquiète pas trop car j'ai 4 Go de mémoire virtuelle disponible.
Bien sûr, rien ne m'empèche d'ajouter du swap pour être sûr que la totalité du tableau tiendra en mémoire virtuelle. Dans ce dernier cas, la version avec des pointeurs est (légèrement) moins optimisée en terme d'utilisation mémoire que le tableau, puisqu'en plus des données, il faudra aussi gérer les pointeurs vers les lignes et les paragraphes.
Citation:
Si j'ai bien tout compris, tu as fait un programme plus performant qui plantera de façon plus ou moins aléatoire en fonction de la taille du fichier d'entrée et de l'occupation mémoire du système..... Cool.
Non, il suffit juste d'avoir un swap correctement dimensionné pour éviter les plantages. L'espace disque est beaucoup moins cher que la RAM. Rien n'interdit d'avoir 60 Go de swap.
Citation:
Au final, je te dis merci de m'avoir montré le principe de l'overcommitting (ce n'est pas ironique hein ! ça m'aura appris des choses ! :) ) mais qui ne me semble absolument pas être une solution adaptée au problème.
Il s'agit d'un solution adaptée au problème décrit, qui est de mettre 800 Mo de données dans une tableau de 60 Go et envisageable avec un PC de base. C'est aussi une occasion d'utiliser l'overcommitment mais ce dernier n'est absolument pas un prérequis. Il suffit juste d'avoir suffisamment de swap (disque).