Risolvere i problemi relativi alle prestazioni e isolare i colli di bottiglia in Linux
Si applica a: ✔️ macchine virtuali Linux
Problemi di prestazioni e colli di bottiglia
Quando si verificano problemi relativi alle prestazioni in diversi sistemi operativi o applicazioni, ogni problema richiede un approccio univoco per poter essere risolto. CPU, memoria, rete e input/output (I/O) rappresentano le aree chiave in cui si verifica il problema. Ognuna di queste aree genera sintomi diversi (a volte contemporaneamente) e richiede una diagnosi e una soluzione diversa.
I problemi di prestazioni possono essere causati da una configurazione errata dell'applicazione o dell'installazione. Un esempio è un'applicazione Web con un livello di memorizzazione nella cache non configurato correttamente. Questa situazione attiva più richieste che tornano al server di origine anziché essere gestite da una cache.
In un altro esempio, il log di rollforward di un database MySQL o MariaDB si trova sul disco del sistema operativo o su un disco che non soddisfa i requisiti del database. In questo scenario è possibile che venga visualizzato un minor numero di transazioni al secondo (TPS) a causa della concorrenza per le risorse e di tempi di risposta più elevati (latenza).
Se si comprende appieno il problema, è possibile identificare meglio dove cercare lo stack (CPU, memoria, rete, I/O). Per risolvere i problemi di prestazioni, è necessario stabilire una baseline che consente di confrontare le metriche dopo aver apportato modifiche e di valutare se le prestazioni complessive sono migliorate.
La risoluzione dei problemi di prestazioni di una macchina virtuale non è diversa dalla risoluzione di un problema di prestazioni in un sistema fisico. Si tratta di determinare quale risorsa o componente sta causando un collo di bottiglia nel sistema.
È importante comprendere che i colli di bottiglia esistono sempre. La risoluzione dei problemi relativi alle prestazioni è tutta la comprensione della posizione in cui si verifica un collo di bottiglia e come spostarla in una risorsa meno offensiva.
Questa guida consente di individuare e risolvere i problemi di prestazioni in Azure Macchine virtuali nell'ambiente Linux.
Ottenere puntatori alle prestazioni
È possibile ottenere puntatori alle prestazioni che confermano o negano se il vincolo di risorsa esiste.
A seconda della risorsa analizzata, molti strumenti consentono di ottenere dati relativi a tale risorsa. La tabella seguente include esempi per le risorse principali.
Conto risorse | Strumento |
---|---|
CPU | top , htop , mpstat , pidstat vmstat |
Disco | iostat , iotop , vmstat |
Rete | ip , vnstat , iperf3 |
Memoria | free , top , vmstat |
Le sezioni seguenti illustrano i puntatori e gli strumenti che è possibile usare per cercare le risorse principali.
Risorsa CPU
Una determinata percentuale di CPU viene usata o meno. Analogamente, i processi impiegano tempo nella CPU (ad esempio l'80% usr
di utilizzo) o non (ad esempio, l'80% di inattività). Lo strumento principale per verificare che l'utilizzo della CPU sia top
.
Lo top
strumento viene eseguito in modalità interattiva per impostazione predefinita. Aggiorna ogni secondo e mostra i processi ordinati in base all'utilizzo della CPU:
[root@rhel78 ~]$ top
top - 19:02:00 up 2:07, 2 users, load average: 1.04, 0.97, 0.96
Tasks: 191 total, 3 running, 188 sleeping, 0 stopped, 0 zombie
%Cpu(s): 29.2 us, 22.0 sy, 0.0 ni, 48.5 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 7990204 total, 6550032 free, 434112 used, 1006060 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7243640 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22804 root 20 0 108096 616 516 R 99.7 0.0 1:05.71 dd
1680 root 20 0 410268 38596 5644 S 3.0 0.5 2:15.10 python
772 root 20 0 90568 3240 2316 R 0.3 0.0 0:08.11 rngd
1472 root 20 0 222764 6920 4112 S 0.3 0.1 0:00.55 rsyslogd
10395 theuser 20 0 162124 2300 1548 R 0.3 0.0 0:11.93 top
1 root 20 0 128404 6960 4148 S 0.0 0.1 0:04.97 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.56 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.07 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:06.00 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.05 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.04 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:00.21 ksoftirqd/1
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
18 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kdevtmpfs
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
Esaminare ora la riga del dd
processo da tale output:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22804 root 20 0 108096 616 516 R 99.7 0.0 1:05.71 dd
Si può notare che il processo sta consumando il dd
99,7% della CPU.
Note
È possibile visualizzare l'utilizzo per CPU nello
top
strumento selezionando 1.Lo
top
strumento visualizza un utilizzo totale superiore al 100% se il processo è multithreading e si estende su più CPU.
Un altro riferimento utile è la media del carico. La media del carico mostra un carico medio del sistema in intervalli di 1 minuto, 5 minuti e 15 minuti. Il valore indica il livello di carico del sistema. L'interpretazione di questo valore dipende dal numero di CPU disponibili. Ad esempio, se la media del carico è 2 in un sistema con una CPU, il sistema viene caricato in modo che i processi inizino a accodare. Se è presente una media di carico pari a 2 in un sistema a quattro CPU, l'utilizzo complessivo della CPU è circa del 50%.
Note
È possibile ottenere rapidamente il numero di CPU eseguendo il nproc
comando .
Nell'esempio precedente la media del carico è pari a 1,04. Si tratta di un sistema a due CPU, vale a dire che l'utilizzo della CPU è circa il 50%. È possibile verificare questo risultato se si nota il valore della CPU inattiva del 48,5%. Nell'output del top
comando il valore della CPU inattiva viene visualizzato prima dell'etichetta id
.
Usare la media del carico come una rapida panoramica delle prestazioni del sistema.
Eseguire il uptime
comando per ottenere la media del carico.
Risorsa disco (I/O)
Quando si esaminano i problemi di prestazioni di I/O, i termini seguenti consentono di comprendere dove si verifica il problema.
Termine | Descrizione |
---|---|
Dimensioni I/O | Quantità di dati elaborati per transazione, in genere definiti in byte. |
Thread I/O | Numero di processi che interagiscono con il dispositivo di archiviazione. Questo valore dipende dall'applicazione. |
Dimensioni blocco | Dimensioni di I/O definite dal dispositivo di blocco di backup. |
Dimensioni settore | Dimensioni di ognuno dei settori del disco. Questo valore è in genere di 512 byte. |
IOPS | Operazioni di output di input al secondo. |
Latenza | Tempo necessario per il completamento di un'operazione di I/O. Questo valore viene in genere misurato in millisecondi (ms). |
Velocità effettiva | Funzione della quantità di dati trasferiti in un intervallo di tempo specifico. Questo valore viene in genere definito come megabyte al secondo (MB/s). |
IOPS
Operazioni di output di input al secondo (IOPS) è una funzione del numero di operazioni di input e output (I/O) misurate in un determinato periodo di tempo (in questo caso, secondi). Le operazioni di I/O possono essere letture o scritture. Le eliminazioni o le eliminazioni possono anche essere conteggiate come operazione sul sistema di archiviazione. Ogni operazione ha un'unità di allocazione che corrisponde ugualmente alle dimensioni di I/O.
Le dimensioni di I/O vengono in genere definite a livello di applicazione come quantità di dati scritti o letti per transazione. Una dimensione di I/O comunemente usata è 4K. Tuttavia, una dimensione di I/O inferiore che contiene più thread produce un valore di I/O superiore. Poiché ogni transazione può essere completata relativamente veloce (a causa delle dimensioni ridotte), un I/O più piccolo consente il completamento di più transazioni nello stesso periodo di tempo.
Al contrario, si supponga di avere lo stesso numero di thread, ma usare un I/O più grande. Le operazioni di I/O al secondo diminuiscono perché il completamento di ogni transazione richiede più tempo. Tuttavia, la velocità effettiva aumenta.
Si consideri l'esempio seguente:
1.000 operazioni di I/O al secondo significa che per ogni secondo, completare un migliaio di operazioni. Ogni operazione richiede circa un millisecondo. Ci sono 1.000 millisecondi in un secondo. In teoria, ogni transazione ha circa un millisecondo per terminare o circa una latenza di 1 ms.
Conoscendo il valore IOSize e le operazioni di I/O al secondo, è possibile calcolare la velocità effettiva moltiplicando IOSize per operazioni di I/O al secondo.
Ad esempio:
1.000 operazioni di I/O al secondo a 4K IOSize = 4.000 KB/s o 4 MB/s (3,9 MB/s per essere precisi)
1.000 operazioni di I/O al secondo a 1M IOSize = 1.000 MB/s o 1 GB/s (976 MB/s per essere precisi)
Una versione più equazione-friendly può essere scritta come segue:
IOPS * IOSize = IOSize/s (Throughput)
Velocità effettiva
A differenza delle operazioni di I/O al secondo, la velocità effettiva è una funzione della quantità di dati nel tempo. Ciò significa che durante ogni secondo, una determinata quantità di dati viene scritta o letta. Questa velocità viene misurata in <tempo> di quantità di dati>/<o megabyte al secondo (MB/s).
Se si conoscono i valori di velocità effettiva e IOSize, è possibile calcolare le operazioni di I/O al secondo dividendo la velocità effettiva per IOSize. È consigliabile normalizzare le unità con la connotazione più piccola. Ad esempio, se IOSize è definito in kilobyte (kb), la velocità effettiva deve essere convertita.
Il formato dell'equazione viene scritto come segue:
Throughput / IOSize = IOPS
Per inserire questa equazione nel contesto, prendere in considerazione una velocità effettiva di 10 MB/s in un IOSize di 4K. Quando si immettono i valori nell'equazione, il risultato è 10.240/4=2.560 operazioni di I/O al secondo.
Note
10 MB è esattamente uguale a 10.240 KB.
Latenza
La latenza è la misura della quantità media di tempo impiegato per il completamento di ogni operazione. Le operazioni di I/O al secondo e la latenza sono correlate perché entrambi i concetti sono una funzione del tempo. Ad esempio, a 100 operazioni di I/O al secondo, ogni operazione richiede circa 10 ms per il completamento. Tuttavia, la stessa quantità di dati potrebbe essere recuperata anche più rapidamente con operazioni di I/O al secondo inferiori. La latenza è nota anche come tempo di ricerca.
Informazioni sull'output iostat
Come parte del pacchetto sysstat, lo iostat
strumento fornisce informazioni dettagliate sulle metriche di utilizzo e prestazioni del disco. iostat
consente di identificare i colli di bottiglia correlati al sottosistema del disco.
È possibile eseguire iostat
in un semplice comando. La sintassi di base è la seguente:
iostat <parameters> <time-to-refresh-in-seconds> <number-of-iterations> <block-devices>
I parametri determinano le informazioni iostat
fornite. Senza avere alcun parametro di comando, iostat
visualizza i dettagli di base:
[host@rhel76 ~]$ iostat
Linux 3.10.0-957.21.3.el7.x86_64 (rhel76) 08/05/2019 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
41.06 0.00 30.47 21.00 0.00 7.47
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 182.77 5072.69 1066.64 226090 47540
sdd 2.04 42.56 22.98 1897 1024
sdb 12.61 229.23 96065.51 10217 4281640
sdc 2.56 46.16 22.98 2057 1024
md0 2.67 73.60 45.95 3280 2048
Per impostazione predefinita, iostat
visualizza i dati per tutti i dispositivi a blocchi esistenti, anche se vengono forniti dati minimi per ogni dispositivo. Sono disponibili parametri che consentono di identificare i problemi fornendo dati estesi, ad esempio velocità effettiva, operazioni di I/O al secondo, dimensioni della coda e latenza.
Eseguire iostat
specificando i trigger:
sudo iostat -dxctm 1
Per espandere ulteriormente i iostat
risultati, usare i parametri seguenti.
Parametro | Azione |
---|---|
-d |
Visualizzare il report sull'utilizzo del dispositivo. |
-x |
Visualizzare le statistiche estese. Questo parametro è importante perché fornisce operazioni di I/O al secondo, latenza e dimensioni della coda. |
-c |
Visualizzare il report sull'utilizzo della CPU. |
-t |
Stampare l'ora per ogni report visualizzato. Questo parametro è utile per le esecuzioni lunghe. |
-m |
Visualizzare le statistiche in megabyte al secondo, un formato più leggibile. |
Il numero 1
nel comando indica iostat
di aggiornare ogni secondo. Per arrestare l'aggiornamento, selezionare CTRL+C.
Se si includono i parametri aggiuntivi, l'output sarà simile al testo seguente:
[host@rhel76 ~]$ iostat -dxctm 1
Linux 3.10.0-957.21.3.el7.x86_64 (rhel76) 08/05/2019 _x86_64_ (1 CPU)
08/05/2019 07:03:36 PM
avg-cpu: %user %nice %system %iowait %steal %idle
3.09 0.00 2.28 1.50 0.00 93.14
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.02 0.52 9.66 2.46 0.31 0.10 70.79 0.27 23.97 6.68 91.77 2.94 3.56
sdd 0.00 0.00 0.12 0.00 0.00 0.00 64.20 0.00 6.15 6.01 12.50 4.44 0.05
sdb 0.00 22.90 0.47 0.45 0.01 5.74 12775.08 0.17 183.10 8.57 367.68 8.01 0.74
sdc 0.00 0.00 0.15 0.00 0.00 0.00 54.06 0.00 6.46 6.24 14.67 5.64 0.09
md0 0.00 0.00 0.15 0.01 0.00 0.00 89.55 0.00 0.00 0.00 0.00 0.00 0.00
Informazioni sui valori
Le colonne principali dell'output iostat
sono illustrate nella tabella seguente.
Colonna | Descrizione |
---|---|
r/s |
Letture al secondo (IOPS) |
w/s |
Scritture al secondo (IOPS) |
rMB/s |
Lettura di megabyte al secondo (velocità effettiva) |
wMB/s |
Scrivere megabyte al secondo (velocità effettiva) |
avgrq-sz |
Dimensioni medie di I/O nei settori; moltiplicare questo numero per le dimensioni del settore, che in genere è di 512 byte, per ottenere le dimensioni di I/O in byte (I/O Size) |
avgqu-sz |
Dimensioni medie della coda (numero di operazioni di I/O in coda in attesa di essere servite) |
await |
Tempo medio in millisecondi per le operazioni di I/O gestite dal dispositivo (latenza) |
r_await |
Tempo medio di lettura in millisecondi per le operazioni di I/O gestite dal dispositivo (latenza) |
w_await |
Tempo medio di lettura in millisecondi per le operazioni di I/O gestite dal dispositivo (latenza) |
I dati presentati da iostat
sono informativi, ma la presenza di determinati dati in determinate colonne non significa che si sia verificato un problema. I dati da iostat
devono essere sempre acquisiti e analizzati per individuare possibili colli di bottiglia. Una latenza elevata potrebbe indicare che il disco raggiunge un punto di saturazione.
Note
È possibile usare il pidstat -d
comando per visualizzare le statistiche di I/O per ogni processo.
Risorsa di rete
Le reti possono riscontrare due colli di bottiglia principali: larghezza di banda ridotta e latenza elevata.
È possibile usare vnstat
per acquisire in tempo reale i dettagli della larghezza di banda. Tuttavia, vnstat
non è disponibile in tutte le distribuzioni. Lo strumento ampiamente disponibile iptraf-ng
è un'altra opzione per visualizzare il traffico dell'interfaccia in tempo reale.
Latenza di rete
La latenza di rete in due sistemi diversi può essere determinata usando un semplice ping
comando in Internet Control Message Protocol (ICMP):
[root@rhel78 ~]# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=53 time=5.33 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=53 time=5.29 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=53 time=5.29 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=53 time=5.24 ms
^C
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 5.240/5.291/5.339/0.035 ms
Per arrestare l'attività ping, selezionare CTRL+C.
Larghezza di banda della rete
È possibile verificare la larghezza di banda di rete usando strumenti come iperf3
. Lo iperf3
strumento funziona sul modello server/client in cui viene avviata l'applicazione specificando il -s
flag nel server. I client si connettono quindi al server specificando l'indirizzo IP o il nome di dominio completo (FQDN) del server insieme al -c
flag . I frammenti di codice seguenti illustrano come usare lo iperf3
strumento nel server e nel client.
Server
root@ubnt:~# iperf3 -s ----------------------------------------------------------- Server listening on 5201 -----------------------------------------------------------
Client
root@ubnt2:~# iperf3 -c 10.1.0.4 Connecting to host 10.1.0.4, port 5201 [ 5] local 10.1.0.4 port 60134 connected to 10.1.0.4 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 5.78 GBytes 49.6 Gbits/sec 0 1.25 MBytes [ 5] 1.00-2.00 sec 5.81 GBytes 49.9 Gbits/sec 0 1.25 MBytes [ 5] 2.00-3.00 sec 5.72 GBytes 49.1 Gbits/sec 0 1.25 MBytes [ 5] 3.00-4.00 sec 5.76 GBytes 49.5 Gbits/sec 0 1.25 MBytes [ 5] 4.00-5.00 sec 5.72 GBytes 49.1 Gbits/sec 0 1.25 MBytes [ 5] 5.00-6.00 sec 5.64 GBytes 48.5 Gbits/sec 0 1.25 MBytes [ 5] 6.00-7.00 sec 5.74 GBytes 49.3 Gbits/sec 0 1.31 MBytes [ 5] 7.00-8.00 sec 5.75 GBytes 49.4 Gbits/sec 0 1.31 MBytes [ 5] 8.00-9.00 sec 5.75 GBytes 49.4 Gbits/sec 0 1.31 MBytes [ 5] 9.00-10.00 sec 5.71 GBytes 49.1 Gbits/sec 0 1.31 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 57.4 GBytes 49.3 Gbits/sec 0 sender [ 5] 0.00-10.04 sec 57.4 GBytes 49.1 Gbits/sec receiver iperf Done.
Nella tabella seguente sono illustrati alcuni parametri comuni iperf3
per il client.
Parametro | Descrizione |
---|---|
-P |
Specifica il numero di flussi client paralleli da eseguire. |
-R |
Inverte il traffico. Per impostazione predefinita, il client invia i dati al server. |
--bidir |
Testa sia il caricamento che il download. |
Risorsa di memoria
La memoria è un'altra risorsa per la risoluzione dei problemi da controllare perché le applicazioni potrebbero o meno usare una parte di memoria. È possibile usare strumenti come free
e top
per esaminare l'utilizzo complessivo della memoria e determinare la quantità di memoria utilizzata da vari processi:
[root@rhel78 ~]# free -m
total used free shared buff/cache available
Mem: 7802 435 5250 9 2117 7051
Swap: 0 0 0
Nei sistemi Linux è comune vedere l'utilizzo della memoria del 99%. Nell'output free
è presente una colonna denominata buff/cache
. Il kernel Linux usa memoria libera (inutilizzata) per memorizzare nella cache le richieste di I/O per ottenere tempi di risposta migliori. Questo processo è denominato cache di pagine. Durante l'utilizzo elevato della memoria (scenari in cui la memoria è insufficiente), il kernel restituisce la memoria usata per la cache delle pagine in modo che le applicazioni possano usare tale memoria.
Nell'output free
la colonna disponibile indica la quantità di memoria disponibile per i processi da utilizzare. Questo valore viene calcolato aggiungendo le quantità di memoria buff/cache e memoria libera.
È possibile configurare il top
comando per ordinare i processi in base all'utilizzo della memoria. Per impostazione predefinita, top
ordina per percentuale CPU (%). Per ordinare in base all'utilizzo della memoria (%), selezionare MAIUSC+M quando si esegue .top
Il testo seguente mostra l'output del top
comando :
[root@rhel78 ~]# top
top - 22:40:15 up 5:45, 2 users, load average: 0.08, 0.08, 0.06
Tasks: 194 total, 2 running, 192 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.3 us, 41.8 sy, 0.0 ni, 45.4 id, 0.0 wa, 0.0 hi, 0.5 si, 0.0 st
KiB Mem : 7990204 total, 155460 free, 5996980 used, 1837764 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1671420 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
45283 root 20 0 5655348 5.3g 512 R 99.7 69.4 0:03.71 tail
3124 omsagent 20 0 415316 54112 5556 S 0.0 0.7 0:30.16 omsagent
1680 root 20 0 413500 41552 5644 S 3.0 0.5 6:14.96 python
[...]
La RES
colonna indica la memoria residente. Rappresenta l'utilizzo effettivo del processo. Lo top
strumento fornisce un output simile a free
in termini di kilobyte (KB).
L'utilizzo della memoria può aumentare di più del previsto se l'applicazione riscontra perdite di memoria. In uno scenario di perdita di memoria, le applicazioni non possono liberare pagine di memoria non più usate.
Ecco un altro comando usato per visualizzare i principali processi di utilizzo della memoria:
ps -eo pid,comm,user,args,%cpu,%mem --sort=-%mem | head
Il testo seguente mostra l'output di esempio del comando :
[root@rhel78 ~]# ps -eo pid,comm,user,args,%cpu,%mem --sort=-%mem | head
PID COMMAND USER COMMAND %CPU %MEM
45922 tail root tail -f /dev/zero 82.7 61.6
[...]
È possibile identificare l'utilizzo della memoria dagli eventi di interruzione della memoria (OOM), come illustrato nell'output di esempio seguente:
Jun 19 22:42:14 rhel78 kernel: Out of memory: Kill process 45465 (tail) score 902 or sacrifice child
Jun 19 22:42:14 rhel78 kernel: Killed process 45465 (tail), UID 0, total-vm:7582132kB, anon-rss:7420324kB, file-rss:0kB, shmem-rss:0kB
L'OOM viene richiamato dopo l'utilizzo di RAM (memoria fisica) e SWAP (disco).
Note
È possibile usare il pidstat -r
comando per visualizzare le statistiche di memoria per processo.
Determinare se esiste un vincolo di risorsa
È possibile determinare se esiste un vincolo usando gli indicatori precedenti e conoscendo la configurazione corrente. Il vincolo può essere confrontato con la configurazione esistente.
Di seguito è riportato un esempio di vincolo del disco:
Una macchina virtuale D2s_v3 è in grado di 48 MB/s di velocità effettiva non memorizzata nella cache. Per questa macchina virtuale, è collegato un disco P30 in grado di supportare 200 MB/s. L'applicazione richiede almeno 100 MB/s.
In questo esempio la risorsa di limitazione è la velocità effettiva della macchina virtuale complessiva. Il requisito dell'applicazione rispetto a quello che può fornire la configurazione del disco o della macchina virtuale indica la risorsa che vincola.
Se l'applicazione richiede <una risorsa> measurement1<>e la configurazione corrente per< la risorsa> è in grado di fornire solo <la misura2>, questo requisito potrebbe essere un fattore di limitazione.
Definire la risorsa di limitazione
Dopo aver determinato una risorsa come fattore di limitazione nella configurazione corrente, identificare come può essere modificata e come influisce sul carico di lavoro. Esistono situazioni in cui potrebbe esistere una limitazione delle risorse a causa di una misura di risparmio sui costi, ma l'applicazione è ancora in grado di gestire il collo di bottiglia senza problemi.
Ad esempio:
Se l'applicazione richiede 128 GB (misurazione) di RAM (risorsa) e la configurazione corrente per RAM (risorsa) è in grado di fornire solo 64 GB (misurazione), questo requisito potrebbe essere un fattore di limitazione.
È ora possibile definire la risorsa di limitazione ed eseguire azioni in base a tale risorsa. Lo stesso concetto si applica ad altre risorse.
Se queste risorse di limitazione sono previste come misura di risparmio sui costi, l'applicazione dovrebbe aggirare i colli di bottiglia. Tuttavia, se esistono le stesse misure di risparmio sui costi e l'applicazione non è in grado di gestire facilmente la mancanza di risorse, questa configurazione potrebbe causare problemi.
Apportare modifiche in base ai dati ottenuti
La progettazione per le prestazioni non riguarda la risoluzione dei problemi, ma la comprensione del punto in cui può verificarsi il collo di bottiglia successivo e come risolverlo. I colli di bottiglia esistono sempre e possono essere spostati solo in una posizione diversa della progettazione.
Ad esempio, se l'applicazione è limitata dalle prestazioni del disco, è possibile aumentare le dimensioni del disco per consentire una maggiore velocità effettiva. Tuttavia, la rete diventa quindi il collo di bottiglia successivo. Poiché le risorse sono limitate, non esiste una configurazione ideale ed è necessario risolvere regolarmente i problemi.
Ottenendo i dati nei passaggi precedenti, è ora possibile apportare modifiche in base ai dati effettivi e misurabili. È anche possibile confrontare queste modifiche con la baseline misurata in precedenza per verificare che esista una differenza tangibile.
Si consideri l'esempio seguente:
Quando si ottiene una linea di base durante l'esecuzione dell'applicazione, si è determinato che il sistema ha un utilizzo costante della CPU del 100% in una configurazione di due CPU. Si è osservata una media di carico pari a 4. Ciò significava che il sistema stava accodando le richieste. Una modifica a un sistema a 8 CPU ha ridotto l'utilizzo della CPU al 25% e la media del carico è stata ridotta a 2 quando è stato applicato lo stesso carico.
In questo esempio esiste una differenza misurabile quando si confrontano i risultati ottenuti con le risorse modificate. Prima della modifica, era presente un vincolo di risorsa non crittografato. Tuttavia, dopo la modifica, ci sono risorse sufficienti per aumentare il carico.
Eseguire la migrazione dall'ambiente locale al cloud
Le migrazioni da una configurazione locale al cloud computing possono essere influenzate da diverse differenze di prestazioni.
CPU
A seconda dell'architettura, un'installazione locale potrebbe eseguire CPU con velocità di clock più elevate e cache più grandi. Il risultato sarebbe diminuito i tempi di elaborazione e istruzioni superiori per ciclo (IPC). È importante comprendere le differenze nei modelli e nelle metriche della CPU quando si lavora sulle migrazioni. In questo caso, una relazione uno-a-uno tra i conteggi della CPU potrebbe non essere sufficiente.
Ad esempio:
In un sistema locale con quattro CPU eseguite a 3,7 GHz, è disponibile un totale di 14,8 GHz per l'elaborazione. Se il numero di CPU equivalente viene creato usando una macchina virtuale D4s_v3 supportata da CPU da 2,1 GHz, la macchina virtuale migrata ha 8,1 GHz disponibile per l'elaborazione. Ciò rappresenta circa un calo del 44% delle prestazioni.
Disco
Le prestazioni del disco in Azure sono definite dal tipo e dalle dimensioni del disco (ad eccezione del disco Ultra, che offre flessibilità in termini di dimensioni, operazioni di I/O al secondo e velocità effettiva). Le dimensioni del disco definiscono i limiti di operazioni di I/O al secondo e velocità effettiva.
La latenza è una metrica dipendente dal tipo di disco anziché dalle dimensioni del disco. La maggior parte delle soluzioni di archiviazione locali sono matrici di dischi con cache DRAM. Questo tipo di cache fornisce sotto millisecondi (circa 200 microsecondi) latenza e velocità effettiva di lettura/scrittura elevata (IOPS).
Le latenze medie di Azure sono illustrate nella tabella seguente.
Tipo di disco | Latenza |
---|---|
Disco Ultra/SSD Premium v2 | μs a tre cifre (microsecondi) |
SSD Premium/SSD Standard | Ms a cifra singola (millisecondi) |
Unità disco rigido Standard | Ms a due cifre (millisecondi) |
Note
Un disco viene limitato se raggiunge i limiti di IOPS o larghezza di banda, perché in caso contrario la latenza può raggiungere un picco di 100 millisecondi o più.
La differenza di latenza tra un'unità locale (spesso inferiore a un millisecondo) e un'unità SSD Premium (millisecondi a cifra singola) diventa un fattore di limitazione. Si notino le differenze di latenza tra le offerte di archiviazione e selezionare l'offerta più adatta ai requisiti dell'applicazione.
Rete
La maggior parte delle configurazioni di rete locali usa collegamenti da 10 Gbps. In Azure la larghezza di banda di rete è definita direttamente dalle dimensioni delle macchine virtuali. Alcune larghezze di banda di rete possono superare i 40 Gbps. Assicurarsi di selezionare una dimensione con larghezza di banda sufficiente per le esigenze dell'applicazione. Nella maggior parte dei casi, il fattore di limitazione è costituito dai limiti di velocità effettiva della macchina virtuale o del disco anziché della rete.
Memoria
Selezionare una dimensione di macchina virtuale con ram sufficiente per ciò che è attualmente configurato.
Diagnostica delle prestazioni (PerfInsights)
PerfInsights è lo strumento consigliato dal supporto di Azure per i problemi di prestazioni delle macchine virtuali. È progettato per coprire le procedure consigliate e le schede di analisi dedicate per CPU, memoria e I/O. È possibile eseguirla tramite il portale di Azure o dall'interno della macchina virtuale e quindi condividere i dati con il team di supporto tecnico di Azure.
Eseguire PerfInsights
PerfInsights è disponibile per entrambi i sistemi operativi Windows e Linux. Verificare che la distribuzione di Linux sia nell'elenco delle distribuzioni supportate per Diagnostica delle prestazioni per Linux.
Eseguire e analizzare i report tramite il portale di Azure
Quando PerfInsights viene installato tramite il portale di Azure, il software installa un'estensione nella macchina virtuale. Gli utenti possono anche installare PerfInsights come estensione passando direttamente a Estensioni nel pannello della macchina virtuale e quindi selezionando un'opzione di diagnostica delle prestazioni.
opzione portale di Azure 1
Esplorare il pannello della macchina virtuale e selezionare l'opzione Diagnostica prestazioni . Viene chiesto di installare l'opzione (usa le estensioni) nella macchina virtuale per cui è stata selezionata.
opzione portale di Azure 2
Passare alla scheda Diagnostica e risoluzione dei problemi nel pannello della macchina virtuale e cercare il collegamento Risolvere i problemi in Problemi di prestazioni della macchina virtuale.
Cosa cercare nel report PerfInsights
Dopo aver eseguito il report PerfInsights, il percorso del contenuto dipende dal fatto che il report sia stato eseguito tramite il portale di Azure o come eseguibile. Per entrambe le opzioni, accedere alla cartella di log generata o (se nella portale di Azure) scaricare localmente per l'analisi.
Eseguire il portale di Azure
Apri il rapporto PerfInsights. La scheda Risultati registra eventuali valori anomali in termini di consumo di risorse. Se sono presenti istanze di prestazioni lente a causa di un utilizzo specifico delle risorse, la scheda Risultati classifica ogni ricerca come impatto elevato o impatto medio .
Nel report seguente, ad esempio, si noterà che sono stati rilevati risultati di impatto medio correlati all'archiviazione e vengono visualizzati i consigli corrispondenti. Se si espande l'evento Risultati , vengono visualizzati diversi dettagli chiave.
Per altre informazioni su PerfInsights nel sistema operativo Linux, vedere Come usare PerfInsights Linux in Microsoft Azure.
Ulteriori informazioni
Risolvere i problemi relativi alle prestazioni delle macchine virtuali di Azure in Linux o Windows
Diagnostica delle prestazioni per le macchine virtuali di Azure
Contattaci per ricevere assistenza
In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.