Introdução

Clientes Oracle cloud services enfrentavam 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
[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”VXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIEJydXRhICglbWVtdXNlZCkgPSAoa2JtZW11c2VkLyhrYm1lbXVzZWQra2JtZW1mcmVlKSkgKiAxMDAKVXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIEJydXRhICglbWVtdXNlZCkgPSAoMzMxODA1ODAvKDMzMTgwNTgwKzE2MjUyMTkyKSkgKiAxMDAKVXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIEJydXRhICglbWVtdXNlZCkgPSAoMCw2NzEzKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgQnJ1dGEgKCVtZW11c2VkKSA9IDY3LDEzJQ==” hover_enabled=”0″]VXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIEJydXRhICglbWVtdXNlZCkgPSAoa2JtZW11c2VkLyhrYm1lbXVzZWQra2JtZW1mcmVlKSkgKiAxMDAKVXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIEJydXRhICglbWVtdXNlZCkgPSAoMzMxODA1ODAvKDMzMTgwNTgwKzE2MjUyMTkyKSkgKiAxMDAKVXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIEJydXRhICglbWVtdXNlZCkgPSAoMCw2NzEzKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgQnJ1dGEgKCVtZW11c2VkKSA9IDY3LDEzJQ==[/et_pb_dmb_code_snippet]
  • 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.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”VXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIExpcXVpZGEgKCVtZW11c2VkKSA9ICgoa2JtZW11c2VkLWtiYnVmZmVycy1rYmNhY2hlZCkvKGtibWVtdXNlZCtrYm1lbWZyZWUpKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgTGlxdWlkYSAoJW1lbXVzZWQpID0gKCgzMzE4MDU4MC0xNTkxODg4LTIyNjYwNjY4KS8oMzMxODA1ODArMTYyNTIxOTIpKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgTGlxdWlkYSAoJW1lbXVzZWQpID0gKCgwLDE4MDYpKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgTGlxdWlkYSAoJW1lbXVzZWQpID0gMTgsMDYl” hover_enabled=”0″]VXRpbGl6YcOnw6NvIGRlIE1lbcOzcmlhIExpcXVpZGEgKCVtZW11c2VkKSA9ICgoa2JtZW11c2VkLWtiYnVmZmVycy1rYmNhY2hlZCkvKGtibWVtdXNlZCtrYm1lbWZyZWUpKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgTGlxdWlkYSAoJW1lbXVzZWQpID0gKCgzMzE4MDU4MC0xNTkxODg4LTIyNjYwNjY4KS8oMzMxODA1ODArMTYyNTIxOTIpKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgTGlxdWlkYSAoJW1lbXVzZWQpID0gKCgwLDE4MDYpKSAqIDEwMApVdGlsaXphw6fDo28gZGUgTWVtw7NyaWEgTGlxdWlkYSAoJW1lbXVzZWQpID0gMTgsMDYl[/et_pb_dmb_code_snippet]

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.