Introduzione
Questo documento descrive come risolvere i problemi relativi alle perdite di memoria sulle piattaforme software Cisco IOS®.
Specifica inoltre le informazioni da raccogliere prima di aprire una richiesta TAC (Cisco Technical Assistance Center) o ricaricare il dispositivo. Raccogliere i risultati menzionati in questo documento e allegarli al caso TAC per contribuire a velocizzare la risoluzione del problema.
Premesse
MallocLite viene utilizzato dal gestore della memoria per allocare piccoli pezzi di memoria a dimensione fissa, noti come blocchi, per allocazioni inferiori o uguali a 128 byte. Le allocazioni di memoria di piccole dimensioni non hanno il sovraccarico di un'intestazione di blocco per ogni allocazione. Questa funzionalità è supportata solo per i pool di memoria del processore.
Ogni intestazione di blocco di memoria occupa circa 48 byte di memoria, mentre il blocco più piccolo occupa circa 24 byte. Con un approccio tradizionale nel software Cisco IOS per ciascuna allocazione, si consumano almeno 72 (48 + 24) byte di memoria, anche se è necessario allocare solo 8 byte di dati effettivi.
Con MallocLite, questo sovraccarico può essere ridotto utilizzando blocchi. Vi è ancora qualche sovraccarico, perché i pezzi devono essere gestiti. Tuttavia, poiché i blocchi sono di dimensioni fisse, vengono gestiti in modo diverso rispetto ai blocchi e il sovraccarico è inferiore.
È responsabilità delle applicazioni che utilizzano la memoria MallocLite liberarla in modo appropriato. MallocLite maschera l'utente della memoria.
Risoluzione dei problemi
Nota: Cisco CLI Analyzer (solo utenti registrati) supporta alcuni comandi show. Usare Cisco CLI Analyzer per visualizzare un'analisi dell'output del comando show.
Individuazione applicazione responsabile della perdita
In genere, è difficile identificare un bug esistente se si cerca solo tramite la parola chiave malloclite.
Nell'esempio viene mostrato come il processo *MallocLite* stia conservando una quantità di memoria anomala:
#show processes memory sorted
Processor Pool Total: 1614282720 Used: 1544726580 Free: 69556140
I/O Pool Total: 313524224 Used: 115564032 Free: 197960192
PID TTY Allocated Freed Holding Getbufs Retbufs Process
0 0 0 0 1476043512 0 0 *MallocLite*
È necessario identificare l'applicazione esatta che è responsabile della perdita. Tre possibili metodi di identificazione sono:
- Decodifica allocatore PC.
- Esaminare le statistiche della memoria MallocLite.
- Disabilitare MallocLite.
Decodifica Allocator PC
Anche con MallocLite attivato, di solito si può vedere quale funzione ha richiesto la memoria. L'output del comando show memory allocating-process totals potrebbe visualizzare valori PC diversi anche se il nome indicato è MallocLite:
#show memory allocating-process totals
<snip>
Allocator PC Summary for: Processor
Displayed first 2048 Allocator PCs only
PC Total Count Name
0x620BE3C4 42807572 594 MallocLite
0x620ADDD4 13597308 193 MallocLite
0x60738BB0 8909824 122 MallocLite
0x620AE0E0 2060716 31 MallocLite
0x620AE10C 1982780 30 MallocLite
Un tecnico Cisco TAC può decodificare i valori PC dall'inizio dell'elenco (con il totale più alto). Ciò consente di identificare l'applicazione che presenta la perdita di memoria.
Analizza statistiche della memoria MallocLite
Tra i miglioramenti aggiunti al software Cisco IOS versione 15.1T, una nuova CLI mostra il riepilogo della memoria MallocLite allocata da ciascun PC. Il comando show memory lite-chunks aiuta a identificare le applicazioni che usano una grande quantità di blocchi MallocLite.
show memory lite-chunks { statistics | totals } { summary { pool | { all | pool } } }
Per i dettagli del comando show memory lite-chunks, consultare la guida di riferimento del comando.
CLI : show memory lite-chunks totals
DESC : Summary of all pools, based on alloc pc.
This cli can be used to find the alloc_pc which is using large amount memory
allocated from all mlite pools
CLI : show memory lite-chunks statistics
DESC : Displays number of allocated & free mlite chunks
CLI : show memory lite-chunks summary pool pool
DESC : Show summary of particular mlite pool
This cli can be used to find the alloc_pc which is using large amount of memory
in individual mlite pool
CLI : show memory lite-chunks summary pool all
DESC : Show individual summary of all mlite pools
CLI : show memory lite-chunks pool pool
DESC : Show All chunk elements in the specified pool
CLI : show memory lite-chunks pool all
DESC : show all chunk elements in all mlite pools
Di seguito sono riportati alcuni esempi di output di questo comando:
#show memory lite-chunks ?
pool Malloc lite pool
statistics Malloc lite statistics
summary Malloc Lite summary
totals Malloc Lite Allocating totals
#show memory lite-chunks statistics
Pool Inuse Free
8-Bytes 140 1904
20-Bytes 173 1313
44-Bytes 171 791
68-Bytes 24 687
96-Bytes 26 519
128-Bytes 20 410
#show memory lite-chunks totals
PC Total Count
26067AE0 2112 33
2269E68C 1932 29
2269FACC 1664 29
2269F964 1664 26
2269FA9C 1580 29
26067FB4 1360 34
23CD2A0C 1036 7
#show memory lite-chunks pool ?
128-Bytes 128 bytes pool
20-Bytes 20 bytes pool
44-Bytes 44 bytes pool
68-Bytes 68 bytes pool
8-Bytes 8 bytes pool
96-Bytes 96 bytes pool
all all pools
#show memory lite-chunks summary pool 8
8 bytes pool
PC Total Count
2269FB10 812 29
23612084 700 25
2269F9F8 700 25
2269F9EC 700 25
Il tecnico TAC può decodificare i valori PC con il totale più alto e identificare l'applicazione che sta perdendo memoria.
Disabilita MallocLite
La funzione MallocLite è attivata per impostazione predefinita. Per indagare la perdita di MallocLite, è possibile disabilitare MallocLite:
(config)#no memory lite
La memoria perduta rimarrà sotto MallocLite fino al successivo caricamento; tuttavia, è possibile iniziare a monitorare ulteriori perdite con i comandi show PROCESSES in memoria ordinati e show memory allocating-process totals. Le fughe di notizie appariranno sotto il processo reale.
Se la memoria del dispositivo è quasi esaurita, è necessario salvare la configurazione e ricaricare il dispositivo per liberare la memoria:
#wr
#reload
La memoria potrebbe esaurirsi di nuovo nel tempo, quindi utilizzare i comandi show processes processes memory sort e show memory allocating-process totals per monitorare l'utilizzo della memoria da quel momento in poi.
Nota: Se si disabilita MallocLite con il comando no memory lite e si ricarica il dispositivo, l'output del comando show memory lite-chunks sarà vuoto.
Per i dettagli del comando memory lite, consultare la guida di riferimento del comando.