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.

La comunicazione tra processi su una singola macchina è una funzionalità fondamentale per molti sistemi informatici. Esistono due modalità principali per effettuare connessioni a livello locale: tramite protocollo TCP/IP e tramite Unix Domain Socket (UDS). Il protocollo TCP/IP è uno standard per la comunicazione tra dispositivi in una rete e viene utilizzato per la comunicazione tra processi su una singola macchina, così come per la comunicazione tra macchine in una rete. D’altra parte, i socket di dominio Unix sono un meccanismo di comunicazione utilizzato esclusivamente per la comunicazione tra processi su una singola macchina. Entrambe queste opzioni offrono vantaggi e svantaggi a seconda delle esigenze specifiche del sistema. In questo post esploreremo in dettaglio queste due modalità di comunicazione e vedremo come scegliere quella più adatta alle tue esigenze.

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 delle query WordPress?

Panoramica

Migliora la velocità di comunicazione tra il tuo sistema WordPress e il database MySQL con una semplice modifica al file di configurazione. Scopri come utilizzare Unix Domain Sockets su sistemi Linux per aumentare la velocità del tuo sito WordPress. In questa guida, ti forniremo una spiegazione dettagliata del processo e dei risultati del test andando a modificare la tua costante DB_HOST definita in wp-config che ha come impostazione di defualt normalmente il valore localhost oppure 127.0.0.1.

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

Procedura per utilizzare gli Unix Domain Socket con WordPress.

Il codex di WordPress spiega questa tecnica nella documentazione sull’editing del file wp-config.php, andando ad illustrare delle modalità di editing che sono molto facili ed alla portata di tutti.

WP Config UDS

Basta infatti aprire il file/wp-config.php in un editor, quindi cercando una riga simile a questa:

define( 'DB_HOST', 'localhost' );

e sostituendolo con questo valore:

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

avrai modificato la tua configurazione WordPress per utilizzare il descrittore file del socket MySQL piuttosto che la connessione TCP.

ATTENZIONE : Qualora il tuo Hosting Provider utilizzi un server MySQL remoto e non in locale, non potrai in alcun modo utilizzare questa procedura e dovrai accontentarti di utilizzare l’indirizzo IP remoto e dunque instaurare una connessione su TCP Over IP.

Risoluzione dei problemi noti

Se l’impostazione mostrata sopra non dovesse funzionare e sebbene il DB giri localmente, ed hai accesso shell Linux del 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.

Potresti non avere installato il comando lsof, tuttavia puoi farlo tramite la utility apt o yum se hai i privilegi di root, o chiedere al tuo hosting provider di installarla.

[root@Server174 ~]# lsof -U | grep mysql
mysqld 28112 mysql 18u unix 0x0000000006388651 0t0 777704714 /var/lib/mysql/mysql.sock
mysqld 28112 mysql 25u unix 0x0000000019e2551a 0t0 1143856963 /var/lib/mysql/mysql.sock

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

Facciamo alcune precisazioni in merito agli UNIX Domain Socket

Ci sono alcune cattive informazioni che circolano su Internet riguardo a questo argomento e possono portare ad errori di connessione, raggiungibilità del sito o molta confusione. Cerchiamo dunque di fare chiarezza.

  • I socket di dominio Unix sono molto affidabili
    Il comando lsof utilizzato per visualizzare i socket aperti può mostrare il tipo di UDS STREAM, il che indica che si tratta di un SOCK_STREAM UDS che garantisce la consegna di dati in ordine. Questo tipo di socket è particolarmente indicato per la trasmissione di dati in un flusso continuo. È molto raro che un server di database utilizzi un datagramma UDS poiché questi socket sono più adatti per la trasmissione di dati non strutturati e non garantiscono la consegna ordinata dei dati. In generale, i server di database richiedono una consegna affidabile e ordinata dei dati, quindi è più probabile che utilizzino socket di tipo STREAM. Per riferimento, vedere la definizione di SOCK_STREAM .
  • Unix Domain Socket è più veloce di TCP
    La funzione socket() è una componente fondamentale nella creazione di connessioni di comunicazione tra processi. Quando viene chiamata con un dominio socket di AF_INET o AF_INET6, indipendentemente dall’indirizzo IP utilizzato, tutte le comunicazioni avranno il sovraccarico del protocollo TCP/IP. Tuttavia, i socket di dominio Unix offrono un’alternativa alla comunicazione interprocesso (IPC) con un sovraccarico di elaborazione notevolmente inferiore rispetto al TCP/IP. Questi socket sono un’opzione ideale per sistemi che richiedono un’alta velocità di comunicazione e una ridotta quantità di elaborazione.
  • La differenza di prestazioni non è così grande.
    Il Driver di loopback TCP/IP in Linux, per ottimizzare il suo funzionamento, adotta alcune tecniche come evitare la generazione e verifica del checksum. Benchmark mostrano che il passaggio da TCP/IP a Socket di dominio UNIX permette di migliorare sia la latenza della connessione che la velocità di trasferimento dei dati. In particolare, maggiore è il numero di dati trasferiti per query, maggiore sarà la velocità di trasferimento dei dati. Ad esempio, WordPress, essendo un sistema che 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 può migliorare la performance del sistema. Tuttavia, bisogna considerare che 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. Pertanto, potresti notare un miglioramento della velocità solo su siti web molto trafficati e ad alta intensità di dati.
  • L’utilizzo degli Unix Domain Socket permette di evitare la saturazione delle porte TCP
    Il numero di porte disponibili per le connessioni TCP è limitato e la saturazione delle porte può causare problemi di prestazioni su un server. Inoltre, un gran numero di connessioni TCP globali può causare una sovraccarico del sistema e una riduzione delle prestazioni. Utilizzando gli UDS, invece di creare nuove connessioni TCP, si utilizza un file system per creare un punto di connessione tra i processi, evitando la saturazione delle porte e delle connessioni globali del server.
  • L’utilizzo degli Unix Domain Socket permette di ottenere una maggiore sicurezza
    L’utilizzo di UDS permette di avere una maggiore sicurezza e controllo rispetto alle connessioni TCP, poiché gli UDS possono utilizzare controlli di accesso del file system per autorizzare o negare l’accesso ai processi. Sebbene questo sia un’aspetto marginale in quanto anche il TCP/IP permette meccanismi di firewalling, o binding dell’istanza su IP privati come localhost, e comunque il servizio richieda un login tramite credenziali, è corretto dire che che la sicurezza è migliore con l’utilizzo degli UDS.

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 di una query MySQL

 

Abbiamo voluto testare una query nel nostro ambente di test e abbiamo ottenuto dei risultati interessanti. Il grafico sopra infatti 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 di oltre il 25% con Unix Domain Sockets.

In fondo non era una novità ed era già ampiamente documentato in rete, tra cui il test di Percona, la società che sviluppa e supporta Percona Server che aveva già mostrato e dimostrato questa caratteristica e benefico dell’utilizzo degli UNIX DOMAIN SOCKET in sostituzione a TCP/IP.

unix-socket-domain

Se siete interessati a leggerne anche i loro risultati in merito alla bontà di questa tecnica vi invitiamo a leggere questo post : https://www.percona.com/blog/2020/04/13/need-to-connect-to-a-local-mysql-server-use-unix-domain-socket/

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 evitando anche di saturare porte TCP?

Scopri come gli Unix Domain Socket possono migliorare le performance del tuo sistema e ridurre la latenza. Contatta il nostro supporto per approfondire questo argomento e ottenere il massimo dal tuo sistema.

Hai dei dubbi? Non sai da dove iniziare? 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

Managed Server S.r.l. è un player italiano di riferimento nel fornire soluzioni avanzate di sistemistica GNU/Linux orientate all’alta performance. Con un modello di sottoscrizione dai costi contenuti e prevedibili, ci assicuriamo che i nostri clienti abbiano accesso a tecnologie avanzate nel campo dell’hosting, server dedicati e servizi cloud. Oltre a questo, offriamo consulenza sistemistica su sistemi Linux e manutenzione specializzata in DBMS, IT Security, Cloud e molto altro. Ci distinguiamo per l’expertise in hosting di primari CMS Open Source come WordPress, WooCommerce, Drupal, Prestashop, Joomla, OpenCart e Magento, affiancato da un servizio di supporto e consulenza di alto livello adatto per la Pubblica Amministrazione, PMI, ed aziende di qualsiasi dimensione.

Red Hat, Inc. detiene i diritti su Red Hat®, RHEL®, RedHat Linux®, e CentOS®; AlmaLinux™ è un marchio di AlmaLinux OS Foundation; Rocky Linux® è un marchio registrato di Rocky Linux Foundation; SUSE® è un marchio registrato di SUSE LLC; Canonical Ltd. detiene i diritti su Ubuntu®; Software in the Public Interest, Inc. detiene i diritti su Debian®; Linus Torvalds detiene i diritti su Linux®; FreeBSD® è un marchio registrato di The FreeBSD Foundation; NetBSD® è un marchio registrato di The NetBSD Foundation; OpenBSD® è un marchio registrato di Theo de Raadt. Oracle Corporation detiene i diritti su Oracle®, MySQL®, e MyRocks®; Percona® è un marchio registrato di Percona LLC; MariaDB® è un marchio registrato di MariaDB Corporation Ab; REDIS® è un marchio registrato di Redis Labs Ltd. F5 Networks, Inc. detiene i diritti su NGINX® e NGINX Plus®; Varnish® è un marchio registrato di Varnish Software AB. Adobe Inc. detiene i diritti su Magento®; PrestaShop® è un marchio registrato di PrestaShop SA; OpenCart® è un marchio registrato di OpenCart Limited. Automattic Inc. detiene i diritti su WordPress®, WooCommerce®, e JetPack®; Open Source Matters, Inc. detiene i diritti su Joomla®; Dries Buytaert detiene i diritti su Drupal®. Amazon Web Services, Inc. detiene i diritti su AWS®; Google LLC detiene i diritti su Google Cloud™ e Chrome™; Facebook, Inc. detiene i diritti su Facebook®; Microsoft Corporation detiene i diritti su Microsoft®, Azure®, e Internet Explorer®; Mozilla Foundation detiene i diritti su Firefox®. Apache® è un marchio registrato di The Apache Software Foundation; PHP® è un marchio registrato del PHP Group. CloudFlare® è un marchio registrato di Cloudflare, Inc.; NETSCOUT® è un marchio registrato di NETSCOUT Systems Inc.; ElasticSearch®, LogStash®, e Kibana® sono marchi registrati di Elastic N.V. Questo sito non è affiliato, sponsorizzato, o altrimenti associato a nessuna delle entità sopra menzionate e non rappresenta nessuna di queste entità in alcun modo. Tutti i diritti sui marchi e sui nomi di prodotto menzionati sono di proprietà dei rispettivi detentori di copyright. Ogni altro marchio citato appartiene ai propri registranti. MANAGED SERVER® è un marchio registrato a livello Europeo da MANAGED SERVER SRL Via Enzo Ferrari, 9 62012 Civitanova Marche (MC) Italia.

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 in alto