OS X Server: valutazione delle prestazioni

Questo articolo descrive come utilizzare uno script per iniziare a valutare le prestazioni del server che esegue Mac OS X Server versione 10.4 o successive. L’obiettivo principale è identificare l’utilizzo delle risorse chiave: CPU, archiviazione su disco e rete.

Utilizzo delle risorse

Puoi utilizzare questo script Perl (denominato “top_guide.pl”) per valutare l’utilizzo delle risorse chiave nel tempo sul tuo server. Questo script è compatibile con Mac OS X Server versione 10.4 e successive.

Lo script esegue top -d, ma estrae e riepiloga l’utilizzo delle risorse chiave nel tempo. Senza argomenti, l’output di top_guide.pl è simile a questo:

-------- ----------- ------------ ------------- ------------- ------------- ------------- ------ CPU usage: 300-s Reads/sec: Writes/sec: Net in/sec: Net out/sec: kernel Time: user sys Idle avg. number MB number MB pkts Mb pkts Mb CPU% -------- ----- ----- ----- ----- ------ ------ ------ ------ ------ ------ ------ ------ ------ 08:44:36 0.1 0.1 99.8 99.8 0 0.0 0 0.0 11 0.0 0 0.0 0.4 08:44:46 0.1 0.3 99.6 99.8 0 0.0 0 0.1 12 0.0 0 0.0 0.4 08:44:56 0.0 0.2 99.8 99.8 0 0.0 0 0.0 17 0.0 0 0.0 0.4 08:45:06 0.0 0.2 99.8 99.8 0 0.0 0 0.0 6 0.0 0 0.0 0.4 08:45:16 0.0 0.2 99.8 99.8 0 0.0 0 0.0 9 0.0 0 0.0 0.4 08:45:26 8.7 24.6 66.7 98.6 43 0.8 98 0.6 803 1.0 1399 1.1 5.0 08:45:37 5.7 83.6 10.7 95.7 48 0.4 1085 116.9 95366 1053.1 61830 35.4 72.4 08:45:47 11.5 88.5 0.0 92.4 23 0.2 3228 426.9 337955 3843.6 207872 114.0 284.8 08:45:58 4.6 95.4 0.0 89.0 4 0.0 594 596.7 447499 5215.5 266449 140.9 370.0

Puoi vedere le tre aree chiave identificate: CPU, I/O del disco e rete. Le colonne sono le seguenti:

  • Time: orario di fine della riga di riepilogo più recente. Per impostazione predefinita intercorrono 10 secondi tra ogni campione.

  • CPU usage: user: utilizzo della CPU in modalità utente. Il valore è una percentuale delle risorse totali della CPU disponibili su questo sistema. Ad esempio, su un sistema a 8 processori, il 50% della CPU utente significherebbe che l’utilizzo totale della CPU di tutte le applicazioni in esecuzione è l’equivalente di 4 processori.

  • CPU usage: sys: utilizzo della CPU in modalità kernel espresso in percentuale della CPU totale disponibile.

  • Idle: CPU inattiva, espressa in percentuale delle risorse totali disponibili.

  • 300-s avg: media ponderata della percentuale di CPU inutilizzata negli ultimi 300 secondi. (Tieni presente che questo valore varia se utilizzi l’opzione -roption per regolare l’intervallo di media; il titolo della colonna cambia di conseguenza.)

  • Reads/sec – number: numero di operazioni di lettura dal disco univoche effettuate durante il periodo campione.

  • Reads/sec – MB: megabyte totali letti dai dischi durante il periodo campione.

  • Writes/sec – number: numero di operazioni di scrittura univoche effettuate durante il periodo campione.

  • Writes/sec – MB: megabyte totali scritti durante il periodo campione.

  • Net in/sec – pkts: pacchetti totali ricevuti durante il periodo campione.

  • Net in/sec – Mb: dati di rete in ingresso totali in megabit al secondo durante il periodo campione.

  • Net out/sec – pkts: pacchetti totali di rete inviati durante il periodo campione.

  • Net out/sec – Mb: dati di rete in uscita totali in megabit al secondo durante il periodo campione.

Tra le altre opzioni fornite dallo script figurano:

  • -h: consente di visualizzare tutte le informazioni sull’utilizzo.

  • -o filename: consente di esportare una copia dell’output separata da tabulatori in un file. Questo modulo di output è adatto per l’importazione in un foglio di calcolo o in altri script di analisi dei dati. La prima riga include le intestazioni delle colonne per garantire che l’output sia sempre autodescritto.

  • -d: consente di visualizzare l’indicazione di data e ora. Ciò è particolarmente utile per la registrazione a lungo termine su un server in cui l’amministratore desidera visualizzare un record storico.

  • -S processNames: consente di monitorare i processi a istanza singola. Ciò è utile se un determinato servizio che ha un solo ID di processo è di particolare interesse su un server. Un esempio potrebbe essere un server utilizzato principalmente come server AFP. In tal caso, utilizza gli argomenti -S AppleFileServer per aggiungere una colonna separata per l’utilizzo del processo AppleFileServer della CPU utente. È possibile elencare più di un processo separando i nomi dei processi con virgole.

  • -M processNames: come -S, eccetto nei casi in cui l’applicazione utilizza più processi. Un esempio è smbd, per il quale ne esiste uno per connessione. Su un sistema molto utilizzato per Samba, usa -M smbd per ottenere una colonna che riepiloghi la CPU utente di tutta l’attività di Samba.

Sebbene un’analisi completa delle prestazioni del server non rientri nell’ambito di applicazione di questo articolo, l’output di top_guide.pl fornisce un riepilogo dell’utilizzo di CPU, disco e risorse di rete sul sistema. Il confronto con l’hardware e il carico del sistema consente a un amministratore di decidere quale area esaminare in modo più approfondito. Di seguito sono descritti alcuni strumenti aggiuntivi che possono essere utili quando si esamina ciascuna area.

Utilizzo della CPU

Se l’utilizzo della CPU è elevato, è necessario migliorare l’efficienza dell’applicazione. Ciò non rientra nell’ambito di questo articolo, ma talvolta la CPU rimane inutilizzata. Sono disponibili diversi strumenti che consentono di esaminare una situazione in cui le risorse di rete e disco sono sufficienti per un carico più elevato, ma una quantità significativa di CPU rimane inattiva.

Una CPU può essere sottoutilizzata per due motivi:

  • Lock dei thread dell’applicazione

  • Lock delle risorse del kernel

Introdotto in Mac OS X 10.5 Leopard, il comando plockstat(1) può essere eseguito per una particolare applicazione al fine di esaminare la contesa del lock pthread. I processi che potrebbero causare una contesa del lock pthread sono quelli che nell’output top -d presentano un numero elevato di switch di contesto (colonna CSW). Una volta identificato un processo per cui si desidera esaminare la contesa del lock pthread, utilizza: # plockstat -C -e 10 -p .

Mutex block Count nsec Lock Caller ------------------------------------------------------------------------------- 8540 29622 0x805eb0 a.out`process_request+0x3d1 8361 28284 0x805eb0 a.out`release_block+0xac R/W reader block Count nsec Lock Caller ------------------------------------------------------------------------------- 1 3014987 0xa781e8 a.out`key_find+0x121 5 78831 0xa3d158 a.out`key_find+0x121 2 120532 0xa3d158 a.out`key_delete+0x137 R/W writer block Count nsec Lock Caller ------------------------------------------------------------------------------- 10 5336318 0xa781e8 a.out`key_replace+0x80 13 3827632 0xa75fe8 a.out`key_replace+0x80 3 3644946 0xa5fde8 a.out`key_create+0x37 6 161055 0xa3d158 a.out`key_replace+0x80 1 785267 0xa37758 a.out`key_create+0x37

Puoi esaminare questo output e rivedere la quantità totale di nsec bloccati con vari lock. Se questo valore è elevato rispetto al totale, il tempo di esecuzione è influenzato dalla contesa del lock. Queste informazioni possono essere utili al writer dell’applicazione per isolare e migliorare le prestazioni dell’applicazione stessa. Se sono disponibili simboli, il campo “Caller” conterrà il nome simbolico della funzione bloccata. Inoltre, se il conteggio totale dei lock è elevato, oltre circa 250 al secondo, si sta verificando una perdita di efficienza nella riprogrammazione tra i thread. Un elevato tasso di lock, sebbene non sia necessariamente un fattore limitante delle prestazioni, giustifica un’analisi accurata poiché nella maggior parte dei casi indica che è possibile che l’applicazione sia meno efficiente del normale.

Talvolta i problemi di contesa delle risorse riguardano le risorse all’interno del kernel. Il kernel Mac OS X gestisce la maggior parte delle risorse multi-thread con mutex del kernel e lock di lettura/scrittura. La contesa mutex può essere valutata tramite script dtrace(1M) come:

lockstat:::adaptive-block { @often[arg0, stack(5)] = count(); } profile:::tick-5sec { normalize(@often, 5); printa(@often); }

Ciò consente di stampare un elenco ordinato in cui i lock e i percorsi con il maggior numero di contese figurano nella parte inferiore di ogni lock di output stampato dopo cinque secondi di campionamento. Un campione di output è il seguente:

375517140 mach_kernel`lck_mtx_lock_wait_x86+0x1c7 mach_kernel`lck_mtx_lock+0x217 mach_kernel`ip_output_list+0xd34 mach_kernel`tcp_setpersist+0x18b mach_kernel`tcp_output+0x17a0 0 375571960 mach_kernel`lck_mtx_lock_wait_x86+0x1c7 mach_kernel`lck_mtx_lock+0x217 mach_kernel`vnode_ref+0x32 mach_kernel`fcntl_nocancel+0x4b3 mach_kernel`unix_syscall64+0x26d 0

In questo caso, lo script segnala che il mutex del kernel all’indirizzo 375517140 è in lock tramite un percorso in cui tcp_output() chiama tcp_setpersist(), che chiama ip_output_list(). Il numero di lock al secondo è 0 su entrambi questi lock, quindi la contesa del lock non costituisce un problema. Tieni presente che in questa forma di script non è riportato il totale di tutte le istanze rispetto a un singolo lock. Se lo script fosse modificato come segue:

lockstat:::adaptive-block { @often[arg0] = count(); } profile:::tick-5sec { normalize(@often, 5); printa(@often); }

L’output potrebbe diventare:

1301055072 9 1417504384 9 353318336 10 359381776 10 1301055088 11 5387344 165

Ciò indica che solo il lock all’indirizzo del kernel 5387344 presenta una contesa significativa, che è comunque al di sotto di un livello di preoccupazione essendo inferiore a 250.

Infine, lo script può concentrarsi sui lock di lettura/scrittura del kernel se si modifica leggermente lo script come segue:

lockstat:::rw-block { @often[arg0, stack(4)] = count(); } profile:::tick-5sec { normalize(@often, 5); printa(@often); clear(@often); }

Alcune cose da ricordare sull’uso degli script lockstat dtrace(1M) e plockstat(1):

  • La raccolta delle statistiche relative ai lock ha un impatto sulle prestazioni. Questi strumenti possono rallentare il sistema. Eseguili con cura e ricorda che l’impatto sulle prestazioni aggiungerà una contesa altrimenti non presente in condizioni di normale funzionamento.

  • Alcuni sistemi non sono influenzati dal semplice blocco dei lock. Prendi in considerazione un lock su una risorsa che cambia molto lentamente e che puoi scegliere di gestire con un lock. Il lock può essere lasciato al suo posto in attesa del completamento di un’operazione di lunga durata.

Tali istanze avrebbero lunghi tempi di attesa che potrebbero non ridurre effettivamente le prestazioni.

Utilizzo del disco

iopending(1) fornisce un’indicazione della profondità delle code I/O, in forma di istogramma della profondità della coda. Ad esempio:

2008 May 21 10:35:26, load: 0.99, disk_r: 0 KB, disk_w: 392 KB

value ------------- Distribution ------------- count < 0 | 0 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9298 1 | 12 2 | 5 3 | 4 4 | 2 5 | 3 6 | 2 7 | 2 8 | 3 9 | 2 10 | 3 11 | 2 12 | 2 13 | 2 14 | 2 15 | 0

Ciò indica una certa attività del disco ma non rappresenta un problema poiché quasi tutta la coda di I/O ha una profondità pari a 0. Inoltre, puoi utilizzare iopending per concentrare l’attenzione su un particolare disco o volume di file system. Ad esempio, per concentrarti su /Volumes/MyRAID, usa iopending -m MyRAID.

Infine, puoi attribuire I/O a processi particolari e valutare la latenza utilizzando fs_usage(1). Per ulteriori informazioni sull’uso di Shark e fs_usage(1), consulta questo documento correlato per sviluppatori.

Utilizzo della rete

Molti server possono avere più interfacce di rete e client a varie distanze in tutta la rete. L’analisi delle prestazioni può risultare complessa. Tuttavia, in situazioni LAN in cui i client sono direttamente collegati attraverso una struttura di rete con una velocità nota, le metriche riportate da top_guide.pl e netstat -i forniranno un’idea del livello di utilizzo della capacità. Quando interpreti questi dati, tieni presente le seguenti linee guida:

Reti Gigabit: full-duplex, MTU da 1500 byte

Velocità massime: piccoli pacchetti: 1488 Kpps, 762 Mbps

Packet rate massimo: pacchetti da 1500 byte: 81 Kpps, 987 Mbps

(Kpps = migliaia di pacchetti al secondo)

Quando si analizzano le prestazioni della rete è anche utile esaminare l’output di netstat -s per rilevare eventuali problemi tra cui velocità eccessive di ritrasmissione dei pacchetti (ciò non rientra nell’ambito di applicazione di questo articolo).

Ulteriori informazioni

Le informazioni su prodotti non fabbricati da Apple, o su siti web indipendenti non controllati o testati da Apple, non implicano alcuna raccomandazione o approvazione. Apple non si assume alcuna responsabilità in merito alla scelta, alle prestazioni o all'utilizzo di prodotti o siti web di terze parti. Apple non esprime alcuna opinione in merito alla precisione o all'affidabilità dei siti web di terze parti. Per ulteriori informazioni contatta il fornitore.

Data di pubblicazione: