Recentemente presso eXact lab un cliente ci ha contattato perché il suo software funzionava troppo lentamente per la sua applicazione industriale e la deadline per una release importante si stava avvicinando rapidamente. La richiesta prevedeva l’analisi del sistema, l’identificazione del collo di bottiglia e l’ottimizzazione in tempi molto stretti.

Il sistema, scritto in diversi linguaggi, è strutturato in un paio di dozzine di microservizi. Alcuni servizi eseguono routine di elaborazione dati ad uso intensivo di CPU e GPU, rendendoli simili a carichi di lavoro di calcolo ad alte prestazioni (che, tra l’altro, è la nostra competenza!). Intorno al carico di lavoro principale si trovano numerosi servizi ausiliari il cui ruolo è recuperare i dati e trasmetterli in modo efficiente alle applicazioni di elaborazione. Anche se non era la nostra preoccupazione principale, dovevamo considerare il loro potenziale impatto sul sistema generale, ad esempio occupando l’IO del disco per lunghi periodi di tempo.

Ma come possiamo stabilire dove si trova il problema tra decine di servizi diversi distribuiti su molti contenitori? E come isoliamo i processi che appartengono al sistema sotto indagine da tutto ciò che accade sulla stessa macchina? Un’ulteriore difficoltà è che non possiamo riprodurre i carichi di lavoro di produzione isolatamente: il problema va risolto su questo.

Come profilare microservizi

Era evidente che dovevamo raccogliere dati per identificare il collo di bottiglia e il tempo era una risorsa molto limitata. Dopo alcune prove iniziali con strumenti standard come top, ps e simili e considerando diversi strumenti meno standard, abbiamo deciso che questo era uno di quei rari casi in cui era semplicemente più veloce elaborare una soluzione ad hoc.

Avevamo bisogno di poter raccogliere profili per tutti i servizi all’interno del sistema del cliente e di poter salvare i dati per ulteriori analisi e grafici. Poiché la modifica dei parametri spesso richiede un rebuild del codice e un riavvio, gli hash del contenitore possono cambiare abbastanza spesso, quindi guardare i cgroup non sarebbe ottimale.

La soluzione è stata sviluppare un semplice script Python che consente di filtrare tutti e solo i contenitori appartenenti a uno specifico docker compose e di ispezionare l’ID di processo (PID) dell’entrypoint. Utilizzando la libreria psutil siamo stati quindi in grado di campionare le metriche di interesse, come l’utilizzo della CPU e della memoria.

Come tocco finale, per facilitare il nostro lavoro su una macchina remota, abbiamo preparato una rapida dashboard con un trattino per tracciare i dati e visualizzarli su qualsiasi browser che possa raggiungere la macchina tramite http.

Ecco cmon

Quindi oggi rilasciamo cmon, il container monitor, affinché tutti possano utilizzarlo liberamente. Riconosciamo sicuramente che si tratta di uno script semplice preparato in un’ora o due, ma lo abbiamo comunque trovato utile e speriamo che sia altrettanto utile per voi.

Una volta installato come spiegato nel README, eseguilo semplicemente senza argomenti per raccogliere le metriche su tutti i contenitori in esecuzione o, in alternativa, passando -c <compose_label> per includere solo i contenitori di misurazione appartenenti al Compose fornito. Quando hai finito, basta CTRL-C e cmon salverà le misurazioni in un file HDF5 (per impostazione predefinita il nome del file di output è il timestamp corrente, ma è possibile sovrascriverlo con -o).

Epilogo

Allora, come è andata con il nostro cliente? I due grafici seguenti estratti dalla dashboard di cmon dicono tutto! Grazie a cmon abbiamo rapidamente identificato il servizio più affamato, trovato rapidamente la causa principale del problema e risolto il problema. L’utilizzo delle risorse è diminuito, consentendo così l’esecuzione del servizio entro il budget di tempo consentito.

Il Cliente è rimasto soddisfatto e ha potuto procedere al rilascio della nuova versione del proprio prodotto. Ancora un’altra storia di successo per eXact lab!

eXact lab ti aspetta!

eXact lab non vede l’ora di averti nel nostro portafoglio di clienti soddisfatti. Abbiamo un’esperienza decennale nel calcolo ad alte prestazioni sia dal lato software che operativo, oltre a una comprovata competenza nella fornitura di soluzioni di gestione dei dati su misura. Contattaci a info@exact-lab.it.

Ringraziamenti

Ringraziamo il nostro cliente per aver autorizzato la pubblicazione del presente caso studio.