{"id":8882,"date":"2023-01-17T18:45:44","date_gmt":"2023-01-17T21:45:44","guid":{"rendered":"https:\/\/swiv.com.br\/?p=8882"},"modified":"2023-01-17T18:45:44","modified_gmt":"2023-01-17T21:45:44","slug":"how-to-identify-memory-botlenecks-on-oracle-linux","status":"publish","type":"post","link":"https:\/\/swiv.com.br\/index.php\/2023\/01\/17\/how-to-identify-memory-botlenecks-on-oracle-linux\/","title":{"rendered":"How to identify Memory Botlenecks on Oracle Linux"},"content":{"rendered":"\n<p>Parecido com o artigo sobre consumo de CPU, hoje escreverei sobre consumo de mem\u00f3ria, contemplando parte te\u00f3rica e pr\u00e1tica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Basic Concepts<\/h2>\n\n\n\n<p>Quando observamos algumas informa\u00e7\u00f5es sobre mem\u00f3ria, \u00e9 importante ter no\u00e7\u00e3o que:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Total = Mem\u00f3ria total instalada e reconhecida pelo S.O<\/li><li>Used = Mem\u00f3ria total usada no S.O, incluindo Buffer e Cache<\/li><li>Free = Reserva de mem\u00f3ria livre dispon\u00edvel para uso<\/li><li>Buffers = espa\u00e7o utilizado pelo Kernel, em car\u00e1ter tempor\u00e1rio, para otimizar opera\u00e7\u00f5es internas <\/li><li>Cache = mem\u00f3ria usada como cache para leitura de arquivos lidos do disco, melhorando assim a performance de I\/O. Uma maneira de ver essa diferen\u00e7a foi demonstrada <a rel=\"noreferrer noopener\" href=\"https:\/\/swiv.com.br\/how-the-cached-memory-improve-the-system-performance\/\" target=\"_blank\">NESTE<\/a> artigo do nosso blog.<\/li><\/ul>\n\n\n\n<p>Temos essas informa\u00e7\u00f5es dispostas no man abaixo e no Oracle Note &#8220;<strong>Oracle Linux: System Memory Utilization (Doc ID 1514705.1)<\/strong>&#8220;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/swiv.com.br\/wp-content\/uploads\/2023\/01\/image-28-1024x396.png\" alt=\"\" class=\"wp-image-8885\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How to Calculate Memory Usage<\/h2>\n\n\n\n<p>Uma vez com os conceitos te\u00f3ricos, podemos evoluir.<\/p>\n\n\n\n<p>Quando observamos o comando free, podemos ter a tend\u00eancia de considerar a coluna free como o valor de mem\u00f3ria livre dispon\u00edvel no servidor (e que em muitos casos, est\u00e1 muito baixa):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;oracle@oel7 ~]$ free -m\n              total        used        free      shared  buff\/cache   available\nMem:          15772        1152       12360        1147        2259       13307\nSwap:          1231           0        1231\n<\/pre><\/div>\n\n\n<p>O grande erro aqui \u00e9 n\u00e3o considerar os valores de Buffer e Cache, pois o Linux reutiliza essas \u00e1reas de mem\u00f3ria durante suas opera\u00e7\u00f5es. Ou seja, o c\u00e1lculo correto deveria ser: Free + Buffer + Cache.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Top 10 users and processes are consuming memory on system<\/h2>\n\n\n\n<p>Caso seja identificado que h\u00e1 algum problema na camada de mem\u00f3ria do servidor, \u00e9 poss\u00edvel verificar atrav\u00e9s do comando abaixo os Top 10 Users em porcentagem de consumo. No exemplo temos 32.70% do usu\u00e1rio oracle e 12.40% do grid.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n# ps -eo user,pcpu,pmem | tail -n +2 | awk &#039;{num&#x5B;$1]++; cpu&#x5B;$1] += $2; mem&#x5B;$1] += $3} END{printf(&quot;NPROC\\tUSER\\tCPU\\tMEM\\n&quot;); for (user in cpu) printf(&quot;%d\\t%s\\t%.2f\\t%.2f\\n&quot;,num&#x5B;user], user, cpu&#x5B;user], mem&#x5B;user]) }&#039;\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;oracle@oel7 ~]$ ps -eo user,pcpu,pmem | tail -n +2 | awk &#039;{num&#x5B;$1]++; cpu&#x5B;$1] += $2; mem&#x5B;$1] += $3} END{printf(&quot;NPROC\\tUSER\\tCPU\\tMEM\\n&quot;); for (user in cpu) printf(&quot;%d\\t%s\\t%.2f\\t%.2f\\n&quot;,num&#x5B;user], user, cpu&#x5B;user], mem&#x5B;user]) }&#039;\nNPROC   USER    CPU     MEM\n32      grid    4.20    12.40\n1       rpc     0.00    0.00\n83      oracle  2.00    32.70\n1       colord  0.00    0.00\n1       rtkit   0.00    0.00\n1       polkitd 0.00    0.00\n1       dbus    0.00    0.00\n1       nobody  0.00    0.00\n31      gdm     0.20    1.90\n1       libstor+        0.00    0.00\n2       avahi   0.00    0.00\n2       postfix 0.00    0.00\n177     root    0.00    0.40\n&#x5B;oracle@oel7 ~]$\n<\/pre><\/div>\n\n\n<p>Para identificar os processos que mais consomem mem\u00f3ria, podemos usar:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nps -e -orss,pid=,user=,args=, | sort -b -k1,1n | pr -TW$COLUMNS| tail -10\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;oracle@oel7 ~]$ ps -e -orss,pid=,user=,args=, | sort -b -k1,1n | pr -TW$COLUMNS| tail -10\n114656 4347 oracle   ora_cjq0_cortex\n115364 3065 grid     \/grid\/19.3.0\/product\/bin\/ohasd.bin reboot\n134704 3596 grid     \/grid\/19.3.0\/product\/bin\/oraagent.bin\n138544 23266 oracle  ora_m003_cortex\n151368 4107 oracle   ora_mman_cortex\n191948 3162 gdm      \/usr\/bin\/gnome-shell\n223320 4160 oracle   ora_mmon_cortex\n250180 4180 oracle   ora_m000_cortex\n285352 4694 oracle   ora_m005_cortex\n306536 4579 oracle   ora_m002_cortex\n&#x5B;oracle@oel7 ~]$\n<\/pre><\/div>\n\n\n<p>Defini\u00e7\u00e3o de cada coluna, conforme Oracle Note &#8220;<strong>Oracle Linux: How to Calculate Memory Usage (Doc ID 1630754.1)<\/strong>&#8220;:  First column is&nbsp;<strong>RSS<\/strong>, second one is&nbsp;<strong>PID<\/strong>, the third one is&nbsp;<strong>USER<\/strong>&nbsp;and fourth is&nbsp;<strong>Command<\/strong>&nbsp;Executed &#8211; to sum-up first column only and give total in KB allocation, below command can be used:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nps -e -orss,pid=,user=,args=, | sort -b -k1,1n | pr -TW$COLUMNS|  awk &#039;{total += $1} END{print&quot;sum=&quot;total}&#039;\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;oracle@oel7 ~]$ ps -e -orss,pid=,user=,args=, | sort -b -k1,1n | pr -TW$COLUMNS|  awk &#039;{total += $1} END{print&quot;sum=&quot;total}&#039;\nsum=10009904\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Swap Space Usage<\/h2>\n\n\n\n<p>A depender das opera\u00e7\u00f5es que executam no servidor, pode ocorrer da \u00e1rea de mem\u00f3ria n\u00e3o ser suficiente (ou seja, naquela din\u00e2mica de carregar dados de disco para mem\u00f3ria, e mem\u00f3ria para disco, n\u00e3o conseguir dar vaz\u00e3o). Para estas ocasi\u00f5es, o Linux utiliza da \u00e1rea de Swap, que em car\u00e1ter tempor\u00e1rio faz a fun\u00e7\u00e3o de &#8220;mem\u00f3ria&#8221;. Quando esses eventos ocorrem de forma pontual, n\u00e3o \u00e9 um problema, mas caso percebamos que a situa\u00e7\u00e3o fica prolongada, isso acarreta s\u00e9rios problemas de performance. <\/p>\n\n\n\n<p>A manifesta\u00e7\u00e3o dessas ocorr\u00eancias podem ser vistas a partir da ferraments vmstat, nas colunas SI e SO:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/swiv.com.br\/wp-content\/uploads\/2023\/01\/image-29.png\" alt=\"\" class=\"wp-image-8901\"\/><\/figure>\n\n\n\n<p>Segundo o Oracle Note &#8220;<strong>Oracle Linux: How to Check Whether a System is Under Memory Pressure (Doc ID 1502301.1)<\/strong>&#8220;, os eventos de SO (Mem\u00f3ria para Disco) podem ser normais e esperados: When an&nbsp;application requests memory from the operating system, it does not specify swap or physical memory, it just requests memory, the operating system manages the allocation of memory and use of swap.<\/p>\n\n\n\n<p>Para identificar eventos an\u00f4malos: as colunas SI e SO precisam estar com valores acima de 0 de maneira prolongada. No exemplo abaixo, temos um ambiente sem problemas de mem\u00f3ria:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;oracle@oel7 ~]$ vmstat 1 10 -S m\nprocs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----\n r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st\n 1  0      0   5664      9   1815    0    0    41     0  697  556 13  6 64 17  0\n 0  0      0   5640      9   1823    0    0   173     0 2768 2070  8  7 83  2  0\n 2  0      0   5584      9   1826    0    0     0     0 3192 2032  4  8 87  1  0\n 0  0      0   5553      9   1848    0    0     4     0 5109 6138 10  6 81  4  0\n 0  0      0   5551      9   1848    0    0  2257     0 1692 1812  1  1 94  4  0\n 0  0      0   5547      9   1852    0    0   228     0 1095 1251  0  1 98  1  0\n 0  0      0   5542      9   1852    0    0     0     0 1208 1367  1  1 98  0  0\n 0  0      0   5542      9   1852    0    0   156     0  970 1236  0  0 99  0  0\n 0  0      0   5541      9   1852    0    0     0     0  935 1317  0  0 99  0  0\n 1  1      0   5541      9   1852    0    0     0     0 1262 1330  1  1 98  0  0\n&#x5B;oracle@oel7 ~]$\n<\/pre><\/div>\n\n\n<p>Stressando o ambiente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;root@oel7 ~]# stress --cpu 1 --vm 12 --vm-bytes 900M --timeout 60s\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;oracle@oel7 ~]$ vmstat 1 10 -S m\nprocs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----\n r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st\n 5 42   1267   4627      2   1370    1    0  1305     6  689  460  9 15 36 39  0\n 2 44   1274   4625      2   1374    6    0  6352    92 3107 2346  1  3  0 96  0\n 1 37   1286   4636      2   1370   13    0 12796   131 4525 2608  0  3  0 96  0\n 0 34   1291   4647      2   1366    6    0  6544    97 4748 3118  0  2  0 97  0\n 1 34   1259   5553      2   1374    4    0  4711   102 4223 3440  1  6  0 93  0\n 0 32   1264   5554      2   1372    5    0  5112   139 3923 3235  1  2  0 97  0\n 0 38   1276   5564      2   1369   12    0 11776    88 3374 2787  0  3  0 97  0\n 0 35   1287   5577      2   1361   12    0 12360   111 4083 3095  0  3  0 97  0\n 3 34   1291   5582      2   1358    5    0  5485   176 4090 3396  0  2  0 98  0\n 0 36   1291   5589      2   1356    0    0   944   271 4285 3923  1  4  0 96  0\n&#x5B;oracle@oel7 ~]$\n<\/pre><\/div>\n\n\n<p>Vemos que a coluna SI ficou com n\u00fameros acima de 0, al\u00e9m do Load da m\u00e1quina tamb\u00e9m ter sido comprometido (o que \u00e9 esperado quando isso ocorre).<\/p>\n\n\n\n<p>Em suma, para diagnosticar problemas comuns de mem\u00f3ria em servidores, \u00e9 aconselhado validar se o mesmo est\u00e1 lidando com uso constante de Swap, o que pode significar que a mem\u00f3ria f\u00edsica alocada est\u00e1 insuficiente para a carga executada, ou pode existir algum processo que est\u00e1 fazendo consumo demasiado de mem\u00f3ria, e deve ser revisto. Refer\u00eancia:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/swiv.com.br\/wp-content\/uploads\/2023\/01\/image-30-1024x171.png\" alt=\"\" class=\"wp-image-8914\"\/><figcaption>https:\/\/docs.oracle.com\/en\/learn\/ol-monitoring\/index.html#explore-and-use-vmstat-command-options<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Parecido com o artigo sobre consumo de CPU, hoje escreverei sobre consumo de mem\u00f3ria, contemplando parte te\u00f3rica e pr\u00e1tica. Basic Concepts Quando observamos algumas informa\u00e7\u00f5es sobre mem\u00f3ria, \u00e9 importante ter no\u00e7\u00e3o que: Total = Mem\u00f3ria total instalada e reconhecida pelo S.O Used = Mem\u00f3ria total usada no S.O, incluindo Buffer e Cache Free = Reserva [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-8882","post","type-post","status-publish","format-standard","hentry","category-linux"],"_links":{"self":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/8882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=8882"}],"version-history":[{"count":0,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/8882\/revisions"}],"wp:attachment":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=8882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=8882"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=8882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}