2010-07-15 3 views
1

J'ai eu quelques problèmes avec FreeBSD et de grands mmaps. Linux ne montre pas les mêmes problèmes. Au démarrage du programme, il peut toujours obtenir la carte de 1 Go.Mises à jour FreeBSD 7.2 et 1 Go 32 bits

Cependant, il existe une opération de rechargement dans laquelle le fichier est remplacé et remappé. La nouvelle carte est généralement juste un peu plus grande à chaque fois, donc elle ne rentre pas parfaitement dans l'ancien emplacement mmap. Ce remap échoue souvent sur FreeBSD mais presque jamais sur Linux. (Il échoue sur les systèmes Linux plus souvent en utilisant ASLR. Utilise-t-FreeBSD ASLR?)

Je pense c'est parce que des bibliothèques de chargement d'autres bibliothèques ainsi que les allocations de mémoire effectuées au cours de l'exécution du programme qui fragmentent l'espace de mémoire virtuelle. Il y a probablement une certaine particularité de l'implémentation de mallocs de FreeBSD ou du chargement de la bibliothèque qui cause cela.

Je cherche des choses que je peux faire pour le rendre plus susceptible de fonctionner. Une chose que je considère est de toujours mmap un espace de 1 Go, même si la taille du fichier peut être de 890 Mo. Si je peux faire ce travail alors je vais toujours avoir un slot de 1 Go pour remapper le nouveau fichier de 895 MB.

+0

Avez-vous regardé 'login.conf (5)', en particulier 'memorylocked' et' vmemoryuse'? –

+0

@Nikolai: Ces limites ne sont pas définies. Le problème n'est pas des limites. Je sais parce que le mmap fonctionne toujours au démarrage du programme. –

+0

Quelle version de FBSD? –

Répondre

3

Le problème est probablement dû à l'absence d'un bloc d'espace adresse contigu. C'est très probablement sur un système 32 bits avec un mmap 1Gb. Envisagez d'utiliser des systèmes 64 bits exclusivement (la plupart des entreprises le font pour les serveurs de production maintenant) ou mmap() à la place plusieurs zones plus petites.

Vous n'allez pas contourner cela.

Questions connexes