Wat zijn Unix-sockets en hoe werken ze?

0
171
Shutterstock/asharkyu

Unix-sockets zijn een vorm van communicatie tussen twee processen die als een bestand op schijf wordt weergegeven. Dit bestand kan door andere programma's worden gebruikt om zeer snelle verbindingen tot stand te brengen tussen twee of meer processen zonder netwerkoverhead.

Wat zijn sockets?

Sockets zijn een directe verbinding tussen twee processen. Stel je voor dat je je vriend onderweg zou willen bellen; je zou een oproep kunnen plaatsen om het via je telefoonmaatschappij en terug naar hun huis te laten leiden, of je kunt een draad rechtstreeks naar hun huis leggen en de tussenpersoon uitschakelen. Dit laatste is natuurlijk onpraktisch in het echte leven, maar in de wereld van Unix is ​​het heel gewoon om deze directe verbindingen tussen programma's tot stand te brengen.

De juiste naam voor Unix-sockets is Unix Domain Sockets, omdat ze zich allemaal op één computer bevinden. In zekere zin zijn sockets een netwerk dat zich volledig in de kernel bevindt; in plaats van netwerkinterfaces te gebruiken om gegevens te verzenden, kunnen diezelfde gegevens rechtstreeks tussen programma's worden verzonden.

Ondanks het maken van bestanden op schijf, schrijven Unix-sockets de gegevens die ze naar de schijf sturen niet echt, omdat dat veel te traag zou zijn. In plaats daarvan worden alle gegevens bewaard in het kernelgeheugen; het enige punt van het socket-bestand is om een ​​verwijzing naar de socket te behouden en om het bestandssysteem machtigingen te geven om toegang te controleren. De socket van MySQL bevindt zich bijvoorbeeld meestal op:

/var/lib/mysql/mysql.sock

Dit bestand bevat niets, en u moet het niet rechtstreeks wijzigen , behalve de machtigingen waar van toepassing. Het is maar een naam.

Hoe werken sockets?

Sockets bieden eenvoudigweg de eigenlijke hardware voor het verplaatsen van gegevens. Op TCP gebaseerde sockets worden stream-sockets genoemd, waar alle gegevens op volgorde aankomen. UDP-gebaseerde sockets zijn datagram-sockets, waar bestelling (of zelfs levering) niet gegarandeerd is. Er zijn ook onbewerkte sockets, die geen beperkingen hebben en worden gebruikt voor het implementeren van verschillende protocollen en hulpprogramma's die netwerkverkeer op laag niveau moeten inspecteren, zoals Wireshark.

Advertentie

Sockets gebruiken meestal nog steeds TCP of UDP, omdat ze niets bijzonders zijn, behalve een mooie pijp in de kernel. TCP en UDP zijn transportprotocollen die bepalen hoe gegevens van plaats naar plaats komen, maar het maakt niet echt uit wat de gegevens zijn. TCP en UDP bieden het platform voor de meeste andere protocollen zoals FTP, SMTP en RDP, die op hogere niveaus werken.

Het is mogelijk dat een toepassing een iets andere implementatie van TCP gebruikt; stream-sockets gebruiken het SOCK_STREAM-protocol, dat TCP ook bijna altijd voor transport gebruikt, en hoewel ze in principe uitwisselbaar zijn, zijn ze technisch iets anders. Hoewel dit op een laag niveau is en niet echt iets is waar u zich zorgen over hoeft te maken, moet u er rekening mee houden dat het meeste verkeer dat via UNIX-domeinsockets wordt verzonden, op TCP of UDP is gebaseerd, of er in ieder geval behoorlijk op lijkt , en TCP dat via UNIX-domeinsockets wordt verzonden, is sneller dan TCP via netwerkinterfaces zoals poorten.

Socketgebruik in de praktijk

Unix-sockets worden meestal gebruikt als alternatief voor netwerkgebaseerde TCP-verbindingen wanneer processen op dezelfde machine worden uitgevoerd. Gegevens worden meestal nog steeds via dezelfde protocollen verzonden; het blijft gewoon binnen dezelfde machine en weet dat het in hetzelfde domein draait (vandaar de naam UNIX-domein sockets), dus het hoeft nooit een loopback-netwerkinterface lastig te vallen om verbinding te maken met zichzelf.

Het grootste voorbeeld hiervan is Redis, een extreem snelle key-value store die volledig in het geheugen werkt. Redis wordt vaak gebruikt op dezelfde server die er toegang toe heeft, dus je zult meestal sockets kunnen gebruiken. Op zulke lage niveaus en met hoe snel Redis is, bieden sockets een prestatieverbetering van 25% in sommige synthetische benchmarks.

Als je verbinding maakt met een MySQL-database, kun je ook een socket gebruiken. Meestal maakt u verbinding met host:port vanaf een extern systeem, maar als u verbinding maakt met een database op dezelfde server (bijvoorbeeld een REST API die toegang heeft tot een database), kunt u sockets gebruiken voor een versnelling . Dit heeft geen invloed op normaal gebruik, maar is zeer merkbaar onder belasting, meer dan 20% op een high-end 24-core met 128 gelijktijdige gebruikers en een miljoen zoekopdrachten per seconde. Of je wel of geen voordeel zult zien van sockets is een ander verhaal, maar op dat moment zul je waarschijnlijk toch naar replicatie en load balancing willen kijken.

Advertentie

Als u handmatig met sockets wilt werken, kunt u het socat-hulpprogramma gebruiken om ze via netwerkpoorten beschikbaar te stellen:

socat TCP-LISTEN:12345 UNIX-CONNECT:/var/lib/socket.sock

Dit doet technisch het doel van Unix-domeinsockets verslaan, maar kan worden gebruikt voor foutopsporing op de transportlaag.