Aller au contenu | Aller au menu | Aller à la recherche

Impossible de faire un malloc de 512 Megas ???

Rahlala, encore une fois, la foule en délire réclame un avis d'expert sur un problème technique qui leur fait faire des cauchemards la nuit, qui leur coupe l'appétit, voire qui les perturbe en jouant a leur shoot-them-all préféré (ne nous affollons pas pour autant, avec les poke qui vont bien, leur vaisseau ne craint pas grand chose d'autre qu'un tag ou deux sur l'arrière des tuyères d'échappement).

Le problème peut encore une fois se résumer dans un code C fort simple:

#include <stdio.h>
#include <stdlib.h>

#define MEGA 1024*1024
#define VALUE 512

int main(void){
	char *p;

	p=malloc(VALUE*MEGA);
	if(p != NULL){
		printf("Malloc ok
");
		free(p);
	}else{
		printf("Malloc failed
");
	}

	return EXIT_SUCCESS;
}

Soit un bete programme qui tente d'allouer VALUE MegaOctets (il est aujourd'hui formellement interdit de troller sur la valeur réelle d'un MegaOctet, notre équipe technique aura ici volontairement choisi 1 Ko == 1024 Octets pour des raisons qui devraient vous paraitre évidentes d'ici la fin de cet article), et qui nous dit "ok" ou "pas ok" (notez bien que le programme aurait aussi pu dire "mayo" ou "ketchup", voire "brandade de morue" ou "blanquette de veau à l'ancienne", mais on est ici dans un blog sérieux, avec des tests réalisés par une équipe de professionel (non, il n'y a pas de faute a "professionel", l'équipe étant essentiellement composée d'une personne), donc le programme répond "ok" si le test est ok, ou "failed" (qu'on peut traduire par "échoué", pour les plus anglophobes) si le test a échoué).

Attention !!!

Comme d'habitude, le développement et l'éxecution des programmes fournis ici sont fait par des professionels, en environnement de laboratoire, avec un gros bouton rouge d'urgence, les pompiers sur le qui-vive, une infirmière aux gros seins prete à faire de la réanimation d'urgence, et un agent d'assurances qui sue des gouttes grosses comme mon poing (et pas seulement parcequ'il a une vue plongeante sur le décolleté de l'infirmière), NE FAITES PAS CA CHEZ VOUS LES ENFANTS !!!!!! (sauf éventuellement profiter du décolleté d'une infirmière de passage, mais ca c'est votre vie privée, hein, ca me regarde pas).

Il se trouve que, après plusieurs tests, la limite évidente a partir de laquelle le programme répond "failed" est 512 (donc 512 MégaOctets), sur une machine disposant pourtant d'1 GigaOctet (le double, donc) de RAM, 2 GigaOctets de SWAP, et n'ayant pas de compilation d'OpenOffice en cours......

Premier test évident, refaire la meme expérience en tant que root, on obtient le même résultat..... La tentation est bien évidemment grande d'aller directement regarder le code source de malloc(3), mais il y a peut etre finalement un autre test plus simple à faire en premier:

vanhu@darkstar $ ulimit
unlimited
vanhu@darkstar $

Damned, un vieux gars en cape toute miteuse m'a pourtant encore dit ce WE de me fier a la Force.... On m'aurait menti ??

Peut etre pas:

vanhu@darkstar $ ulimit -a
.....
data seg size           (kbytes, -d) 524288
.....

524288..... curieusement, équivalent à 512*1024, et représentant un nombre de kilooctets.....

Un premier test permet de rapidement se convaincre que ca influe effectivement: il suffit de faire un ulimit -d <511*1024>, et la, pouf, ca ne fonctionne plus avec VALUE a 511, alors que ca marchait encore il y a 2 minutes, et que ca fonctionne toujours dans le shell d'a coté ou on a pas fait cette commande magique.....

La suite du test est normalement "simplement" de faire un ulimit -d <520*1024> et la, pas de bol, il se trouve qu'on ne peut pas "gonfler" les limites (heureusement....), et que la comme ca, j'ai pas que ca a faire d'aller retrouver le fichier de conf dans /etc ou on met les valeurs par défaut, juste pour quelques noobs qui se posent des questions a 2 balles et qui connaissent meme pas ulimit.....

C'etait bien la peine de me déranger pour ca, c'est bien parceque je n'avais pas encore fait mon billet du mois, tiens !

Commentaires

1. Le lundi, mai 21 2007, 14:20 par Jon

Pour éviter toute ambiguité, on peut utiliser les préfixes de l'IEC pour les quantités d'octets (kibi-, mibi-, etc...). http://en.wikipedia.org/wiki/Kibi#I...

Seul inconvénient, l'infirmière blonde risque de ne plus rien comprendre (forcément, avec juste 2 neurones - un dans chaque nichon, on peut pas aller bien loin).

2. Le lundi, mai 21 2007, 14:34 par Jon

le fichier à modifier est /etc/boot.conf. Il suffit de rajouter une ligne :

kern.maxdsize=1G

et de rebooter.
(source: http://lists.freebsd.org/pipermail/...)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet