6 Luglio 2022

Velocizzare WordPress e massimizzare le performance di MySQL tramite la connessione Unix Domain Socket

Gli Unix Domain Socket migliorano le prestazioni di WordPress rispetto alla connessione localhost? Vediamo insieme questo semplice trucco.

Print Friendly, PDF & Email

E’ risaputo che lo studio della tecnologia almeno da parte nostra ha l’unico scopo di ottenere soluzioni pratiche e tangibili per migliorare le performance, la stabilità e la velocità dei siti web dei nostri stimati clienti.

Per quanto possa essere appassionante, testare, provare, sperimentare nuove tecnologie, webserver, configurazioni, alla fine il focus ultimo è sempre quello di fare meglio.

In un precedente articolo abbiamo comparato la velocità, il throughput ed i vantaggi che si possono ottenere utilizzando gli Unix Domain Socket piuttosto che i socket TCP per instaurare una connessione con un Database MySQL.

Perchè in fondo avere un Database locale e connettersi tramite TCP come se fosse un Database remoto comporta necessariamente tutte le operazioni a livello di TCP per instaurare una connessione, in primis il Three Way handshake TCP.

Three Way Handshake

Questo processo comporta necessariamente delle operazioni aggiuntive a livello di rete, e una latenza maggiore rispetto all’aprire un descrittore di file UNIX, rendendo di fatto la connessione del nostro CMS WordPress (ma il discorso è valido per qualsiasi altro CMS) più lenta e meno performante rispetto appunto all’utilizzo degli UNIX DOMAIN SOCKET.

I benefici li abbiamo già ampiamente visti nel precedente articolo che trattava la differenza di performance tra connessioni MySQL tramite socket piuttosto che MySQL tramite TCP, ma ovviamente un articolo tecnico può essere inutile se non adeguato al nostro scopo che è quello di rendere la nostra installazione WordPress o WooCommerce più performante.

Gli Unix Domain Socket migliorano le prestazioni di WordPress?

 

Panoramica

Su alcuni sistemi WordPress una semplice modifica al tuo file di configurazione può velocizzare le comunicazioni tra WordPress e il tuo database. Se la tua installazione di WordPress è su Linux, e il tuo DB_HOST ha come impostazione localhost oppure 127.0.0.1 potrebbe essere possibile utilizzare Unix Domain Sockets per velocizzare il tuo sistema e la comunicazione con il database MySQL.

Questo tutorial ti mostrerà come farlo, spiegherà il ragionamento alla base e testerà i risultati.

Procedura

Il codex di WordPress menziona questa tecnica nella documentazione sull’editing del file wp-config.php, ma non entra molto nel dettaglio.

Se il tuo server web ha una configurazione tipica su Linux, la procedura potrebbe essere semplice come aprire il file/wp-config.phpfile in un editor, quindi cercando una riga simile a questa:

define( 'DB_HOST', 'localhost' );

oppure questo:

define( 'DB_HOST', '127.0.0.1' );

e sostituendolo con questo:

define( 'DB_HOST', 'localhost:/var/lib/mysql/mysql.sock' );

avrai istruito la tua installazione WordPress a utilizzare il descrittore file del socket MySQL piuttosto che la connessione TCP.

Risoluzione dei problemi noti

Se l’impostazione mostrata sopra non funziona e hai accesso shell al tuo host web, puoi verificare il nome del socket di dominio Unix usando il comando lsof che sta a significare list open files, ovvero la lista dei file aperti.

$ lsof -U | grep mysql
mysqld 737 mysql 37u  unix 0xffffa0a4b9628400 0t0 15179 /var/run/mysqld/mysqld.sock type=STREAM

Questo comando funzionerà sia per i database MySQL che per quelli MariaDB che l’ottimo e da noi preferito Percona Server. Se non vedi un output simile a quello mostrato sopra, allora un socket di dominio Unix non è disponibile per te. Se ottieni un elenco, ma il percorso del socket è diverso da/var/run/mysqld/mysqld.sock, copia il percorso del socket corretto e incollalo nel tuo wp-config.php dopo localhost:nella tua definizione DB_HOST

Ad esempio nei sistemi Linux RedHat derivati, come RHEL stessa, CentOS, Fedora, Almalinux, Rockylinux, Scientific Linux, il percorso è normalmente /var/lib/mysql/mysql.sock

