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

Réseau C Discussion :

socket server et erreur EMFILE


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Par défaut socket server et erreur EMFILE
    Bonjour
    Je développe un petit serveur (sous linux) qui peut être amener à gérer de nombreuses sockets. Je les surveille en utilisant select().
    J'ai une socket server qui écoute sur un port spécifique.
    Au delà de 1024 sockets environ, je ne peux plus en créer de nouvelles puisqu'il y a une limite sur ce nombre.
    Lorsque quelqu'un cherche à se connecter, select() réagit et j'appelle ensuite accept() qui lui me renvoie l'erreur EMFILE. Du coup je laisse tomber ma création de socket.
    Et là c'est le drame : lorsque j'arrive à nouveau à mon select(), celui-ci réagit comme ci ma server socket avait quelquechose de neuf, alors que je suis sur qu'il n'y a pas eu de nouveau client qui a essayé de se connecter dessus.
    Du coup je part dans une boucle infinie qui bloque le reste du programme: un coup de select qui retourne aussitôt puis un accept qui échoue, etc, etc ad lib.

    Alors je me demande s'il y'a quelque chose à faire pour éviter ce problème ?
    Peut-être quelque chose à faire à ma server socket pour lui faire comprendre que je refuse la connexion ?
    Ou alors carrément fermer ma server socket le temps que quelques sockets se déconnectent ?

    Si quelqu'un peut m'aider, je lui en serai éternellement reconnaissant !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Bonsoir,

    En supposant que la limite soit fixée et connue(*), on peut arrêter les accept avant de tomber dans l'erreur EMFILE (à 90% par exemple) et ne les reprendre que lorsque le nombre de connexion actives est inférieur à un certain nombre.
    (*) la limite est le nombre de desripteurs de fichiers tolérée pour le process.

    Ceci dit avec ce nombre de socket ouvertes, vous êtes probablement aussi en limite côté FD_SETSIZE (le nombre de descripteurs passés à select). Ce qui est d'autant plus génant que cette limite vous empêche de gérer les descripteurs qui seraient > FD_SETSIZE.

    Je vous recommanderais donc de regarder côté poll ou mieux epoll qui sont plus performants de ce côté.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Sikamikanico Voir le message
    Au delà de 1024 sockets environ...
    Juste une idée comme cela, mais 1024 socket pour un select, cela me parait beaucoup (outre la limitation concernant le nombre de descripteurs de fichiers ouverts).

    Peut être qu'il faudrait se tourner vers une autre techno. Je pense par exemple aux IOCP, c'est sous Windows mais il y a peut être un équivalent Linux.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Peut être qu'il faudrait se tourner vers une autre techno. Je pense par exemple aux IOCP, c'est sous Windows mais il y a peut être un équivalent Linux.
    L'équivalent (*) est epoll sous Linux et kevent sous BSD.

    (*) Vu que les philosophies de ces environnements sont assez lointaines, je m'attends toujours a recevoir des pierres avec ce genre de comparaisons.
    Donc c'est comparable parce que tous sont O(1), ie l'overhead est identique quelque soit le nombre de 'descripteurs' ouverts - contrairement à select
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Par défaut
    Merci (avec un peu de retard!) pour vos réponses.
    Si je comprend bien, en utilisant epoll, je gagnerai en performance, mais par contre, il y aura toujours une limite dans le nombre de sockets ouvertes ?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par Sikamikanico Voir le message
    Merci (avec un peu de retard!) pour vos réponses.
    Si je comprend bien, en utilisant epoll, je gagnerai en performance, mais par contre, il y aura toujours une limite dans le nombre de sockets ouvertes ?
    Les ressources nécessaires à la création/gestion des sockets sont, en dernier ressort, limitées par les capacités du matériel.
    De plus, ce sont des données dynamiques (en mémoire vive), impossible à étendre simplement comme la capacité de stockage disque.

    Il y a donc une limite "système" généralement difficile à dépasser sans recompiler et une limite "process" que vous pouvez ajuster (en deçà de la limite système).

    Mais les facteurs qui limitent le plus restent physiques!

    Derrière ces milliers de sockets, il y a des requêtes à traiter qui se traduisent par une durée de traitement, des coûts CPU/mémoire et, au dessous, des échanges de via un réseau qui n'a pas non plus une capacité infinie.


    En général, le nombre de sockets supportables par un OS "moderne" est supérieur aux contraintes matérielles haut de gamme (plein de CPU et des Gigabits de bande passante).

    Il faut que l'implémentation suive, ie autre chose que select qui a été pensé à une époque ou les ressources CPU, mémoire et réseau étaient plus chiches.

    Accepter un nombre de clients supérieur aux capacités physiques disponibles signifie des temps de réponse dégradés, des overheads dus aux reprises qui s'ensuivent et un système qui s'écroule.

    L'informatique reste un métier d'ingénieur, nous ne devrions(*) pas pratiquer une gestion du risque à la mode des banquiers !

    Le design de votre application devra éviter que le système ne s'écroule et que les temps de réponses restent satisfaisants pour tous les clients acceptés.

    Vous vous attacherez à définir ces conditions extrêmes et à tester que votre application y survit correctement.

    - W
    (*) cela se voit hélas dans certains projets.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Par défaut
    Ok.
    Effectivement, il y aura toujours une limite à gérer quel que soit la fonction utilisée...
    Bon, avec tout ça, je pense que je vais y arriver. Je verrai pour passer à epoll par la suite (question de portabilité). En attendant, je vais rester encore un peu avec select et puis fermer ma server socket quand j'ai trop de clients...
    Merci pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C/C++]Socket Server/Client
    Par X-K4l1 dans le forum Développement
    Réponses: 5
    Dernier message: 03/12/2013, 12h08
  2. Gérer proprement une erreur EMFILE sur une socket serveur
    Par Le Mérovingien dans le forum Réseau
    Réponses: 0
    Dernier message: 16/09/2011, 17h07
  3. [SQL SERVER][ADO] Erreur inconue
    Par aityahia dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/03/2007, 18h10
  4. [SQL Server 2000] erreur lors importation fichier excel
    Par Abydos Business Group dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/03/2006, 09h24
  5. SQL Server: Java Erreur Socket
    Par BenoitM dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/04/2003, 16h32

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