Salta al contenuto

Blog ·

Lo spazio in rack non è capacità

Quanto è pieno quel rack? Ci sono cinque risposte, in cinque forme diverse, e sommarle produce un numero sbagliato in un modo che nessuno può verificare.

Di Provibr

«Quanto è pieno quel rack» suona come una domanda che ha un numero per risposta. Non lo è. Sono cinque domande travestite da una sola, e ogni dashboard che vi risponde con una cifra sola ha scelto in silenzio quale delle cinque intendeva e ha buttato via le altre quattro.

Le cinque sono cose davvero diverse. Quante unità rack sono occupate. Quante delle macchine lì dentro sono realmente in servizio anziché in preparazione o in quarantena. Quante di esse si potrebbero vendere a un cliente domani. Quanta potenza le macchine lì dentro hanno a budget rispetto al budget del rack. E quanta ne stanno assorbendo davvero.

Si può essere al novanta per cento sulla prima e non avere nulla da vendere, perché tutto ciò che sta nel rack è già associato a un cliente. Si può essere al quaranta per cento sulla prima e non poter aggiungere una macchina, perché il budget di potenza è esaurito. Non sono casi limite. Sono lo stato normale di un datacenter che funziona da un po’.

Ecco come abbiamo costruito la risposta sotto forma di cinque letture separate e, cosa più importante, come abbiamo reso difficile a una versione futura di noi stessi farne la media.

Cinque assi, cinque risposte diverse

AsseForma della rispostaDa dove viene
Unità rackoccupate, bloccate e disponibili per lato, più la sequenza libera contigua più lungale assegnazioni attive più la geometria del rack
Stato delle macchineun conteggio per stato logisticole macchine collocate nel rack
Dedicati vendibilimacchine vendibili, escluse, considerateil verdetto di prontezza di ciascuna macchina secondo la politica dell’organizzazione
Potenza configuratawatt riservati rispetto ai watt a budgetle riserve sulle macchine e il budget del rack
Potenza osservataniente, e il motivo è che non c’è alcun sensoreda nessuna parte

Si legga quella tabella come un elenco di tipi di ritorno anziché come un elenco di funzionalità. Il primo asse restituisce una forma per lato. Il secondo restituisce una mappa da stato a conteggio. Il terzo restituisce tre conteggi di macchine. Il quarto restituisce due cifre in watt. Il quinto non restituisce nulla del tutto. Nessuna delle cinque è un numero nudo, e non è un incidente del progetto: è la prima di quattro cose che impediscono a un punteggio combinato di esistere.

Se ogni asse restituisse una percentuale, una media sarebbe una riga di codice. Nessuno la esaminerebbe come una decisione, perché non ne avrebbe l’aspetto. Sembrerebbe una comodità. Rendere le forme di ritorno strutturalmente non confrontabili significa che chi vuole una cifra combinata deve prima scrivere la conversione che le appiattisce, e una conversione si vede in un diff nel modo in cui una divisione non si vede.

Ignoto è per asse, e porta con sé un motivo

La seconda chiusura è che cosa succede quando un asse non sa.

Oggi esistono tre motivi, e sono chiavi anziché frasi, perché il pannello li rende in nove lingue. Il rack non ha un budget di potenza registrato. Una o più delle macchine che contiene non conosce il proprio assorbimento riservato. Non c’è alcun sensore.

La differenza conta perché sono tre conversazioni diverse. Il primo è una lacuna di inserimento dati nella scheda del rack. Il secondo è una lacuna di inserimento dati in una macchina, e dice qualcosa di preciso: la somma che si sta per leggere ha un buco dentro. Il terzo non è affatto una lacuna, è l’assenza di hardware per cui non abbiamo costruito alcun supporto.

L’asse della potenza è il punto in cui questo morde. Se il rack non ha budget, non c’è nulla rispetto a cui misurare e l’asse è ignoto per quel motivo. Se il rack ha un budget ma una macchina collocata non ha una cifra riservata, l’asse è ignoto per un motivo diverso, ed è il caso che un’implementazione ingenua sbaglia. È molto allettante trattare un wattaggio mancante come zero e continuare a sommare. Ne esce un rack che sembra spazioso ed è pieno, che è la risposta sbagliata più costosa che questo sistema possa dare: qualcuno ci programma sopra una consegna.

La regola è che ignoto da un lato rende ignoto l’intero asse. Una somma con un buco dentro non è una somma più piccola.

L’asse che è sempre ignoto

Il quinto asse, la potenza osservata, restituisce ignoto ogni singola volta. In questo prodotto non ci sono unità di distribuzione dell’alimentazione, né linee, né prese, né sensori di temperatura. Non in parte, non dietro un flag: nessuno.

La cosa ovvia da fare è lasciarlo fuori finché non esiste. Lo mettiamo comunque sullo schermo, dicendo che non c’è alcun sensore, e il motivo è ciò che la sua assenza farebbe a chi legge. Con quattro assi sullo schermo, uno dei quali etichettato come potenza, una persona ragionevole conclude che la cifra della potenza sia una misura. Non lo è. È un budget: quello che qualcuno ha digitato in una maschera come assorbimento previsto di una macchina, sommato.

Mostrare il quinto asse come esplicitamente ignoto è ciò che tiene onesto il quarto. Un’affermazione di capacità messa insieme con dati incompleti è esattamente il modo di fallire contro cui è scritta tutta questa parte del progetto, e la difesa più economica è dare un nome alla cosa che non si è misurata.

Rendere il punteggio impossibile anziché vietato

Niente di quanto sopra sopravvive all’incontro con un trimestre affollato se qualcosa non lo fa rispettare. «Abbiamo concordato di non combinarli» è un commento, e un commento non fallisce.

Esiste perciò un test che legge il file sorgente con il compilatore TypeScript e afferma tre cose su di esso.

Nessuna funzione esportata in quel file restituisce un number nudo. Nel modulo non c’è dunque nulla di cui fare la media, nemmeno per sbaglio.

La funzione che assembla le cinque letture non contiene alcun operatore aritmetico, alcun reduce e alcun Math. Mappa sul registro degli assi e chiama ciascun lettore. È tutto ciò che le è consentito fare, e una cifra combinata nascerebbe necessariamente lì, perché è l’unico punto in cui tutte e cinque le letture sono contemporaneamente visibili. Questa è la terza chiusura.

E le parole stesse sono vietate: una scansione rifiuta healthScore, rackHealth, overallScore, combinedScore e capacityScore in qualsiasi combinazione di maiuscole e minuscole. L’ultima è grossolana e l’abbiamo tenuta lo stesso, perché il guasto da cui protegge è qualcuno che vuole rendersi utile alle quattro e mezza di un venerdì.

Il senso di scriverlo così non è che una regola non si possa infrangere. È che infrangerla richiede di cancellare un test, e cancellare un test è una riga in una pull request su cui qualcuno farà una domanda. Aggiungere una divisione fra due numeri che c’erano già, no.

Abbiamo dimostrato la guardia rossa prima di fidarcene, in due modi distinti: un’espressione aritmetica dentro la funzione che assembla, e una funzione esportata che restituisce un numero. Entrambe sono state poi tolte. Una guardia che non ha mai fallito è una guardia di cui non si sono verificati i selettori.

Aggiungere un asse deve essere un errore di compilazione

I cinque assi vivono in un unico registro. I produttori vivono in un record indicizzato su quel registro, quindi un sesto asse senza lettore è un errore di tipo anziché una riga che manca in silenzio. Questa è la quarta.

Questo copre il codice. Non copre lo schermo, e lo schermo è il posto in cui un asse mancante è più pericoloso: semplicemente non compare, e la tabella sembra completa. Perciò una seconda guardia ricava l’elenco degli assi dal registro e pretende, per ciascuno, un’etichetta e un suggerimento in tutti e nove i cataloghi, un ramo di rendering proprio nel componente, e un ramo per l’ignoto con una frase tradotta per ogni motivo del registro dei motivi.

Quella guardia si è ripagata subito. Ha trovato che l’asse della potenza osservata non era nominato da nessuna parte nel componente di rendering, che è esattamente lo stato in cui un asse produce una cella vuota invece di una spiegazione, e una cella vuota si legge come zero. Scrivere test per asse non avrebbe potuto trovarlo, per lo stesso motivo per cui un test per caso non può trovare un caso che manca: si sarebbe dovuto sapere già che quell’asse esisteva.

Lo stesso ragionamento vale per la traduzione. Un codice di motivo senza una frase dietro è uno spazio bianco in una lingua che nessuno in squadra legge, e nove cataloghi sono un mucchio di posti in cui uno spazio bianco può nascondersi.

Che cosa metteremmo per iscritto

  1. Decidere in che cosa si misura ogni risposta prima di decidere che aspetto abbia. Unità che non si possono sommare sono la difesa più economica che si costruirà mai.
  2. Dare all’ignoto un motivo proprio su ciascun asse, e non lasciare mai che un dato mancante diventi uno zero lungo la strada verso una somma.
  3. Tenere sullo schermo l’asse che non si può misurare, etichettato come non misurato, così che l’asse accanto non venga scambiato per una misura.
  4. Mettere il divieto in un test che legge il sorgente, non in un commento, e dimostrare il test rosso una volta prima di farci affidamento.
  5. Ricavare la guardia dal registro, così che aggiungere un sesto asse sia rumoroso nel codice e sullo schermo invece che silenzioso in entrambi.

Per essere chiari su dove sta la cosa: il lavoro sulla logistica di datacenter sta dietro un flag di rollout disattivato per impostazione predefinita e, sopra di esso, dietro un’impostazione per organizzazione, quindi niente di tutto questo è qualcosa che si possa andare ad acquistare oggi. È la forma che costruiremmo di nuovo, e i cinque assi sono la parte di cui siamo più sicuri. La domanda collegata di chi sia autorizzato a scrivere dentro un rack, e di che cosa impedisca davvero a due persone di assegnarsi lo stesso slot, sta in l’unico limite reale all’occupazione di un rack.

Dal lavoro sul datacenter di Provibr.

Inizi con un host e un agente

Crei un account, installi l’agente con un solo comando e colleghi il suo primo host Proxmox. Il periodo di prova dura 14 giorni e non chiede alcun dato di pagamento.