Spesso, un'installazione della nostra applicazione basata sul sito debian-stable viene eseguita in una macchina virtuale, in genere in VMware ESXi. In generale, non abbiamo visibilità o influenza sul loro ambiente di virtualizzazione e non abbiamo accesso, ad esempio, al client VMware vCenter o equivalente. Mi concentro su VMware qui, perché questo è di gran lunga il più comune che vediamo.
Vorremmo:
- Informa l'amministratore VMware di un cliente: puoi eseguire la nostra applicazione, ad es. Nel tuo ambiente VMware ESX, purché soddisfi i criteri di prestazione X, Y e Z.
- Essere in grado di determinare se i criteri X, Y e Z sono effettivamente soddisfatti continuamente (ad es. Anche in questo momento ), anche su un sistema in esecuzione (non possiamo fermare la nostra applicazione ed eseguire benchmark, e un benchmark iniziale non sarà sufficiente, poiché le prestazioni in gli ambienti virtuali cambiano nel tempo).
- Avere la certezza che se i criteri X, Y e Z sono soddisfatti, avremo adeguate risorse HW virtuali per eseguire la nostra applicazione con prestazioni soddisfacenti.
Cosa sono X, Y e Z?
Abbiamo visto più volte che quando ci sono problemi di prestazioni, il problema non è con la nostra applicazione, ma con l'ambiente di virtualizzazione. Ad esempio, un'altra macchina virtuale utilizza tonnellate di CPU, memoria o SAN su cui sono effettivamente archiviati i dischi e viene utilizzata pesantemente da qualcosa di diverso dalla nostra applicazione. Al momento non abbiamo modo di provarlo o smentirlo.
Teoricamente potrebbe anche essere possibile che a volte la nostra applicazione sia lenta ... ;-)
Come si determina la causa principale dei nostri problemi di prestazioni: l'ambiente virtuale o la nostra applicazione?
Esistono in genere 3 aree per problemi di prestazioni CPU, memoria e DISK I / O.
processore
In ad esempio VMware, l'amministratore può specificare Reservation and Limit, espresso in MHz, ma ad esempio 512 MHz su un host ESX è esattamente uguale a 512 MHz su un altro host ESX, possibilmente in un cluster ESX completamente diverso?
E come si misura se lo si ottiene effettivamente? Mentre la nostra applicazione è in esecuzione, possiamo forse vedere che siamo al 212% di utilizzo della CPU su 4 CPU. È perché la nostra applicazione sta facendo molto o perché un'altra macchina virtuale sullo stesso host sta eseguendo un'attività intensiva della CPU e sta utilizzando tutta la CPU?
Memoria (in mongolfiera?)
Se chiediamo, ad esempio, 16 GB di RAM, che è spesso configurato, ma a causa della mongolfiera , in realtà otteniamo solo 4 GB e, a sorpresa, la nostra applicazione funziona male.
Si può chiedere agli strumenti VMware informazioni sull'attuale mongolfiera, ma scopriamo che spesso si trova (o almeno è impreciso). Abbiamo visto esempi in cui il sistema operativo ritiene che ci sia 16 GB di RAM totale, la somma della memoria residente (RSS) di tutti i processi è 4 GB di RAM, ma c'è solo 2 GB di RAM libera, anche quando gli strumenti VMware ci dicono che c'è 0 ballooning: - (
Inoltre, l'aggiunta di RSS insieme non è valida, in quanto potrebbe essere facilmente condivisa la RAM, ad esempio la memoria di copia su scrittura, quindi 512 MB + 512 MB non significano necessariamente 1 GB, ma potrebbero significare qualcosa in meno. Quindi non si può semplicemente sottrarre RSS da tutti i processi per ottenere una misura di quanta RAM dovrebbe essere libera e quindi rilevare il ballooning in modo affidabile. Si possono rilevare alcuni casi di mongolfiera, ma ci sono altri casi in cui la mongolfiera è attiva, ma non rilevabile con questo metodo.
I / O del disco
Suppongo che nel tempo potremmo rappresentare graficamente il numero di letture e scritture su disco, il numero di byte letti e scritti e l'IO in attesa%. Ma questo ci darà un quadro preciso dell'I / O del disco? Immagino che se c'è un minatore di bitcoin in esecuzione in un'altra VM che utilizza tutta la CPU, il nostro% di attesa IO aumenterà, anche se la SAN sottostante offre esattamente le stesse prestazioni, semplicemente perché le risorse della nostra CPU diminuiscono, e quindi IO attendere ( che è misurato in% ) sale.
Quindi, in sintesi, quale lingua possiamo usare per descrivere, ad esempio, un amministratore VMware, quali prestazioni abbiamo bisogno, in modo portatile e misurabile?
"It runs fine with x, y, and z"
non è abbastanza preciso. Devi essere in grado di dire ai tuoi clienti esattamente ciò che richiede la tua applicazione. Se ti danno quelle risorse e l'applicazione funziona male, allora la domanda non lo è "What do we need from a resource perspective?"
, ma"Why is it performing poorly even though the proper resources have been allocated?"