Socket Unix vs hôte TCP / IP: port

42

Est-ce que quelqu'un pourrait me décrire les avantages et les inconvénients de l'utilisation d'un fichier de socket Unix par rapport à un port TCP / IP localhost: port lors de la configuration de services sur un serveur (Ubuntu, FWIW)?

Dans ce cas particulier, il s’agit d’un serveur Python WSGI (uWSGI), mais je ne suis intéressé que de manière générale (par exemple, je sais que vous pouvez configurer MySQL de deux manières).

Je me rends compte que l'utilisation de tcp / ip signifie que les services peuvent être exposés à d'autres machines, mais je voudrais simplement savoir s'il existe un compromis entre performances et accès lors de l'accès local à des services.

À votre santé.

Ludo
la source
1
Des réponses brillantes et vraiment utiles - merci! :)
Ludo

Réponses:

40

Les sockets Unix sont un peu plus rapides car vous n’avez pas la surcharge tcp. Si vous vous rendez compte que cette perte de performance est une question de charge du serveur. Si la charge du serveur n'est pas très élevée, vous ne le reconnaîtrez pas.

Si vous utilisez Jails (FreeBSD) ou une autre technologie de virtualisation pour séparer le serveur MySQL, par exemple, du serveur Web, vous utilisez souvent la configuration tcp / ip à la place des sockets. Les règles de pare-feu doivent cependant restreindre l'accès.

Vous devez savoir si votre système est soumis à une charge importante afin qu'un socket soit indispensable ou si vous pouvez vous concentrer sur une conception de système agréable (services de séparation), une solution TCP / IP serait préférable.

Alors faites une réponse courte:

Oui, il y a une différence de performance, les sockets sont plus rapides. Si vous ne supportez pas une charge de serveur élevée, choisissez ce qui convient le mieux à la conception de votre système.

Benedikt Niessen
la source
3
Re: les sockets sont plus rapides ... ne sont-ils pas les deux sockets?
Bart Silverstrim
4
@Bart Silverstrim: non, les sockets sont des sockets; TCP a une API de type socket
Javier
7
Je crois qu'ils s'appellent "sockets Unix" et "sockets Internet". ( socket(AF_INET, SOCK_STREAM, ...))
grawity
1
Je viens de tester quelques requêtes mysql avec php-mysql (unix vs tcp-socket, les deux localhost). Par exemple, "sélectionnez SQL_NO_CACHE 1" pour éliminer les facteurs autres que le transport. il n'y avait pas de différence mesurable. BOTH avait une moyenne de 0,25 ms, le meilleur temps pour DEUX était de 0,19 ms.
Jens
11

C'est fondamentalement un compromis entre performance et flexibilité. Les sockets de domaine Unix vous donneront de meilleures performances, alors qu'une socket connectée à localhost vous donnera une meilleure portabilité. Vous pouvez facilement déplacer l'application serveur vers un autre système d'exploitation en modifiant simplement l'adresse IP de localhost en un autre nom d'hôte.

Un socket de domaine Unix utilise le système de fichiers local pour créer un mécanisme IPC entre les processus serveur et client. Vous verrez un fichier dans / var quelque part lorsque le socket de domaine Unix est connecté.

Si vous recherchez uniquement la solution de performance ultime, vous pouvez explorer un IPC à mémoire partagée. Mais c'est un peu plus complexe.

IAPaddler
la source
3

Avantages des sockets de domaine Unix.

  1. L'accès peut être géré via le système de permissions Unix, soit en définissant les permissions sur le socket lui-même, soit en lisant le nom d'utilisateur du client qui se connecte sur le serveur.
  2. Moins de chance d'exposer par inadvertance la prise au monde extérieur. Par exemple, si le serveur exécute également un proxy Web, cela peut autoriser par inadvertance les connexions aux sockets sur localhost.

Inconvénients des sockets de domaine Unix

  1. Non portable pour les systèmes non-unix.
  2. Peut être gênant avec des chroots, des prisons ou similaires
Peter Green
la source