{"id":21443,"date":"2026-09-16T08:36:31","date_gmt":"2026-09-16T06:36:31","guid":{"rendered":"https:\/\/webhosting.de\/linux-numa-statistiken-auswerten\/"},"modified":"2026-09-16T08:36:31","modified_gmt":"2026-09-16T06:36:31","slug":"analisar-estatisticas-no-linux","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pt\/linux-numa-statistiken-auswerten\/","title":{"rendered":"Como interpretar corretamente as estat\u00edsticas NUMA do Linux"},"content":{"rendered":"<p><strong>Linux NUMA<\/strong> As estat\u00edsticas mostram-me at\u00e9 que ponto os processos mant\u00eam a sua mem\u00f3ria local e onde os acessos remotos aumentam as lat\u00eancias. Explico como interpreto estes n\u00fameros de forma espec\u00edfica, avalio as tend\u00eancias ao longo do tempo e, a partir da\u00ed, defino medidas claras de otimiza\u00e7\u00e3o para <strong>Desempenho<\/strong> derivado.<\/p>\n\n<h2>Pontos centrais<\/h2>\n<ul>\n  <li><strong>Compreender os contadores<\/strong>: numa_hit, numa_miss, numa_foreign, local_node, other_node, interleave_hit<\/li>\n  <li><strong>Avaliar o contexto<\/strong>: Perfil de carga, topologia, tipo de carga de trabalho<\/li>\n  <li><strong>Avaliar tend\u00eancias<\/strong>: Antes\/depois e por intervalos<\/li>\n  <li><strong>Verificar processos<\/strong>: A n\u00edvel do sistema vs. por processo<\/li>\n  <li><strong>Aplicar o ajuste<\/strong>: Afinidade, Pol\u00edticas, Coloca\u00e7\u00e3o<\/li>\n<\/ul>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/09\/linux-numa-analyse-8293.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>O que as estat\u00edsticas NUMA realmente revelam<\/h2>\n\n<p>Interpreto os n\u00fameros NUMA como um mapa para <strong>Local de armazenamento<\/strong> e vias de transmiss\u00e3o de dados. Um elevado <strong>numa_hit<\/strong> significa que as aloca\u00e7\u00f5es foram realizadas no n\u00f3 pretendido. Por outro lado, o valor \u00abnuma_miss\u00bb indica que o kernel teve de recorrer a outro n\u00f3. O contador \u00abnuma_foreign\u00bb mostra o equivalente no n\u00f3 de destino e completa o quadro. Com local_node e other_node, consigo identificar se os acessos permaneceram locais ou se utilizaram mem\u00f3ria remota.<\/p>\n\n<p>Estes valores nunca devem ser interpretados isoladamente, porque <strong>Cargas de trabalho<\/strong> reagem de forma muito diferente. Os processos curtos geram, ocasionalmente, erros, sem alterar sensivelmente o desempenho global. Por sua vez, as pol\u00edticas de intercalamento geram aloca\u00e7\u00f5es deliberadamente distribu\u00eddas, o que faz com que o interleave_hit aumente. Por isso, verifico sempre a pol\u00edtica pretendida e a carga atual. S\u00f3 ent\u00e3o decido se um valor justifica uma interven\u00e7\u00e3o ou se se enquadra no desenho do sistema.<\/p>\n\n<p>Para mim, a ideia central \u00e9 a seguinte: <strong>Contador<\/strong> fornecem sinais, n\u00e3o julgamentos. Procuro padr\u00f5es ao longo do tempo, n\u00e3o valores isolados. \u00c9 assim que percebo se uma altera\u00e7\u00e3o no sistema desloca a localidade. S\u00f3 com este panorama das tend\u00eancias \u00e9 que avalio se devo deslocar processos, ajustar pol\u00edticas ou definir restri\u00e7\u00f5es de CPU. Por isso, cada an\u00e1lise NUMA come\u00e7a com uma quest\u00e3o clara e pontos de medi\u00e7\u00e3o repet\u00edveis.<\/p>\n\n<h2>Interpretar os contadores de n\u00facleos no seu contexto<\/h2>\n\n<p>Estou sempre a comparar <strong>numa_hit<\/strong> e o numa_miss em conjunto, em vez de avaliar valores absolutos. Se os erros aumentarem, verifico em paralelo a evolu\u00e7\u00e3o do numa_foreign nos potenciais n\u00f3s de destino. Se ambos coincidirem, isso indica uma deslocaliza\u00e7\u00e3o real e n\u00e3o um mero artefacto de leitura. O `local_node` e o `other_node` complementam este quadro atrav\u00e9s dos acessos efetivos. Assim, consigo perceber se uma aloca\u00e7\u00e3o teve in\u00edcio localmente, mas se a opera\u00e7\u00e3o leu posteriormente mem\u00f3ria mais distante.<\/p>\n\n<p>Um \u00fanico alto <strong>outro_n\u00f3<\/strong> N\u00e3o me incomoda que a carga de trabalho seja distribu\u00edda de forma deliberada. Por outro lado, os servidores web com muitos workers beneficiam de uma localiza\u00e7\u00e3o consistente. Por isso, analiso os processos individualmente, n\u00e3o apenas a vis\u00e3o global. Assim que servi\u00e7os espec\u00edficos se desviam da norma, reviso a sua localiza\u00e7\u00e3o. S\u00f3 quando as falhas aumentam a n\u00edvel do sistema \u00e9 que procuro causas relacionadas com a topologia ou a carga de trabalho.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/09\/linux_numa_meeting_8326.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Compara\u00e7\u00f5es ao longo do tempo: uma rotina de medi\u00e7\u00e3o que compensa<\/h2>\n\n<p>Medei os valores dos contadores no in\u00edcio e no final de uma <strong>Fase final<\/strong> e calculo a diferen\u00e7a. Os valores isolados ocultam os efeitos; as diferen\u00e7as revelam a evolu\u00e7\u00e3o. Intervalos repetidos de, por exemplo, 30 a 60 segundos, s\u00e3o muitas vezes suficientes para identificar tend\u00eancias. Ap\u00f3s implementa\u00e7\u00f5es, atualiza\u00e7\u00f5es do kernel ou altera\u00e7\u00f5es de hardware, volto a comparar os mesmos intervalos. Se, nessa altura, houver mais falhas ou se o `local_node` se deslocar, significa que existe uma altera\u00e7\u00e3o real.<\/p>\n\n<p>Essas s\u00e9ries temporais abrangem <strong>Erro de posicionamento<\/strong> mais rapidamente do que instant\u00e2neos. Estabele\u00e7o uma correla\u00e7\u00e3o entre as linhas e a utiliza\u00e7\u00e3o da CPU, as mudan\u00e7as de contexto e a ocupa\u00e7\u00e3o de mem\u00f3ria por n\u00f3. Desta forma, consigo ver se os estrangulamentos na RAM de um n\u00f3 levam a movimentos de desvio. Ou se novos processos alteram o equil\u00edbrio dos n\u00f3s. A taxa pura de acertos e erros apresento-a sempre como uma tend\u00eancia, e n\u00e3o como um valor isolado.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/09\/linux-numa-stat-analysis-4857.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Analisar a n\u00edvel do sistema e, em seguida, aprofundar os processos<\/h2>\n\n<p>Come\u00e7o pela vis\u00e3o geral a partir de <strong>numastato<\/strong> e s\u00f3 depois analiso os processos individualmente. Esta ordem poupa tempo, porque muitos efeitos tornam-se vis\u00edveis a n\u00edvel global. Para a an\u00e1lise dos processos, utilizo a sa\u00edda espec\u00edfica de cada processo para isolar os servi\u00e7os que chamam a aten\u00e7\u00e3o. Assim que os candidatos estiverem identificados, ajusto o <strong>Coloca\u00e7\u00e3o<\/strong> sobre a aloca\u00e7\u00e3o de CPU e mem\u00f3ria. O artigo sobre este tema re\u00fane dicas pr\u00e1ticas a este respeito <a href=\"https:\/\/webhosting.de\/pt\/servidor-numa-localidade-cpu-memoria-afinidade-otimizacao-nucleo\/\">Afinidade da CPU e da mem\u00f3ria<\/a>.<\/p>\n\n<p>Especialmente no caso de servi\u00e7os Java, PHP-FPM ou bases de dados, muitas vezes basta uma <strong>Afinidade<\/strong>, para reduzir significativamente os erros. A orquestra\u00e7\u00e3o de contentores tende a ocultar estes problemas, porque os programadores distribuem sem ter em conta a NUMA. Por isso, controlo a atribui\u00e7\u00e3o de n\u00f3s por pod ou VM. Quando os conjuntos de CPU e a atribui\u00e7\u00e3o de RAM coincidem, o `local_node` aumenta de forma mensur\u00e1vel. Alguns problemas resolvem-se assim que o processo \u00e9 executado pr\u00f3ximo do conjunto de dados necess\u00e1rio.<\/p>\n\n<h2>Vis\u00e3o geral dos contadores NUMA (tabela)<\/h2>\n\n<p>Quando avalio um novo sistema, preencho a tabela seguinte para poder analisar cada <strong>\u00cdndice<\/strong> classifico rapidamente. Apresenta o significado, a interpreta\u00e7\u00e3o t\u00edpica e as medidas poss\u00edveis. N\u00e3o a encaro como um esquema r\u00edgido, mas sim como uma lista de verifica\u00e7\u00e3o. O que continua a ser decisivo \u00e9 a compara\u00e7\u00e3o com o perfil de carga e a topologia do servidor. S\u00f3 neste contexto \u00e9 que consigo tomar uma decis\u00e3o sensata.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th><strong>Contador<\/strong><\/th>\n      <th><strong>Significado<\/strong><\/th>\n      <th><strong>Interpreta\u00e7\u00e3o<\/strong><\/th>\n      <th><strong>Abordagem<\/strong><\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>numa_hit<\/td>\n      <td>Aloca\u00e7\u00e3o no n\u00f3 pretendido<\/td>\n      <td>Um valor elevado \u00e9 positivo<\/td>\n      <td>Manter a posi\u00e7\u00e3o<\/td>\n    <\/tr>\n    <tr>\n      <td>numa_miss<\/td>\n      <td>A aloca\u00e7\u00e3o foi redirecionada para outros n\u00f3s<\/td>\n      <td>Risco acrescido de lat\u00eancias<\/td>\n      <td>Verificar a afinidade\/pol\u00edtica<\/td>\n    <\/tr>\n    <tr>\n      <td>numa_foreign<\/td>\n      <td>Aloca\u00e7\u00e3o externa neste n\u00f3<\/td>\n      <td>Contraparte de numa_miss<\/td>\n      <td>Analisar o n\u00f3 de destino<\/td>\n    <\/tr>\n    <tr>\n      <td>local_node<\/td>\n      <td>Acessos \u00e0 mem\u00f3ria local<\/td>\n      <td>Quanto mais alto, mais barato<\/td>\n      <td>Processo mais pr\u00f3ximo da RAM<\/td>\n    <\/tr>\n    <tr>\n      <td>outro_n\u00f3<\/td>\n      <td>Acessos \u00e0 mem\u00f3ria remota<\/td>\n      <td>Apenas preocupante, sem inten\u00e7\u00e3o<\/td>\n      <td>Verificar a topologia\/carga<\/td>\n    <\/tr>\n    <tr>\n      <td>interleave_hit<\/td>\n      <td>Resultados na distribui\u00e7\u00e3o intercalada<\/td>\n      <td>Esperado na pol\u00edtica de intercalamento<\/td>\n      <td>Avaliar a uniformidade<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<p>Com esta <strong>Vis\u00e3o geral<\/strong> decido mais rapidamente quando devo intervir. Um aumento de \u00abnuma_miss\u00bb sem altera\u00e7\u00f5es explic\u00e1veis desencadeia uma an\u00e1lise das causas. Se os valores de interleave_hit se mantiverem elevados, verifico se a pol\u00edtica est\u00e1 ativa intencionalmente. Se o other_node apresentar um aumento sem aumento da carga, verifico se h\u00e1 cargas de trabalho que estejam a ocupar recursos. Assim, a tabela torna-se o ponto de partida para medidas espec\u00edficas.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/09\/NUMA_Statistik_Auswertung_1023.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Compreender e utilizar a topologia NUMA<\/h2>\n\n<p>Antes de fazer o ajuste, verifico o <strong>Topologia<\/strong> do servidor: soquetes, n\u00facleos, canais de mem\u00f3ria, percursos de lat\u00eancia. Se um processo estiver a ser executado no soquete 0, mas os blocos de trabalho estiverem no soquete 1, o tempo de acesso aumenta. Isso reduz o d\u00e9bito e faz com que os tempos de resposta oscilem. Os servi\u00e7os que exigem muita mem\u00f3ria s\u00e3o particularmente sens\u00edveis a qualquer dist\u00e2ncia desnecess\u00e1ria. Por isso, atribuo os processos que consomem muitos dados a n\u00f3s com RAM livre suficiente.<\/p>\n\n<p>Assim\u00e9tricas <strong>Liga\u00e7\u00f5es<\/strong> refor\u00e7am os efeitos, por exemplo, quando um n\u00f3 utiliza menos canais. Nesses casos, transfiro os dados armazenados em cache de forma seletiva, em vez de distribuir o processo. Configuro os hosts de m\u00e1quinas virtuais e de contentores de forma a que cada inst\u00e2ncia tenha uma liga\u00e7\u00e3o consistente ao n\u00f3. Desta forma, reduzo o tr\u00e1fego de dados remoto sem limitar as quotas. A f\u00edsica da m\u00e1quina estabelece os limites, e eu cumpro-os.<\/p>\n\n<h2>Compreender corretamente o interleave e o balanceamento<\/h2>\n\n<p>As pol\u00edticas de interleave distribuem a mem\u00f3ria de forma deliberada pelos n\u00f3s, para que <strong>Rendimento<\/strong> aumenta por processo ou os pontos de concentra\u00e7\u00e3o diminuem. Nesta configura\u00e7\u00e3o, valores elevados de interleave_hit s\u00e3o considerados desej\u00e1veis. Verifico ent\u00e3o, acima de tudo, a uniformidade, e n\u00e3o a localidade absoluta. O AutoNUMA ou o NUMA-Balancing podem ajudar, mas n\u00e3o em todas as situa\u00e7\u00f5es.<\/p>\n\n<p>Decido, consoante a situa\u00e7\u00e3o, se a fun\u00e7\u00e3o autom\u00e1tica <strong>Equil\u00edbrio<\/strong> permanece ativo. No caso de servi\u00e7os consistentes e de longa dura\u00e7\u00e3o, prefiro utilizar liga\u00e7\u00f5es fixas. Em caso de cargas vari\u00e1veis, o AutoNUMA pode reagir de forma adequada. Pode encontrar uma boa vis\u00e3o geral das vantagens e dos riscos no artigo <a href=\"https:\/\/webhosting.de\/pt\/desativar-o-numa-balancing-ou-mante-lo-ativado-para-um-desempenho-ideal-do-linux\/\">Equil\u00edbrio NUMA<\/a>. S\u00f3 quando o objetivo e o contexto estiverem claros \u00e9 que escolho o modo adequado.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/09\/NUMA_Statistik_Auswertung_1023.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Padr\u00f5es de carga de trabalho: bases de dados, m\u00e1quinas virtuais, servi\u00e7os Web<\/h2>\n\n<p>As bases de dados s\u00e3o sens\u00edveis a <strong>Lat\u00eancia<\/strong> entre a CPU e a RAM. Por isso, mantenho a inst\u00e2ncia, a cache de buffer e os shards ativos no mesmo n\u00f3. As m\u00e1quinas virtuais beneficiam de conjuntos de CPU bem definidos, juntamente com a RAM do n\u00f3, para que os sistemas operativos convidados vejam percursos consistentes. Os servi\u00e7os web com muitos trabalhadores t\u00eam um desempenho excelente quando os grupos de trabalhadores permanecem ligados a um \u00fanico n\u00f3. Para a estrat\u00e9gia de mem\u00f3ria, utilizo, consoante o caso, abordagens espec\u00edficas <a href=\"https:\/\/webhosting.de\/pt\/politicas-de-memoria-numa-otimizacao-de-servidores-de-bases-de-dados-servidores\/\">Pol\u00edticas de mem\u00f3ria NUMA<\/a>.<\/p>\n\n<p>Por outro lado, as tarefas anal\u00edticas e as digitaliza\u00e7\u00f5es de grande dimens\u00e3o, realizo-as parcialmente <strong>distribu\u00eddo<\/strong> . Neste caso, o interleave proporciona frequentemente melhores larguras de banda do que a localidade r\u00edgida. \u00c9 importante analisar com objetividade os padr\u00f5es de E\/S da carga de trabalho. A grava\u00e7\u00e3o tem um peso diferente da leitura, e os acessos aleat\u00f3rios diferem dos sequenciais. Escolho a pol\u00edtica que se adequa ao padr\u00e3o de acesso, e n\u00e3o aquela que parece mais adequada nos livros did\u00e1ticos.<\/p>\n\n<h2>Rotina pr\u00e1tica de medi\u00e7\u00e3o e ferramentas<\/h2>\n\n<p>Para come\u00e7ar, basta-me <strong>numastato<\/strong> e a visualiza\u00e7\u00e3o do processo. Registo as leituras dos contadores com a data, o PID e os indicadores de carga. \u00c9 importante efetuar as medi\u00e7\u00f5es em intervalos de tempo id\u00eanticos. Desta forma, \u00e9 poss\u00edvel representar com clareza as diferen\u00e7as entre o \u00abantes\u00bb e o \u00abdepois\u00bb. Nos intervalos produtivos, registo as varia\u00e7\u00f5es e correlaciono-as com as datas de lan\u00e7amento.<\/p>\n\n<p>No caso de <strong>Servi\u00e7os<\/strong> Al\u00e9m disso, verifico a utiliza\u00e7\u00e3o da CPU e a visibilidade dos n\u00f3s com ferramentas como o lscpu, o numactl e o perf para analisar a carga remota. Documento a pol\u00edtica selecionada em cada ciclo de medi\u00e7\u00e3o. Ap\u00f3s uma altera\u00e7\u00e3o, volto a efetuar medi\u00e7\u00f5es. S\u00f3 quando as linhas de tend\u00eancia se estabilizam \u00e9 que considero o efeito bem-sucedido. A mudan\u00e7a cega pode facilmente levar a melhorias ilus\u00f3rias.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/09\/linux_numa_auswertung_7463.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Evitar interpreta\u00e7\u00f5es erradas frequentes<\/h2>\n\n<p>Um alto <strong>interleave_hit<\/strong> N\u00e3o \u00e9 um erro se o Interleave estiver ativo de forma intencional. Da mesma forma, um \u00fanico erro \u00e9 insignificante num per\u00edodo de execu\u00e7\u00e3o prolongado. Verifico sempre a densidade e a distribui\u00e7\u00e3o ao longo do intervalo, n\u00e3o apenas os picos. Algumas pessoas interpretam \u00abother_node\u00bb como algo globalmente negativo e ignoram a natureza da carga de trabalho. Por isso, analiso primeiro o objetivo de conce\u00e7\u00e3o e s\u00f3 depois avalio os n\u00fameros.<\/p>\n\n<p>Outro equ\u00edvoco: <strong>Vis\u00e3o geral<\/strong> Bem, assim fica tudo bem. Muitas vezes, os valores at\u00edpicos escondem-se apenas em alguns PIDs. Ou os agendadores de contentores distribuem os pods por v\u00e1rios n\u00f3s, embora fizesse sentido formar um grupo local. S\u00f3 consigo detetar esses efeitos quando fa\u00e7o medi\u00e7\u00f5es por processo. Sem esse n\u00edvel de detalhe, a an\u00e1lise fica incompleta.<\/p>\n\n<h2>Passos de afina\u00e7\u00e3o com resultados vis\u00edveis<\/h2>\n\n<p>Come\u00e7o por <strong>Coloca\u00e7\u00e3o<\/strong>: Processos nos n\u00f3s onde os dados se encontram ou devem encontrar-se. Em seguida, defino a afinidade da CPU para que os threads n\u00e3o saltem de um soquete para outro. Segue-se a vincula\u00e7\u00e3o de mem\u00f3ria, para que o kernel aloque a mem\u00f3ria no local pretendido. Para cargas vari\u00e1veis, verifico as pol\u00edticas e, se for o caso, utilizo o AutoNUMA.<\/p>\n\n<p>Em seguida, encarreguei-me de <strong>Consist\u00eancia<\/strong> No ciclo de vida: os rein\u00edcios, as implementa\u00e7\u00f5es e os ajustes de escala n\u00e3o devem alterar aleatoriamente as liga\u00e7\u00f5es entre n\u00f3s. Documento as liga\u00e7\u00f5es em c\u00f3digo, para que se mantenham reproduz\u00edveis. Depois, volto a medir, avalio as varia\u00e7\u00f5es e decido sobre o ajuste fino. Cada altera\u00e7\u00e3o merece uma prova clara, baseada em medi\u00e7\u00f5es.<\/p>\n\n<h2>Exemplo pr\u00e1tico: De fracasso a sucesso<\/h2>\n\n<p>Suponhamos que uma <strong>Base de dados<\/strong> Apresenta, sob carga, um aumento do \u00abnuma_miss\u00bb e do \u00abother_node\u00bb. A lat\u00eancia das consultas varia mais acentuadamente. Verifico primeiro a aloca\u00e7\u00e3o de processos e constato que, ap\u00f3s uma implementa\u00e7\u00e3o, o servi\u00e7o est\u00e1 a ser executado no n\u00f3 A, mas a cache foi alocada no n\u00f3 B. Ap\u00f3s a atribui\u00e7\u00e3o fixa da CPU e da mem\u00f3ria ao n\u00f3 B, a rela\u00e7\u00e3o inverte-se: o \u00abnuma_hit\u00bb aumenta e os \u00abmisses\u00bb diminuem. Os tempos de resposta tornam-se mais constantes e a carga da CPU diminui ligeiramente, uma vez que os acessos remotos deixam de ocorrer.<\/p>\n\n<p>Ao mesmo tempo, verifico a <strong>Pol\u00edtica<\/strong>. O Interleave estava ativado inadvertidamente e distribuiu aloca\u00e7\u00f5es. Ap\u00f3s a mudan\u00e7a para o n\u00f3 preferencial, a cache permanece fechada localmente. Ap\u00f3s uma hora de medi\u00e7\u00e3o, os deltas confirmam a melhoria. S\u00f3 ent\u00e3o considero o ajuste um sucesso. Sem esta verifica\u00e7\u00e3o cruzada, um instant\u00e2neo teria induzido em erro.<\/p>\n\n<h2>M\u00e9tricas e valores de refer\u00eancia para a pr\u00e1tica<\/h2>\n\n<p>Para tomar decis\u00f5es, recorro a crit\u00e9rios s\u00f3lidos <strong>Probabilidades<\/strong> em vez de valores brutos individuais. Calculo, para cada processo, a taxa de aloca\u00e7\u00e3o local_alloc = numa_hit \/ (numa_hit + numa_miss). Al\u00e9m disso, analiso a <strong>Taxa de acesso<\/strong> calculo local_access = local_node \/ (local_node + other_node). Ambos, em conjunto, indicam se a mem\u00f3ria continua a ser utilizada localmente mesmo ap\u00f3s a aloca\u00e7\u00e3o. Como valores de refer\u00eancia aproximados, utilizo o seguinte: no caso de servi\u00e7os em que a lat\u00eancia \u00e9 cr\u00edtica, procuro manter os acessos remotos abaixo de 5\u201310 %. No caso de cargas de trabalho anal\u00edticas de largura de banda, tolero 20\u201330 %, desde que o d\u00e9bito aumente. O fator decisivo \u00e9 a <strong>Estabilidade<\/strong> ao longo do tempo. Prefiro um valor que se mantenha est\u00e1vel sob carga a um pico breve com valores perfeitos. Registo estes intervalos-alvo por cada interven\u00e7\u00e3o de manuten\u00e7\u00e3o, para que as medi\u00e7\u00f5es posteriores possam ser claramente contextualizadas.<\/p>\n\n<h2>Cgroups, contentores e armadilhas do agendador<\/h2>\n\n<p>Em ambientes de contentores, verifico primeiro o <strong>cpuset<\/strong>\u2011Atribui\u00e7\u00e3o: conjuntos de CPU e <em>cpuset.mems<\/em> t\u00eam de corresponder ao mesmo espa\u00e7o de n\u00f3s, caso contr\u00e1rio, surgir\u00e3o inevitavelmente erros. Asseguro-me de que os pods com pedidos fixos de CPU n\u00e3o sejam distribu\u00eddos por v\u00e1rios n\u00f3s NUMA e de que o agendador n\u00e3o distribua workers da mesma aplica\u00e7\u00e3o por v\u00e1rios n\u00f3s. No caso dos tipos \u00abburst\u00bb, limito o n\u00famero m\u00e1ximo de threads por pod de forma a que permane\u00e7am dentro de um \u00fanico n\u00f3. Documento o <strong>Dom\u00ednio NUMA<\/strong> por implementa\u00e7\u00e3o e exijo r\u00e9plicas consistentes (um grupo de trabalhadores por n\u00f3, n\u00e3o meios grupos distribu\u00eddos por dois n\u00f3s). Se calcular o tamanho da mem\u00f3ria por pod de forma demasiado apertada, estou a criar uma press\u00e3o indesejada: uma ligeira margem por n\u00f3 evita que o kernel tenha de recorrer prematuramente a n\u00f3s externos. Se os contentores forem reiniciados com frequ\u00eancia, presto aten\u00e7\u00e3o \u00e0 liga\u00e7\u00e3o determin\u00edstica, para que <strong>Arranques a frio<\/strong> n\u00e3o ficar com uma localiza\u00e7\u00e3o pior por acaso.<\/p>\n\n<h2>Alinhar m\u00e1quinas virtuais e vNUMA de forma consistente<\/h2>\n\n<p>No que diz respeito \u00e0s m\u00e1quinas virtuais, a minha aten\u00e7\u00e3o centra-se em <strong>vNUMA<\/strong>: A topologia virtual tem de corresponder \u00e0 f\u00edsica. Distribuo as vCPUs de forma a que cada n\u00f3 vNUMA fique alojado exatamente num n\u00f3 NUMA f\u00edsico. Do lado do anfitri\u00e3o, atribuo os threads do QEMU\/hipervisor a este dom\u00ednio e garanto que a RAM atribu\u00edda seja fornecida na totalidade a partir deste n\u00f3. <strong>Balonismo<\/strong> E, no caso de m\u00e1quinas virtuais em que a lat\u00eancia \u00e9 cr\u00edtica, aceito o overcommit com cautela; o ballooning agressivo pode empurrar os hotsets para fora do n\u00f3 e aumentar significativamente os acessos remotos. Na migra\u00e7\u00e3o em tempo real, verifico novamente as liga\u00e7\u00f5es ap\u00f3s a transfer\u00eancia \u2013 alguns ambientes perdem, nesse processo, as liga\u00e7\u00f5es de CPU e mem\u00f3ria definidas com precis\u00e3o. S\u00f3 quando o alinhamento vNUMA estiver correto \u00e9 que avalio o `numastat` em todo o sistema: caso contr\u00e1rio, estou a corrigir os sintomas, n\u00e3o a causa.<\/p>\n\n<h2>THP, Hugepages e migra\u00e7\u00e3o de p\u00e1ginas<\/h2>\n\n<p><strong>P\u00e1ginas enormes transparentes<\/strong> (THP) podem tanto ajudar como prejudicar. P\u00e1ginas maiores reduzem as falhas de TLB e melhoram a largura de banda, mas se o kernel s\u00f3 ativar as Hugepages numa fase tardia <em>desmoronou-se<\/em> ou migrados, podem ser inadequados <strong>Dist\u00e2ncias longas<\/strong> surgem. Sigo duas regras: em primeiro lugar, a <strong>Pol\u00edtica<\/strong> definir claramente (por exemplo, n\u00f3 preferencial) e, sempre que poss\u00edvel, criar aloca\u00e7\u00f5es locais de grande dimens\u00e3o desde o in\u00edcio. Em segundo lugar, no caso de cargas de trabalho com caches fixas e de grande dimens\u00e3o, defino, sempre que poss\u00edvel, Hugepages est\u00e1ticas (hugetlb), que reservo explicitamente num n\u00f3. Isto reduz a fragmenta\u00e7\u00e3o e os movimentos de compensa\u00e7\u00e3o. Se observar nas s\u00e9ries temporais que, ap\u00f3s um per\u00edodo de execu\u00e7\u00e3o mais longo, o <em>outro_n\u00f3<\/em>\u2011\u00c0 medida que a percentagem aumenta, verifico se <strong>Migra\u00e7\u00e3o de p\u00e1ginas<\/strong> ou se ocorre compacta\u00e7\u00e3o e se as configura\u00e7\u00f5es do THP se adequam ao padr\u00e3o. O que \u00e9 importante para mim \u00e9: n\u00e3o desativar nem ativar globalmente \u2013 decido caso a caso, por servi\u00e7o, e avalio o efeito na localidade e na lat\u00eancia.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/09\/linux-numa-analyse-4746.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Como interpretar corretamente os par\u00e2metros \u00abReclaim\u00bb, \u00abSwap\u00bb e \u00abMemory-Pressure\u00bb<\/h2>\n\n<p>Se as caixas subirem sem que haja uma altera\u00e7\u00e3o evidente na sua posi\u00e7\u00e3o, procuro <strong>press\u00e3o de armazenamento<\/strong> por n\u00f3. Os n\u00f3s cheios obrigam o kernel a realizar opera\u00e7\u00f5es de recupera\u00e7\u00e3o e compacta\u00e7\u00e3o, em parte desencadeadas por <em>kswapd<\/em> num outro n\u00f3 \u2013 isso provoca efeitos colaterais nos contadores. Verifico, por cada n\u00f3, a mem\u00f3ria livre e a utiliza\u00e7\u00e3o da cache de p\u00e1ginas. Ativado <strong>Troca<\/strong> pode substituir os Hotsets e fazer com que as lat\u00eancias disparem; para servi\u00e7os particularmente sens\u00edveis, desativo o swap ou limito-o rigorosamente. Nos registos e nas visualiza\u00e7\u00f5es do perf, procuro picos de recupera\u00e7\u00e3o durante os picos de carga. O objetivo \u00e9 ter espa\u00e7o livre suficiente, <strong>locais<\/strong> Manter a RAM no n\u00f3 de destino, para que as aloca\u00e7\u00f5es n\u00e3o se desloquem. Se for necess\u00e1rio reduzir as caches para tal, dou prioridade ao conjunto de trabalho do servi\u00e7o em rela\u00e7\u00e3o \u00e0 cache de p\u00e1ginas gen\u00e9rica.<\/p>\n\n<h2>Comandos pr\u00e1ticos e an\u00e1lise<\/h2>\n\n<p>Para a perspetiva do processo, utilizo <code>numastat -p<\/code> e acrescento <code>cat \/proc\/\/numa_maps<\/code>, para ver as aloca\u00e7\u00f5es por \u00e1rea (an\u00f3nimas, baseadas em ficheiros) e por n\u00f3. <code>numactl --hardware<\/code> fornece-me matrizes de lat\u00eancia e tamanhos de n\u00f3s, <code>lscpu --extended<\/code> mostra a atribui\u00e7\u00e3o da CPU aos n\u00f3s. Para acessos \u00e0 mem\u00f3ria com \u00eanfase em percursos remotos, defino <code>mem\u00f3ria de desempenho<\/code> para verificar os padr\u00f5es de carga. Recolho os deltas de forma reprodut\u00edvel, por exemplo:<\/p>\n\n<p><em>Rotina de medi\u00e7\u00e3o<\/em><\/p>\n<ul>\n  <li>t0: guardar o \u00abnumastat\u00bb (total) e o \u00abnumastat -p\u00bb para os PIDs principais<\/li>\n  <li>30\u201360 s de exerc\u00edcio com carga, fase de esfor\u00e7o id\u00eantica<\/li>\n  <li>t1: reler o numastat, calcular os deltas por contador<\/li>\n  <li>Registar valores de mem\u00f3ria paralelos da CPU, de mudan\u00e7a de contexto e dos n\u00f3s<\/li>\n<\/ul>\n\n<p>Em seguida, calculo o <strong>Probabilidades<\/strong> e identifico quais os processos que se desviam significativamente das tend\u00eancias a n\u00edvel do sistema. Nos casos em que subsiste alguma incerteza, repito a medi\u00e7\u00e3o pelo menos tr\u00eas vezes. S\u00f3 considero fi\u00e1veis as varia\u00e7\u00f5es que se revelam consistentes. Para uma monitoriza\u00e7\u00e3o cont\u00ednua, mapeio os contadores em s\u00e9ries temporais e associo-os aos metadados de lan\u00e7amento \u2013 assim consigo identificar <strong>Pontos de regress\u00e3o<\/strong> imediatamente.<\/p>\n\n<h2>Lista de verifica\u00e7\u00e3o para um ajuste NUMA organizado<\/h2>\n\n<ul>\n  <li>Definir o objetivo: lat\u00eancia vs. d\u00e9bito, carga fixa vs. carga vari\u00e1vel<\/li>\n  <li>Analisar a topologia: n\u00f3s, lat\u00eancias, reservas de RAM dispon\u00edveis por n\u00f3<\/li>\n  <li>Medir a linha de base: numastat total e por processo, calcular as propor\u00e7\u00f5es<\/li>\n  <li>Corrigir a afeta\u00e7\u00e3o: afinidade da CPU, vincula\u00e7\u00e3o de mem\u00f3ria, pol\u00edticas<\/li>\n  <li>Configurar contentores\/m\u00e1quinas virtuais: cpuset.cpus = n\u00f3s, cpuset.mems adequados; mapear corretamente o vNUMA<\/li>\n  <li>Escolher deliberadamente THP\/Hugepages, tendo em conta a fragmenta\u00e7\u00e3o<\/li>\n  <li>Reduzir a press\u00e3o de mem\u00f3ria: verificar a margem de mem\u00f3ria por n\u00f3 e a estrat\u00e9gia de swap<\/li>\n  <li>Medi\u00e7\u00f5es posteriores: comparar os deltas, garantir a estabilidade ao longo do tempo<\/li>\n  <li>Documenta\u00e7\u00e3o: liga\u00e7\u00f5es como c\u00f3digo, notas de lan\u00e7amento com contexto NUMA<\/li>\n<\/ul>\n\n<h2>Brevemente resumido<\/h2>\n\n<p>Analiso os dados NUMA ao <strong>Sinais<\/strong> Leia tamb\u00e9m: pares de contadores, evolu\u00e7\u00e3o temporal e vis\u00e3o do processo. Os valores-chave numa_hit, numa_miss, numa_foreign, local_node, other_node e interleave_hit mostram-me a localidade, os movimentos de desvio e as estrat\u00e9gias de distribui\u00e7\u00e3o. Tomo as minhas decis\u00f5es com base na topologia e na carga de trabalho, e n\u00e3o com base em valores-limite r\u00edgidos. O ajuste come\u00e7a com o posicionamento, a afinidade, uma pol\u00edtica adequada e uma rotina de medi\u00e7\u00e3o rigorosa. \u00c9 assim que consigo garantir um desempenho constante <strong>Desempenho<\/strong>, porque a CPU e a RAM s\u00e3o adequadas \u00e0 aplica\u00e7\u00e3o e os transfer\u00eancias de dados de longa dist\u00e2ncia s\u00e3o raras.<\/p>","protected":false},"excerpt":{"rendered":"<p>Analisar corretamente as estat\u00edsticas NUMA do Linux: compreender as estat\u00edsticas NUMA, verificar a localidade da mem\u00f3ria e melhorar de forma espec\u00edfica o desempenho do servidor.<\/p>","protected":false},"author":1,"featured_media":21436,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[676],"tags":[],"class_list":["post-21443","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server_vm"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"65","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"Linux NUMA","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"21436","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/21443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/comments?post=21443"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/21443\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media\/21436"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media?parent=21443"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/categories?post=21443"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/tags?post=21443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}