Cosa sono i socket Unix e come funzionano?

Shutterstock/asharkyu

I socket Unix sono una forma di comunicazione tra due processi che appare come un file su disco. Questo file può essere utilizzato da altri programmi per stabilire connessioni molto veloci tra due o più processi senza alcun sovraccarico di rete.

Cosa sono i socket?

I socket sono una connessione diretta tra due processi. Immagina se volessi chiamare il tuo amico in fondo alla strada; potresti fare una chiamata e farla instradare attraverso la tua compagnia telefonica e tornare a casa loro, oppure potresti far passare un filo direttamente a casa loro e tagliare l'intermediario. Quest'ultimo è ovviamente poco pratico nella vita reale, ma nel mondo di Unix è molto comune stabilire queste connessioni dirette tra i programmi.

Il nome corretto per i socket unix è Unix Domain Sockets, perché risiedono tutti all'interno di un computer. In un certo senso, i socket sono una rete interamente contenuta all'interno del kernel; invece di utilizzare le interfacce di rete per inviare i dati, gli stessi dati possono essere inviati direttamente tra i programmi.

Nonostante la creazione di file su disco, i socket Unix non scrivono effettivamente i dati che inviano al disco, poiché sarebbe troppo lento. Invece, tutti i dati vengono conservati all'interno della memoria del kernel; l'unico punto del file socket è mantenere un riferimento al socket e dargli i permessi del filesystem per controllare l'accesso. Ad esempio, il socket di MySQL si trova solitamente in:

/var/lib/mysql/mysql.sock

Questo file non contiene nulla e non dovresti modificarlo direttamente , ad eccezione delle autorizzazioni ove applicabili. È solo un nome.

Come funzionano i socket?

I socket forniscono semplicemente l'hardware effettivo per lo spostamento dei dati. I socket basati su TCP sono chiamati stream socket, dove tutti i dati arriveranno in ordine. I socket basati su UDP sono socket di datagrammi, dove l'ordine (o anche la consegna) non è garantito. Esistono anche socket grezzi, che non hanno alcuna restrizione e vengono utilizzati per implementare diversi protocolli e utilità che devono ispezionare il traffico di rete di basso livello, come Wireshark.

Pubblicità

I socket di solito usano ancora TCP o UDP, poiché non sono niente di speciale se non una fantasiosa pipe all'interno del kernel. TCP e UDP sono protocolli di trasporto che definiscono come i dati arrivano da un posto all'altro, ma non si preoccupano davvero di cosa siano i dati. TCP e UDP forniscono la piattaforma per la maggior parte degli altri protocolli come FTP, SMTP e RDP, che operano a livelli più alti.

È possibile che un'applicazione utilizzi un'implementazione leggermente diversa di TCP; i socket di flusso utilizzano il protocollo SOCK_STREAM, che è ciò che TCP utilizza anche per il trasporto quasi sempre, e sebbene siano sostanzialmente intercambiabili, sono tecnicamente leggermente diversi. Anche se questa è roba di basso livello e non è davvero qualcosa di cui devi preoccuparti, sappi solo che la maggior parte del traffico inviato attraverso i socket di dominio UNIX è basato su TCP o UDP, o almeno abbastanza simile ad esso e TCP inviato su socket di dominio UNIX è più veloce di TCP su interfacce di rete come le porte.

Uso dei socket in pratica

I socket Unix vengono solitamente utilizzati come alternativa alle connessioni TCP basate sulla rete quando i processi sono in esecuzione sulla stessa macchina. I dati vengono di solito ancora inviati tramite gli stessi protocolli; rimane semplicemente all'interno della stessa macchina e sa che è in esecuzione nello stesso dominio (da cui il nome socket di dominio UNIX), quindi non deve mai disturbare un'interfaccia di rete di loopback per connettersi a se stesso.

Il più grande esempio di ciò è Redis, un archivio chiave-valore estremamente veloce che opera interamente all'interno della memoria. Redis viene spesso utilizzato sullo stesso server che vi accede, quindi di solito sarai in grado di utilizzare i socket. A livelli così bassi e con la velocità di Redis, i socket forniscono un incremento delle prestazioni del 25% in alcuni benchmark sintetici.

Se ti stai connettendo a un database MySQL, puoi anche utilizzare un socket. Di solito ci si connette a host:port da un sistema remoto, ma se ci si connette a un database sullo stesso server (ad esempio, un'API REST che accede a un database), è possibile utilizzare i socket per accelerare . Ciò non influirà sul normale utilizzo, ma è molto evidente quando è sotto carico, oltre il 20% su un 24 core di fascia alta con 128 utenti simultanei e un milione di query al secondo. Se vedrai o meno un vantaggio dai socket è una storia diversa, ma a quel punto probabilmente vorrai comunque esaminare la replica e il bilanciamento del carico.

Pubblicità

Se vuoi lavorare con i socket manualmente, puoi utilizzare l'utilità socat per esporli sulle porte di rete:

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

Questo funziona tecnicamente vanifica lo scopo dei socket di dominio Unix, ma può essere utilizzato per il debug a livello di trasporto.


Posted

in

by

Tags: