Condividi tramite


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, pidstatvmstat
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.

Screenshot che mostra la schermata Dei report di Diagnostica prestazioni e chiede all'utente di installare la diagnostica delle prestazioni.

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.

Screenshot che mostra la scheda Diagnostica e risoluzione dei problemi nel pannello della macchina virtuale e 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

Screenshot che mostra la schermata Report di Diagnostica prestazioni ed evidenzia il report di diagnostica generato.

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.

Screenshot che mostra il report perfInsights e illustra in dettaglio i risultati del report, tra cui livello di impatto, ricerca, risorse interessate e raccomandazioni.

Per altre informazioni su PerfInsights nel sistema operativo Linux, vedere Come usare PerfInsights Linux in Microsoft Azure.

Ulteriori informazioni

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.