Smontiamo alcune leggende metropolitane

Ci sono alcune cattive informazioni che circolano su Internet riguardo a questo argomento. Quanto segue dovrebbe dissipare ogni timore.

  • I socket di dominio Unix non sono affidabili ed è possibile il danneggiamento dei dati.
    FALSO – Almeno in questo caso. Esiste un tipo di UDS definito inaffidabile, chiamato SOCK_DGRAM. Ma iltipo=STREAM mostrato dal comando lsof  indica che questo è un SOCK_STREAM UDS che garantisce la consegna di un flusso di dati ordinati. È altamente improbabile che un server di database utilizzi mai un datagramma UDS. Per riferimento, vedere la definizione di SOCK_STREAM .
  • Sui moderni sistemi Linux, l’utilizzo di TCP/IP con localhost è veloce quanto Unix Domain Sockets.
    FALSO – Se la funzione socket() viene chiamata con un dominio socket di AF_INET o AF_INET6(protocollo Internet v4 o v6), non importa quale indirizzo IP viene utilizzato, tutte le comunicazioni avranno il sovraccarico del protocollo TCP/IP. I socket di dominio Unix sono un tipo di comunicazione interprocesso (IPC) che hanno un sovraccarico di elaborazione molto inferiore rispetto a TCP/IP.
  • Anche se ci sono meno spese generali, la differenza di prestazioni non è così grande.
    POSSIBILE – Il Driver di loopback locale TCP/IPin Linux esegue alcune ottimizzazioni, come saltare la generazione e la verifica del checksum . Tuttavia, i benchmark mostrano che il passaggio da TCP/IP a Socket di dominio UNIX migliorerà la latenza della connessione e la velocità di trasferimento dei dati. Maggiore è il numero di dati trasferiti per query, maggiore sarà la velocità di trasferimento dei dati. Poiché WordPress utilizza set di dati di grandi dimensioni e molte query di database durante il salvataggio o la visualizzazione di una pagina Web, utilizzando UNIX DOMAIN SOCKET si miglioreranno a prescindere le prestazioni. Tuttavia, quando il database di WordPress si trova sull’host locale, le query impiegano solo dal 3% al 6% del tempo di esecuzione durante il caricamento di una pagina. Probabilmente noterai solo un miglioramento della velocità su siti Web molto trafficati e ad alta intensità di dati. La vera risposta dipende dal tuo sistema, dal tuo traffico web e dal tuo punto di vista.

Come funziona questo approccio?

TCP/IP è un protocollo di comunicazione di rete. Una stretta di mano a tre vie (il già citato Three Way Handshake) deve essere prima obbligatoriamente eseguito per poter successivamente stabilire una connessione di rete TCP/IP e che i dati possano essere inviati.

Quindi, tutti i dati inviati vengono prima suddivisi in pacchetti più piccoli (questo è necessario per un’efficace condivisione della larghezza di banda della rete). L’origine e la destinazione vengono aggiunte a una busta attorno a ciascun pacchetto di dati. I dati di controllo degli errori vengono calcolati e aggiunti anche alla busta. Alla busta viene aggiunto anche un numero di sequenza in modo che il destinatario possa correggere qualsiasi pacchetto di dati fuori servizio. Vengono inoltre aggiunti dati aggiuntivi a ciascuna busta del pacchetto per aiutare a identificare e instradare il pacchetto sulle reti locali. Il destinatario deve controllare e correggere eventuali pacchetti fuori servizio, controllare ogni pacchetto per errori, inviare un riconoscimento per ogni pacchetto e riassemblare il blocco di dati originale dai dati all’interno di ciascun pacchetto.

Nota: il calcolo del checksum e il controllo degli errori vengono ignorati per le connessioni localhost nei moderni sistemi Linux.

I socket di dominio Unix (Unix domain Sockets) non necessitano di questa ulteriore frammentazione ed elaborazione dei dati.  Funzionano più come se si dovesse leggere e scrivere su un file, ma a differenza di un file normale, il passaggio dei dati avviene nella memoria di sistema invece che su un’unità disco. Per questo motivo, gli Unix Domain Sockets spostano i dati in modo più rapido ed efficiente rispetto a TCP/IP sopratutto laddove ci si trova dotati a livello Hardware di RAM veloci.

Risultato dei test

Il grafico mostra esempi di tempi di caricamento di una pagina WordPress utilizzando TCP/IP e Unix Domain Sockets come metodo di connessione al database. C’è stato un miglioramento della velocità media del 25% con Unix Domain Sockets. Le barre di errore mostrano anche che Unix Domain Sockets ha ridotto la varianza nel tempo di esecuzione del 20%.

Quali benefici aspettarsi e quando utilizzarlo?

Parliamo di fatto di un segreto di pulcinella, tanto facile da implementare quanto poco utilizzato. Migriamo decine di siti web WordPress e WooCommerce ogni giorno e abbiamo sempre (e sempre significa sempre, ovvero il 100% dei casi) l’utilizzo di localhost o di 127.0.0.1 nella configurazione di wp-config.php

Di certo applicare un virtuosismo come quello descritto è alla portata di tutti anche andando a semplici tentativi, tuttavia ottenere dei risultati tangibili ha senso solo ed esclusivamente una volta risolti gli altri problemi di performance.

Sarebbe inutile ad esempio recuperare 5ms di velocità per poi avere latenze di 1 secondo per la mancanza di indici sulle tabelle, o avere limiti a livello di performance TCP causa mancanza di TCP BBR ad esempio.

Diverso è nel caso in cui si fanno operazioni massive sul database, come importazioni di cataloghi CSV su WooCommerce, la modifica massiva dei prezzi, o operazioni di questo tipo, tra cui anche la scansione della sitemap da parte dei crawler di Google.

Questo accorgimento insomma deve essere considerato come la ciliegina sulla torta, in grado di migliorare qualcosa di già buono di suo e tutto il processo di ottimizzazione performance WordPress che abbiamo già ampiamente descritto, e sicuramente non fare miracoli.

Con l’avvento dei Google Core Web Vitals e della pretesa imposta da Google nell’ottenere un sito web veloce e performante tuttavia, anche pochi millisecondi possono essere dei valori importanti da tenere in considerazione nell’ottica di una strategia di ottimizzazione e miglioramento molto più ampia e produttiva.

Sicuramente il miglior rendimento di tale tecnica è quello che si può ottenere su Server Dedicati ed istanze dedicate come Cloud o VPS, adeguatamente dimensionate a livello di risorse e sapientemente configurate a livello di tuning software.

Conclusione

Come accennato in precedenza, se il database si trova sull’host locale, le query del database rappresentano meno del 6% del tempo di esecuzione mentre WordPress sta elaborando una richiesta. L’effetto complessivo del passaggio da TCP/IP a Unix Domain Socket sarà appena percettibile tranne che su siti Web molto affollati. Ma per un cambiamento così facile, perché non risparmiare un po’ sui tempi di elaborazione e sul consumo di energia?

Come ribadito, abbiamo parlato di WordPress, ma la stessa cosa è applicabile a qualsiasi CMS.

Hai dei dubbi? Non sai da dove partire? Contattaci


Abbiamo tutte le risposte alle tue domande per aiutarti nella giusta scelta.

Chatta con noi

Chatta direttamente con il nostro supporto prevendita.

0256569681

Contattaci telefonicamente negli orari d’ufficio 9:30 – 19:30

Contattaci online

Apri una richiesta direttamente nell’area dei contatti.

INFORMAZIONI

ManagedServer.it è il principale provider italiano di soluzioni hosting ad alte performance. Il nostro modello di sottoscrizione ha costi contenuti e prevedibili, affinché i clienti possano accedere alle nostre affidabili tecnologie di hosting, server dedicati e cloud. ManagedServer.it offre, inoltre, eccellenti servizi di supporto e consulenza su Hosting dei principali CMS Open Source come WordPress, WooCommerce, Drupal, Prestashop, Magento.

SOLO UN ATTIMO !

Vorresti vedere come gira il tuo WooCommerce sui nostri sistemi senza dover migrare nulla ? 

Inserisci l'indirizzo del tuo sito WooCommerce e otterrai una dimostrazione navigabile, senza dover fare assolutamente nulla e completamente gratis.

No grazie, i miei clienti preferiscono il sito lento.
Torna su