2017-04-26 1 views
0

J'utilise un serveur websocket codé en Python 3.5. Ceci est nécessaire pour fournir des informations en temps réel sur mon site Web.Python tornado OS Erreur 24 Trop de fichiers ouverts

La bibliothèque «serveur» que j'utilise s'appelle tornado (version 4.3) qui gère la connexion websocket et les requêtes http. Pour la rétrocompatibilité (si un navigateur ne supporte pas encore websocket), j'utilise la bibliothèque python sockjs-tornado (version 1.0.3) qui ajoute également des fonctionnalités supplémentaires à la connexion websocket.

Cette connexion utilise le protocole wss: // pour être cryptée et charger un certificat pour les connexions socket. Le problème est que j'obtiens une erreur lorsque le serveur a fonctionné pendant un certain temps.

ERROR:tornado.application:Exception in callback (<socket.socket fd=18, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('***', 8443)>, <function wrap.<locals>.null_wrapper at 0x6fbeea4769d8>) 
Traceback (most recent call last): 
    File "/home/website/python/tornado/ioloop.py", line 883, in start 
    handler_func(fd_obj, events) 
    File "/home/website/python/tornado/stack_context.py", line 275, in null_wrapper 
    return fn(*args, **kwargs) 
    File "/home/website/python/tornado/netutil.py", line 274, in accept_handler 
    callback(connection, address) 
    File "/home/website/python/tornado/tcpserver.py", line 239, in _handle_connection 
    do_handshake_on_connect=False) 
    File "/home/website/python/tornado/netutil.py", line 510, in ssl_wrap_socket 
    context = ssl_options_to_context(ssl_options) 
    File "/home/website/python/tornado/netutil.py", line 487, in ssl_options_to_context 
    context.load_cert_chain(ssl_options['certfile'], ssl_options.get('keyfile', None)) 
OSError: [Errno 24] Too many open files 

je l'ai déjà augmenté la limite des fichiers ouverts sur le serveur linux, mais si le script python n'a pas été redémarré depuis 24h alors ces erreurs s'affiche si environ 300 clients sont connectés. Si je redémarre le script pendant ce temps, tout ira bien, même après que tout le monde se soit reconnecté.

Je ne sais pas vraiment quoi faire car il semble que tornado ne ferme pas les fichiers de certificat correctement et les charge à chaque nouvelle connexion.

Répondre

1

Il se peut que la tornade ne fuit pas les poignées de fichiers; c'est juste une tornade qui atteint la limite après un certain temps car elle ouvre régulièrement des fichiers. Obtenez le PID pour le processus en question et regardez /proc/[PID]/fd. Il listera tous les handles de fichiers actuellement ouverts. Si votre code conserve les fichiers ouverts pour une raison quelconque, ils s'accumuleront là-bas.

+0

J'ai essayé cela et j'ai également fait des statistiques sur tous les processus et les descripteurs de fichiers qu'ils utilisent. J'ai regardé le script python pendant un bon moment maintenant et les fichiers qui sont ouverts augmentent constamment. Si j'utilise la commande lsof -p [pid] je vois beaucoup de lignes similaires qui ressemblent à ceci: python3.5 27598 racine 111u IPv4 18662513 0t0 TCP ns000.ip-000-000-000.eu:pcsync-https -> 000.000.000.000:25467 (ÉTABLI). Sont-ce (fuites) connexions websocket de tornade? – DoNotClick

+0

bien que ces prises ne fuient pas exactement car elles sont «établies», c'est-à-dire encore ouvertes et prêtes pour le commerce. Peut-être que votre bibliothèque websocket ferme la connexion tcp après que le websocket a cessé ses activités? – user2722968

+0

J'ai une sorte de compteur en ligne sur mon site Web qui compte le tableau de toutes les connexions actuelles. Si la bibliothèque appelle les événements on_open et on_close, la connexion spécifique est supprimée ou ajoutée au tableau, ce qui permet de voir combien de clients sont actuellement en ligne. La plupart du temps, ce nombre est compris entre 100 et 300 et ne semble pas contenir de connexions mortes, mais les connexions tcp du processus augmentent tout le temps. Les événements open et close sont également appelés correctement, donc cela n'a pas de sens que les connexions ne soient pas fermées ou est-ce juste un bug de sockjs-tornado? – DoNotClick