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 :

[kernel][sh4] latences sur sockets unix


Sujet :

Linux

  1. #1
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut [kernel][sh4] latences sur sockets unix
    je travaille sur un kernel 2.6.17 sur une target sh4 et j'observe des latences réguliéres sur mes échanges avec un socket unix quand le cpu est fortement utilisé.

    une image vaut mieux que 1000 mots


    X: le temps mesurée depuis le lancement de l'application
    Y: le temps de réponse de mes comm socket
    rouge: résultat en charge (cpu utilisé)
    vert: résultat à vide (rien d'autre que ma comm socket ne tourne)

    un superbe peigne, bien régulier avec des latences de 200ms (énorme pour mon utilisation)

    les tests réalisés :
    activer/desactiver la preemption dans le kernel ne change rien

    une attente active entre chaque appel n'as aucun effet positif

    le passage à des sockets non bloquants montre qu'aucun send n'est bloquant, et donc aucune attente due au buffer d'envoie plein (RPC avec 'ACK' explicite)

    par contre:

    passer les taches en policy SCHED_FIFO supprime entiérement le probléme


    un usleep(0) entre chaque appel fait disparaitre le peigne.
    un usleep(0) met la tache en sleep jusqu'au prochain tick systéme
    un de ses effets de bord serait de provoquer un context switch si une autre tache est runnable (supposé)
    remplacer usleep(0) par un yield periodique (tous les 1000 appels par exemple) produit un résultat similaire (plus de peigne, seulement quelques appels avec forte latence)

    le passage au kernel 2.6.23:

    les latences ne semblent pas être reproductible (les 3 modéles de kernel preempt ont été essayé)
    par contre le temps de réponse moyen est beaucoup plus élevé, ce qui ralonge considérablement la durée totale du test (environ 30%)



    les changements qui pourraient impacter:
    -changement de la classe des locks sur AF_UNIX en bh (http://lkml.org/lkml/2006/6/5/340 voir http://oreilly.com/catalog/linuxdrive3/book/ch05.pdf chapitre spinlock) => à prioris mis hors de cause avec un test sur la family AF_INET (qui utilise toujours la meme classe de lock)
    -refonte complete du scheduler pour les taches SCHED_OTHER => supposé 'coupable' (de l'amélioration de comportement) pour le moment (voir : http://kerneltrap.org/node/8059 pour les détails)


    j'aimerais bien un avis éclairé sur le problème
    pour moi le scheduling des policies SCHED_NORMAL du 2.6.17 est en cause
    le problème étant de trouver une astuce pour garder le 2.6.17 et une policy SCHED_NORMAL car je ne fait que des RPC avec mes sockets, et d'autres choses plus gourmandes et plus prioritaires tournent, donc à prioris passer en SCHED_{RR,FIFO} n'est pas une bonne solution.
    au mieux, j'aimerais trouver une solution pour garder mon kernel 2.6.17 (sans trop le hacker)


    ci-joint alt-cli et alt-serv, mes clients et server de test utilisés pour plotter les graphes présentés.
    ps: si tu es experte kprobe/jprobe où LTTng sur target sh4, tu m'interresse
    Fichiers attachés Fichiers attachés
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  2. #2
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Salut,

    Peut-être prendre le 2.6.18 :
    Citation Envoyé par man sched_setscheduler
    Originally, Standard Linux was intended as a general-purpose operating
    system being able to handle background processes, interactive applica‐
    tions, and less demanding real-time applications (applications that
    need to usually meet timing deadlines). Although the Linux kernel 2.6
    allowed for kernel preemption and the newly introduced O(1) scheduler
    ensures that the time needed to schedule is fixed and deterministic
    irrespective of the number of active tasks, true real-time computing
    was not possible up to kernel version 2.6.17.

    Real-time features in the mainline Linux kernel
    From kernel version 2.6.18 onwards, however, Linux is gradually becom‐
    ing equipped with real-time capabilities, most of which are derived
    from the former realtime-preempt patches developed by Ingo Molnar,
    Thomas Gleixner and others. <...>
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  3. #3
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    il n'est pas vraiment sain (de mon point de vue) de passer les tache en policy RT.

    on peux en discuter, mais mon but ultime n'est pas de faire des RPCs, et passer les RPCs en RT risquerais d'avoir des effets de bord génants sur le reste des applications (chose à éviter à tout prix)

    quand à changer de kernel, malheureusement je ne peux pas, je dois me contenter du 2.6.17.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  4. #4
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par Dark_Ebola
    on peux en discuter, mais mon but ultime n'est pas de faire des RPCs, et passer les RPCs en RT risquerais d'avoir des effets de bord génants sur le reste des applications (chose à éviter à tout prix)
    Ok. Et l'ordonnanceur IO, il a un impact. Si tu utilises noop ?
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  5. #5
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    l'ordonanceur IO n'as d'impact que sur les blockdevices (IDE,SATA...)

    par contre ça souléve une autre question: est-ce que QoS est applicable aux socket unix?
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    Bonjour,

    Bravo pour la qualité du post, qui le rend bien plus intéressant. Au passage comment tu as obtenu tes graph ?
    Je dirais que dans un contexte d'ordonnancement FIFO la priorité de ta tâche ne varie pas et est plus prioritaire que les autres processus placé en ordonnancement SCHED_NORMAL, d'où le résultat sur les performances.
    En sched normal la priorité de ta tâche varie () et suivant ses demandes en ressources processeur le scheduler va donner la donner la main a une tache moins gourmande en ressource, à chaque fois que tu fais ton appel système sur la socket par exemple.

    A mon avis il y a deux manières de compenser le problème en conservant l'ordonnancement Linux classique :
    - Celui que tu as mis en place avec usleep() et shced_yield() : en rendant la main a l'ordonnance tu 'conserves' ta priorité.
    - Lance ta tâche avec une priorité statique plus forte (nice), ou moins forte.

    N'hésite pas a poster le résultat.
    ++
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  7. #7
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par bizulk Voir le message
    comment tu as obtenu tes graph ?
    gnuplot

    Je dirais que dans un contexte d'ordonnancement FIFO [...] à chaque fois que tu fais ton appel système sur la socket par exemple.
    on est bien d'accord.

    - Celui que tu as mis en place avec usleep() et shced_yield() : en rendant la main a l'ordonnance tu 'conserves' ta priorité.
    le problème c'est que ça me parait assez vilain comme 'hack'

    - Lance ta tâche avec une priorité statique plus forte (nice), ou moins forte.
    ça m'as surpris au début, mais renicer mon client/server n'as fait que décaller vers la droite les peaks.
    comme toujours, une image:


    mes apps client/server ont plus longtemps le scheduler pour eux seuls, mais au fur et à mesure, leur PRI décroit et elles se retrouvent dans le même cas que précedemment.

    merci en tout cas pour ces éléments de réponse, je débute avec le kernel linux et ça m'aide à y voir plus clair.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  8. #8
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    OK pour gnuplot, mais pour recuperer tes points ?

    Pour ce qui est de la gestion de priorité, il fallait s'y attendre.
    Si tu tiens tant a rester dans cet ordonnancement, je te suggère de faire un top et de voir quel services/processus "passent au-dessus" de ton appli, voir si un ajustement peut se faire.

    Sinon étant donné que tu souhaites maîtriser les temps d'accès aux sockets tu définis par la une contrainte temps réel et cela me paraîtrait normal de basculer ton applic en ordonnancement SCHED_FIFO.
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Dark_Ebola Voir le message
    le problème c'est que ça me parait assez vilain comme 'hack'
    D'accord pour usleep() mais sched_yield() est fait pour ça.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  10. #10
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par bizulk Voir le message
    OK pour gnuplot, mais pour recuperer tes points ?
    voir le code de joint : alt-cli.c

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            gettimeofday(&tv1, NULL);
            test_int(scket,i);
            gettimeofday(&tv2, NULL);
            timersub(&tv2, &tv1, &diff);
            t = diff.tv_usec + diff.tv_sec * 1000000;
            timersub(&tv2,&starttime,&diff2);
            timestamp = diff2.tv_usec + diff2.tv_sec * 1000000;
            fprintf(mf,"%llu.%06llu %llu.%06llu\n",timestamp/1000000,timestamp%1000000,t/1000000,t%1000000);
    je n'ai plus qu'à plotter le fichier.
    >plot 'myfile.txt' with lines

    Sinon étant donné que tu souhaites maîtriser les temps d'accès aux sockets tu définis par la une contrainte temps réel et cela me paraîtrait normal de basculer ton applic en ordonnancement SCHED_FIFO.
    je vais y réfléchir sérieusement.
    mon problème c'est que 'mon but dans la vie' (le but de mon système) n'est absolument pas de faire des accés sur af_unix, j'ai peur que le passage en SCHED_FIFO de mes applis qui dialoguent par socket (elles sont nombreuses) impacte grandement le reste du système.

    Citation Envoyé par nicolas.sitbon Voir le message
    D'accord pour usleep() mais sched_yield() est fait pour ça.
    le soucis c'est que je ne sais pas quand appeler sched_yield(), y'a-t'il des heuristiques connues? quelque chose sur quoi se baser ? ou il faut définir experimentalement les valeurs acceptable ?
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    pas standard ça :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(mf,"%llu.%06llu %llu.%06llu\n",timestamp/1000000,timestamp%1000000,t/1000000,t%1000000);
    il faut plutôt faire comme ça :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <inttypes.h>
    fprintf (mf, "%" PRIu64 ".%06" PRIu64 " %" PRIu64 ".%06" PRIu64 "\n", timestamp / 1000000, timestamp % 1000000, t / 1000000, t % 1000000);
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  12. #12
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Citation Envoyé par granquet Voir le message
    un usleep(0) met la tache en sleep jusqu'au prochain tick systéme
    C'est specifie ou ce comportement de sleep() ?

  13. #13
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par fmoreau Voir le message
    C'est specifie ou ce comportement de sleep() ?
    dans les source du kernel (fin, ce que j'en ai compris)
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  14. #14
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par granquet Voir le message
    dans les source du kernel (fin, ce que j'en ai compris)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <unistd.h>
    int usleep(useconds_t useconds);
    If the value of useconds is 0, then the call has no effect.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  15. #15
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <unistd.h>
    int usleep(useconds_t useconds);
    Si granquet dit vrai alors linux n'est pas tres posix dans ce cas...

  16. #16
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par granquet Voir le message
    dans les source du kernel (fin, ce que j'en ai compris)
    ca m'a l'air vrai sauf si tu as le support des high resolution timers...

  17. #17
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    If the value of useconds is 0, then the call has no effect.
    je n'ai retrouvé ce commentaire dans mes sources.
    chez moi usleep est un simple wrapper de nanosleep

    j'utilise les hrtimers
    et de ce que je vois du code (dispo ici: http://lxr.linux.no/linux+v2.6.17.14...hrtimer.c#L773 )
    schedule() est effectivement appelé (même avec une valeur de 0 dans usleep)
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

Discussions similaires

  1. bases sur les sockets unix
    Par vinc-mai dans le forum Ruby
    Réponses: 2
    Dernier message: 31/03/2010, 03h16
  2. cherche tuto ou exemple sur les sockets unix
    Par razam dans le forum Réseau
    Réponses: 14
    Dernier message: 24/10/2007, 17h18
  3. [SOCKET] Client UDP sur système Unix
    Par be_tnt dans le forum Développement
    Réponses: 1
    Dernier message: 14/04/2006, 21h31
  4. Notion sur Socket UDP
    Par oxor3 dans le forum Développement
    Réponses: 3
    Dernier message: 05/04/2004, 00h19
  5. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42

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