Anatomia do Linux Servidor de utilização da memoria
Por Joel Pérez, Ajith Narayanan (Oracle Certified Associate) & Carlos H. Y. Furushima (OCE),
Postado em Setembro 2014
Revisado por Marcelo Pivovar - Solution Architect
Introdução Clientes Oracle cloud services enfrentavem a um longo tempo um problema referente utilização de memória estar sempre a um nível maior que 90% de consumo. Em muitos momentos parecia algo incomum e não realista, realizado uma pesquisa sobre esse caso foi descoberto um “bug” no processo de extração das informações referente a memória no Linux (da perspectiva Oracle), que foi responsável pela geração deste número não condizente com a realidade.
Declaração do problema
Oracle Enterprise Manager (OEM Grid Control) faz uso do utilitário sysstat, que são coleções de ferramentas de monitoração de performance para Linux, o SAR é a ferramenta utiliza para extração de informações sobre utilização de memória, essa utilização de extração foi induzido a um erro que refletiu em métricas do OEM Grid Control (mostrando números que não refletem a realidade dos fatos). Não foi validado se houve essa correção no OEM Cloud Control 12c.
Demostraremos abaixo o motivo dessas métricas enganosas.
OBS.: Para extrair é usado o comando "sar" em combinação ao parâmetro "r", que corresponde a utilização de memória, o comando completo é "sar -r 5 5". O campo "%memused" que representa a porcentagem de uso de memória, o cálculo para obter essa métrica referente a utilização de memória, se dá pela seguinte formula: %memused = (kbmemused/(kbmemused+kbmemfree)) * 100
O intuito do sistema operacional Linux é fazer uso do recurso de memória principal da melhor forma possível, assim é considerado como recurso desperdiçado área de memória livre, uma vez que esse espaço pode ser usado para buffers e cache, promovendo um ganho em operações de I/O.
- Buffers = Quantidade de memória física usada como buffers em operações de escrita para disco. (Escrita: Entrada de dados de memória para disco)
- Cache = Quantidade de memória física usada como cache em operações de leitura em disco. (Leitura:Saída de dados de disco para memoria)
Para obter a porcentagem efetivo de uso de memória, devemos excluir os buffers e cache, contabilizando assim somente o uso liquido da memória RAM.
Utilização de Memoria = ((kbmemused-kbbuffers-kbcached)/(kbmemused+kbmemfree)) * 100
A seguir é descrito um exemplo com o cálculo da utilização de memória, sob duas perspectivas são elas:
- Utilização de Memoria Bruta
Este é o cálculo que o utilitáriosar faz na extração do campo "%memused", ou seja, o sistema operacional Linux considera Cache e Buffer na contabilização da porcentagem de uso da memória.
Exemplo :
Kbmemused | kbmemfree | kbbuffers | kbcached |
33180580 |
16252192 |
1591888 |
22660668 |
Utilização de Memória Bruta (%memused) = (kbmemused/(kbmemused+kbmemfree)) * 100
Utilização de Memória Bruta (%memused) = (33180580/(33180580+16252192)) * 100
Utilização de Memória Bruta (%memused) = (0,6713) * 100
Utilização de Memória Bruta (%memused) = 67,13%
- Utilização de Memoria Liquida
Este é o cálculo real referente a memória usada, ou seja, este percentual referente a quantidade total da memória que efetivamente está sendo usada, desprezando cache e buffer.
Utilização de Memória Liquida (%memused) = ((kbmemused-kbbuffers-kbcached)/(kbmemused+kbmemfree)) * 100
Utilização de Memória Liquida (%memused) = ((33180580-1591888-22660668)/(33180580+16252192)) * 100
Utilização de Memória Liquida (%memused) = ((0,1806)) * 100
Utilização de Memória Liquida (%memused) = 18,06%
Se utilizarmos o utilitário top para verificar a utilização da memória, a situação em primeiro momento parece terrível, dando a falsa impressão que toda a memória está sendo usada. Veja no exemplo abaixo.
O utilitário top traz as seguintes informações:
|
KB |
MB |
GB |
Total de Memória Física |
49432772 |
48274.19141 |
47.14277 |
Memória Usada |
33167868 |
32390.49609 |
31.63134 |
Memória Livre |
16264904 |
15883.69531 |
15.51142 |
O cache é uma dimensão parcial localizada na memória principal (Memória RAM), em operações de leitura em disco, os blocos oriundos da leitura é armazenado temporariamente no cache, caso haja uma nova necessidade de usa-las, assim tornando a operação de leitura mais performática. A área temporária de cache é dinâmica, ou seja, frequentemente é necessário ceder espaço caso algum processo requeira mais recurso em memória.
Com o objetivo de ter uma melhor visibilidade de utilização de memória, usaremos o comando free.
A linha que corresponde a "Mem:", informa que o sistema computacional tem 48274 MB de memória (47,14GB), dos quais 32581 MB (31,81GB) está sendo usado e 15693MB (15,32GB) está livre. A coluna de memória "shared" é obsoleta e deve ser ignorada. A coluna buffers mostra que 1554MB (1,51GB) está sendo usada como buffers para em operações de escrita para disco, já a coluna cached mostra que 22106MB (21,58GB) está sendo usada como cache de operações de leitura em disco. É importante ressaltar que áreas de buffers e cache, assim como as áreas livres (free) estão disponíveis para uso. Na linha que corresponde a "-/+ buffers/cache:" mostra de maneira mais clara o uso real de memória, onde no campo free termos o valor de 39354MB (38,43GB), esse valor representa a quantidade de memória livre para uso, ou seja, é a soma da quantidade de buffers, cache e free (15693MB + 1554MB + 22106 MB). Assim, é importante notar que, deveríamos nos concentrar na segunda linha "-/ + buffers/cache:" para obter informações sobre memória disponível no sistema.
Joel Pérez é um DBA expert com mais de 12 anos de experiência, especializado nas áreas de bases de dados com especial ênfase em soluções de alta disponibilidade (RAC, Dataguard, e outros). É um palestrante habitual em eventos de Oracle como: OTN LAD TOUR e outros. É o primeiro latino-americano a ser nomeado "OTN Expert " no ano de 2003 e é Oracle ACE Director. Durante estes anos, Joel trabalhou como consultor senior em um grande número de empresas e clientes em diversos países: Venezuela, Panama, Costa Rica, Dominican Rep., Haiti, Nicaragua, Guatemala, Colombia, Honduras, Ecuador, Mexico, India, Italy, France.
Ajith Narayanan possui 9 anos de experiência de trabalho, principalmente na administração de banco de dados Oracle e Oracle Apps administração, planejamento de capacidade e ajuste de desempenho em vários ambientes Oracle.
Carlos H. Y. Furushima é um DBA Oracle Sênior com ampla experiência e conhecimento em diversas áreas do banco de dados relacional é um especialista em "Performance, diagnostic and tuning", High Availability e Backup & Recovery, nos últimos anos de sua carreira profissional, Furushima vem trabalhado simultaneamente como DBA Oracle e Unix SysAdmin, atualmente atende empresas nacionais de grande porte do ramo de varejo e construção civil.
Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.