Bonjour,
Je suis en train de développer une application qui tournera sur un cluster de "beaucoup" de machines (pour faire de la simulation numérique), avec une couche MPI.
Précisément, je finalise la partie I/O disque (je dois faire des sauvegardes régulières).
Les données du problème se situent toutes dans un gigantesque fichier partagé entre tous les noeuds. Cependant, chaque noeud du cluster travaille sur des parties disjointes des données
Mon problème :
actuellement, j'utilise mmap dans chaque processus afin d'accéder au fichier efficacement (le mécanisme derrière mmap étant intelligent, l'utilisation mémoire est très faible, c'est l'idéal).
Or, de temps en temps, je dois faire des sauvegardes des données.
Or, il n'y a aucune raison que, lorsqu'un processus écrit une des pages sur le disque pour mettre à jour ses données n'écrase pas une partie des données venant d'être écrites par un autre processus ! En effet, les processus travaillent sur des données disjointes, mais le découpage en pages peut chevaucher la zone de plusieurs processus... !
Je me demandais donc si vous avez une idée pour pallier à ce problème. J'ai pensé à plusieurs solutions, qui ne me satisfont pas :
- Ajouter du padding dans le fichier pour que les pages ne chevauchent pas les données de plusieurs processus -> pour des pages de 4096 octets, la taille du fichier va litéralement exploser
- Rajouter une couche de communication MPI pour ne faire l'écriture disque que par un seul process. Mais ça, au niveau réseau, ça va être assez dramatique au niveau latence et efficacité...
Donc, si vous avec une idée, ou connaissez un mécanisme permettant de faire un réglage fin de mmap (je n'y crois pas trop), je suis preneur !
Toutes suggestions bienvenues !
Merci
Partager