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.
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
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
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