IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

mmap et écritures concurrentes


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut mmap et écritures concurrentes
    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

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par défaut
    Après lecture et relecture, j'arrive à la conclusion que ton problème vient du fait que le découpage en pages peut chevaucher la zone de plusieurs processus.

    Affecte à chaque noeud une partie bien précise du fichier et là, plus de souci. Chaque noeud n'ira écrire que la partie qui le concerne quand ça lui chante...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    De base, je trouve ça pas très beau de se dire "j'ouvre un même fichier en écriture depuis plusieurs processus, mais c'est pas grave on travaille sur des zones différentes.".
    Le problème, c'est pas mmap, mais toute la hiérarchie de buffers qui peuvent se chevaucher entre noeuds.

    mmap utilise ses propres buffers, mais fopen et cie. utilise les siens aussi (cf setvbuf). Linux possède aussi les siens. Et si un seul des buffers mis en jeux chevauche celui d'un autre noeud, t'as perdu...
    (Le buffer de fopen n'intervient certainement pas avec mmap, c'était pour l'exemple ; et pour dire que remplacer mmap par fopen ne résoudrait pas le problème.)
    Si pour mmap on peut raisonnablement supposer que le buffer est géré par page, on ne peut rien dire pour celui du noyau. Autrement dit, gérer le découpage entre noeuds sur des frontières de pages n'est pas une bonne solution non plus à mon avis.

    Si chaque noeud travaille sur des partie disjointes du fichier, ça serait pas mieux de découper le fichier en plein de fichiers plus petits ?

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Je ne pense pas qu'il y ait de problème si le fichier est mappé avec MAP_SHARED (plutôt que MAP_PRIVATE). Tant que deux process ne vont pas écrire exactement à la même adresse (même si les deux process écrivent dans la même page, d'ailleurs), il n'y aura pas de conflits.

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    ah mon avis sa sent la merde en mémoire :/

    vérifie si c'est pas toi qui déborde

    man mmap
    man getpagesize
    man msync

    Et si deux processus écrive en même temps sur la page avec msync tu vas superposé tes données vu que msync synchronise la mémoire avec le fichier que tu a mapper en mémoire pour le sauvegarder sur ton dd et la l'emplacement est pas propre a ton process

    informe toi sur les semaphores et les threads

  6. #6
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    Citation Envoyé par matafan Voir le message
    Je ne pense pas qu'il y ait de problème si le fichier est mappé avec MAP_SHARED (plutôt que MAP_PRIVATE). Tant que deux process ne vont pas écrire exactement à la même adresse (même si les deux process écrivent dans la même page, d'ailleurs), il n'y aura pas de conflits.
    Sauf que là on est sur un cluster. Le noyau ne peut rien faire pour garantir la cohérence entre les noeuds. Le fichier est partagé... via NFS ou similaire je pense.

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    re,
    tien temps que j'y pense
    man select
    cela aide pas mal pour la gestion des fd en lecture écriture afin d'éviter les pb de concurrence sur un fd si tu as des questions demande toujours

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Citation Envoyé par Celelibi Voir le message
    Sauf que là on est sur un cluster. Le noyau ne peut rien faire pour garantir la cohérence entre les noeuds. Le fichier est partagé... via NFS ou similaire je pense.
    Ca ne change rien puisque "chaque noeud du cluster travaille sur des parties disjointes des données"

Discussions similaires

  1. écritures concurrentes dans un fichier
    Par qouify dans le forum C
    Réponses: 34
    Dernier message: 01/08/2007, 15h41
  2. écritures concurrentes dans un fichier
    Par djmalo dans le forum C
    Réponses: 9
    Dernier message: 06/03/2005, 01h45
  3. [DOM] création et écriture
    Par phoebe dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/03/2004, 15h13
  4. [debugger] détection écriture mémoire
    Par tut dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 10h17
  5. [Kylix] Simplifications de l'écriture Kylix/Pascal"
    Par Mr Vincent KLEIN dans le forum EDI
    Réponses: 1
    Dernier message: 11/03/2003, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo