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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 731
    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 731
    Points : 31 054
    Points
    31 054
    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...

  3. #3
    Membre éprouvé
    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
    Points : 1 122
    Points
    1 122
    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 émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    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 éclairé
    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
    Points : 654
    Points
    654
    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 éprouvé
    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
    Points : 1 122
    Points
    1 122
    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 éclairé
    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
    Points : 654
    Points
    654
    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 émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    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"

  9. #9
    Membre éprouvé
    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
    Points : 1 122
    Points
    1 122
    Par défaut
    Citation Envoyé par matafan Voir le message
    Ca ne change rien puisque "chaque noeud du cluster travaille sur des parties disjointes des données"
    Je viens de tester avec un open/lseek/write (pour éviter les buffers de fopen/fwrite) sur un NFS. Et il apparaît que si je modifie une même page, on obtient tout et n'importe quoi :
    - Parfois une machine pense être la seule à avoir modifié le fichier
    - Parfois elle récupère bien les modifications de l'autre machine
    - Dans tous les cas, le NFS ne contient que la version du dernier programme à avoir modifié le fichier

    Si je modifie des pages différentes :
    - Chaque machine pense avoir été la seule à modifier le fichier (NFS incohérent entre les machines)
    - Le NFS contient bien toutes les modifications

    Quand je dis que le NFS est incohérent, c'est que chaque machine voit un fichier différent (qui ne contient que ses propres modifs ou la version complète). Mais un touch depuis une machine tierce permet de forcer tout le monde à recharger le fichier.

    Avec mmap... C'est quasiment la même chose. Modifier une même page donnera l'avantage au dernier processus à fermer/unmapper le fichier. Modifier des pages différentes donne le bon résultat sur le NFS, mais des fichiers incohérents entre les machines. Et le comportement est le même, que je map le fichier complet, ou juste la page souhaitée.

    Mais ceci n'est rien d'autre qu'un comportement observé, je ne garanti rien de reproductible.

    Je n'ai pas testé avec des msync. Mais peut-être qu'un msync avec un mutex distribué permet de résoudre le problème des pages mitoyennes.
    Cependant, je continue de trouver ça assez sale de se dire que Linux n'ira pas réécrire tout le fichier une fois qu'il a été close et unmappé.

  10. #10
    Membre éclairé
    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
    Points : 654
    Points
    654
    Par défaut
    salut,
    la fonction select est faite plus ou moins pour ça
    Elle vérifie si un fd est libre d'écriture et de lecture
    Il est utilisé dans les appli réseau pour boucler dessus sans bloquer sur la lecture.
    Mais tu peut aussi l'utiliser sur d'autre fd dans se cas la c'est la solution
    bonne journée

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    In fd est propre à un process. On ne peux pas utiliser select() pour sérialiser l'accès à un fichier entre plusieurs process. D'ailleurs même à l'intérieur d'un même process, select() ne sert pas à ça ; il n'empêchera pas deux threads d'aller écrire simultanément dans le même fichier.

  12. #12
    Membre éclairé
    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
    Points : 654
    Points
    654
    Par défaut
    Et la RFC de nfs elle permet pas de faire des trucs qui justement gère ces petits problèmes

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