Comment rendre un socket UNIX plus rapide?

Je gère une VM Google Cloud Compute en tant que serveur d’applications pour une application disponible sur iOS et Android. Le serveur exécute Django dans uWSGI, avec nginx. La communication entre uWSGI et nginx se fait via un socket de fichier unix.

Récemment, j’ai remarqué des délais d’attente au bout du compte. J’ai fait un peu d’expérimentation et j’ai trouvé que UWSGI faisait parfois des erreurs lors de l’écriture des données sur le socket du fichier. Lorsque j’augmente le paramètre «max-time» du côté client, le passage s’effectue en douceur. Par exemple, un exemple de demande renvoyant environ 200 Ko de données json prend environ 1 seconde pour que Django calcule. Mais le socket UNIX semble prendre encore 1-2 secondes, ce qui semble trop élevé pour une réponse de 200KB. Si le client attend une réponse dans les 2 secondes, cela entraîne souvent une erreur d’écriture (comme le montre la capture d’écran ci-dessous) sur uWSGI. Lorsque j’augmente le délai d’attente du côté client, il se déroule sans problème.

Je veux savoir s’il y a des changements de configuration qui peuvent accélérer la lecture et l’écriture sur un socket UNIX. 200KB est une taille très mineure pour une réponse JSON de mon serveur – je ne pourrai donc pas la supprimer. Et je ne peux pas avoir plus de 2 secondes de délai d’attente sur mon client (iOS ou Android), pour des raisons professionnelles.

Capture d'écran de l'interception de socket uwsgi

Plusieurs entités Unix sont représentées par des fichiers mais ne contiennent aucun fichier. Les tuyaux et les sockets sont des exemples d’entités représentées par des fichiers qui ne sont pas des fichiers.

Ainsi, l’écriture et la lecture à partir d’un socket unix ne sont pas liées aux E / S du système de fichiers et ne partagent pas les réponses temporelles du système de fichiers. En fait, le socket unix est l’un des moyens les plus rapides d’IPC, étant plus efficace qu’un socket TCP, car il n’utilise pas du tout les E / S réseau.

Cela dit, voici quelques conseils pour résoudre votre problème particulier:

  1. Évaluez votre application pour des problèmes de performance. Profilez-le et vérifiez où il pourrait passer trop de temps. Généralement, les E / S sont les principaux méchants des problèmes de performances. De plus, les mauvais algorithmes, les recherches linéaires sur de longues listes sont également des culpabilités courantes.
  2. Vérifiez votre configuration sur le serveur Web et sur votre passerelle d’application.
  3. Vérifiez la planification des processus. Si tout le monde s’exécute dans la même boîte, la simultanéité des processus peut être un problème pour les charges lourdes. Assurez-vous que tous les processus fonctionnent selon les priorités appropriées.

Bonne chance!