{"id":18945,"date":"2026-04-11T18:21:07","date_gmt":"2026-04-11T16:21:07","guid":{"rendered":"https:\/\/webhosting.de\/numa-balancing-server-memory-optimierung-hardware-numaflux\/"},"modified":"2026-04-11T18:21:07","modified_gmt":"2026-04-11T16:21:07","slug":"numa-balanceamento-servidor-memoria-otimizacao-hardware-numaflux","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pt\/numa-balancing-server-memory-optimierung-hardware-numaflux\/","title":{"rendered":"Servidor de balanceamento NUMA: Otimiza\u00e7\u00e3o do acesso \u00e0 mem\u00f3ria para hardware de alojamento"},"content":{"rendered":"<p>Eu mostro como <strong>Servidor de balanceamento NUMA<\/strong> no hardware de alojamento simplifica o acesso \u00e0 mem\u00f3ria e reduz as lat\u00eancias, associando processos e dados ao n\u00f3 NUMA adequado. O fator decisivo \u00e9 o <strong>Otimiza\u00e7\u00e3o do acesso \u00e0 mem\u00f3ria<\/strong> atrav\u00e9s de acesso local, coloca\u00e7\u00e3o de tarefas e migra\u00e7\u00e3o de p\u00e1ginas direcionada para anfitri\u00f5es Linux com muitos n\u00facleos.<\/p>\n\n<h2>Pontos centrais<\/h2>\n\n<ul>\n  <li><strong>NUMA<\/strong> separa as CPUs e a mem\u00f3ria em n\u00f3s; os acessos locais fornecem <strong>baixo<\/strong> Lat\u00eancia.<\/li>\n  <li><strong>Autom\u00e1tico<\/strong> O balanceamento NUMA migra p\u00e1ginas e coloca tarefas <strong>perto do n\u00f3<\/strong>.<\/li>\n  <li><strong>Tamanho da VM<\/strong> por n\u00f3, caso contr\u00e1rio existe um risco <strong>Elimina\u00e7\u00e3o de NUMA<\/strong>.<\/li>\n  <li><strong>Ferramentas<\/strong> como numactl, lscpu, numad show <strong>Topologia<\/strong> e usar.<\/li>\n  <li><strong>Afina\u00e7\u00e3o<\/strong>C-States, Node Interleaving de, <strong>P\u00e1ginas enormes<\/strong>, afinidades.<\/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\/04\/serverraum-speicheroptimum-5582.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>O que \u00e9 o NUMA - e porque \u00e9 importante para o alojamento<\/h2>\n\n<p>O NUMA divide um sistema multiprocessador em <strong>N\u00f3<\/strong>, que cont\u00eam cada uma as suas pr\u00f3prias CPUs e mem\u00f3ria local, tornando os acessos pr\u00f3ximos mais r\u00e1pidos do que os remotos. Enquanto a UMA envia todos os n\u00facleos para um caminho comum, a NUMA evita estrangulamentos devido a <strong>local<\/strong> canais de mem\u00f3ria por n\u00f3. Em ambientes de alojamento com muitas VMs paralelas, cada milissegundo de lat\u00eancia \u00e9 adicionado, pelo que cada pedido beneficia de forma mensur\u00e1vel. Se pretender obter mais informa\u00e7\u00f5es de base, pode obter mais informa\u00e7\u00f5es sobre <a href=\"https:\/\/webhosting.de\/pt\/blog-numa-arquitetura-servidor-desempenho-alojamento-hardware-otimizacao-infraestrutura\/\">Arquitetura NUMA<\/a>. Para mim, uma coisa \u00e9 certa: se compreender e utilizar os n\u00f3s, obt\u00e9m mais largura de banda com o mesmo hardware.<\/p>\n\n<h2>Balanceamento autom\u00e1tico de NUMA no kernel Linux - como funciona<\/h2>\n\n<p>O kernel examina periodicamente partes do espa\u00e7o de endere\u00e7o e \u201edesmapeia\u201c p\u00e1ginas para que uma falha de sugest\u00e3o possa <strong>\u00f3timo<\/strong> n\u00f3 vis\u00edvel. Se a falha ocorrer, o algoritmo avalia se vale a pena migrar a p\u00e1gina ou mover a tarefa e evita movimentos desnecess\u00e1rios. Migrar em caso de falha traz <strong>Dados<\/strong> mais perto da CPU em execu\u00e7\u00e3o, a coloca\u00e7\u00e3o de tarefas NUMA move os processos para mais perto da sua mem\u00f3ria. O scanner distribui seu trabalho pe\u00e7a por pe\u00e7a para que a sobrecarga permane\u00e7a dentro do ru\u00eddo da carga normal. Isso resulta em um ajuste fino cont\u00ednuo que reduz a lat\u00eancia sem exigir regras r\u00edgidas de fixa\u00e7\u00e3o.<\/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\/04\/memoryoptimization1234.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Otimiza\u00e7\u00e3o do acesso \u00e0 mem\u00f3ria: local bate remoto<\/h2>\n\n<p>Os acessos locais utilizam o <strong>Controlador de mem\u00f3ria<\/strong> do seu pr\u00f3prio n\u00f3 e minimiza os tempos de espera para a interliga\u00e7\u00e3o. Os acessos remotos custam ciclos atrav\u00e9s de QPI\/UPI ou Infinity Fabric e minimizam assim o tempo de acesso efetivo. <strong>Largura de banda<\/strong>. Os n\u00fameros elevados de n\u00facleos exacerbam este efeito porque cada vez mais n\u00facleos est\u00e3o a competir pelas mesmas liga\u00e7\u00f5es. Por isso, planeio de forma a que o c\u00f3digo quente e os dados activos se encontrem num \u00fanico n\u00f3. Se ignorarmos isto, perdemos pontos percentuais que determinam o tempo de resposta ou o tempo limite durante os picos de carga.<\/p>\n\n<h2>Tamanhos de VM, elimina\u00e7\u00e3o de NUMA e corte de anfitri\u00f5es<\/h2>\n\n<p>Dimensiono as VMs de modo que as vCPUs e a RAM caibam em um n\u00f3 NUMA para evitar o acesso entre n\u00f3s. Muitas vezes, 4-8 vCPUs por n\u00f3 proporcionam um bom desempenho. <strong>Taxas de acerto<\/strong>, dependendo da plataforma e da hierarquia da cache. P\u00e1ginas enormes tamb\u00e9m ajudam porque o TLB funciona de forma mais eficiente e as migra\u00e7\u00f5es de p\u00e1gina ocorrem com menos frequ\u00eancia. Se necess\u00e1rio, defino <strong>Afinidade com a CPU<\/strong> para que os processos cr\u00edticos em termos de lat\u00eancia associem as threads aos n\u00facleos adequados - para mais informa\u00e7\u00f5es, consulte <a href=\"https:\/\/webhosting.de\/pt\/servidor-cpu-affinity-hosting-otimizacao-kernelaffinity\/\">Afinidade com a CPU<\/a>. Se as VMs forem distribu\u00eddas por v\u00e1rios n\u00f3s, corre-se o risco de uma destrui\u00e7\u00e3o NUMA, ou seja, um ping-pong de dados e threads.<\/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\/04\/numa-balancing-server-memory-2948.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Ferramentas na pr\u00e1tica: numactl, lscpu, numad<\/h2>\n\n<p>Com \u201elscpu\u201c leio <strong>Topologia<\/strong> e os n\u00f3s NUMA, incluindo a atribui\u00e7\u00e3o dos n\u00facleos. \u201enumactl -hardware\u201c mostra-me a mem\u00f3ria por n\u00f3 e as dist\u00e2ncias dispon\u00edveis, o que facilita a avalia\u00e7\u00e3o dos caminhos. O daemon \u201enumad\u201c monitora a utiliza\u00e7\u00e3o e ajusta dinamicamente as afinidades quando os centros de carga se movem. Para cen\u00e1rios fixos, eu uso \u201enumactl -cpunodebind\/-membind\u201c para fixar explicitamente processos e mem\u00f3ria. Desta forma, combino o balanceamento autom\u00e1tico com especifica\u00e7\u00f5es espec\u00edficas e controlo o resultado atrav\u00e9s de \u201eperf\u201c, \u201enumastat\u201c e \u201e\/proc\u201c.<\/p>\n\n<h2>Como me\u00e7o o impacto: N\u00fameros-chave e comandos<\/h2>\n\n<p>Avalio sempre o NUMA-Tuning atrav\u00e9s de <strong>S\u00e9rie de medi\u00e7\u00f5es<\/strong>, e n\u00e3o por intui\u00e7\u00e3o. Tr\u00eas indicadores provaram o seu valor: R\u00e1cio de visualiza\u00e7\u00f5es de p\u00e1ginas locais e remotas, taxa de migra\u00e7\u00e3o e distribui\u00e7\u00e3o da lat\u00eancia (P95\/P99).<\/p>\n<ul>\n  <li><strong>Em todo o sistema<\/strong>numastat\u201e mostra os acessos locais\/remotos e as p\u00e1ginas migradas por n\u00f3.<\/li>\n  <li><strong>Relacionadas com o processo<\/strong>: \u201e\/proc\/\/numa_maps\u201c revela onde a mem\u00f3ria est\u00e1 localizada e como foi distribu\u00edda.<\/li>\n  <li><strong>Vista do programador<\/strong>Cpus_allowed_list\u201e e \u201cCpus_allowed\u201e real verificam se as liga\u00e7\u00f5es se aplicam.<\/li>\n<\/ul>\n<pre><code># Vista de todo o sistema\nnumastat\nnumastat -m\n\n# Distribui\u00e7\u00e3o e liga\u00e7\u00f5es relacionadas com o processo\npid=$(pidof )\nnumastat -p \"$pid\"\ncat \/proc\/\"$pid\"\/numa_maps | head\ncat \/proc\/\"$pid\"\/status | grep -E 'Cpus_allowed_list|Mems_allowed_list'\ntaskset -cp \"$pid\"\n\n# Contador do kernel para atividade NUMA\ngrep -E 'numa|migrate' \/proc\/vmstat\n\n# Eventos de rastreio para an\u00e1lises profundas (ativar por um curto per\u00edodo de tempo)\necho 1 &gt; \/sys\/kernel\/debug\/tracing\/events\/mm\/enable\nsleep 5; cat \/sys\/kernel\/debug\/tracing\/trace | grep -i numa; echo 0 &gt; \/sys\/kernel\/debug\/tracing\/events\/mm\/enable\n<\/code><\/pre>\n<p>Comparo em cada caso <strong>A\/B<\/strong>O objetivo \u00e9 reduzir claramente o ru\u00eddo dos acessos remotos e das migra\u00e7\u00f5es, bem como reduzir as lat\u00eancias P95\/P99. O objetivo \u00e9 uma clara redu\u00e7\u00e3o dos acessos remotos e do ru\u00eddo de migra\u00e7\u00e3o, bem como lat\u00eancias P95\/P99 mais apertadas. S\u00f3 quando os valores medidos estiverem a melhorar de forma est\u00e1vel \u00e9 que eu assumo o controlo da afina\u00e7\u00e3o.<\/p>\n\n<h2>Defini\u00e7\u00f5es de BIOS e firmware que realmente funcionam<\/h2>\n\n<p>Desligo o \u201eNode Interleaving\u201c na BIOS para que a estrutura NUMA permane\u00e7a vis\u00edvel e o kernel <strong>local<\/strong> pode planear. Os estados C reduzidos estabilizam os picos de lat\u00eancia porque os n\u00facleos t\u00eam menos probabilidades de cair em estados de sono profundo, o que poupa tempo de despertar. Atribuo canais de mem\u00f3ria simetricamente para que cada n\u00f3 possa utilizar a sua capacidade m\u00e1xima de mem\u00f3ria. <strong>Largura de banda<\/strong> alcan\u00e7ado. Testo os prefetchers e as funcionalidades RAS com perfis de carga de trabalho, uma vez que ajudam ou prejudicam consoante o padr\u00e3o de acesso. Me\u00e7o todas as altera\u00e7\u00f5es em rela\u00e7\u00e3o a uma linha de base e s\u00f3 depois \u00e9 que as adopto permanentemente.<\/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\/04\/NUMA_Balancing_Server_8345.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Par\u00e2metros do kernel e do sysctl que fazem a diferen\u00e7a<\/h2>\n\n<p>O ajuste fino do kernel ajuda-me, <strong>Despesas gerais<\/strong> e <strong>Tempo de resposta<\/strong> do balanceador para corresponder \u00e0 carga de trabalho. Come\u00e7o com predefini\u00e7\u00f5es conservadoras e vou avan\u00e7ando passo a passo.<\/p>\n<ul>\n  <li><strong>kernel.numa_balancing<\/strong>Ligar\/desligar o equil\u00edbrio autom\u00e1tico. Deixo-o ligado para cargas m\u00f3veis; desligo-o para servi\u00e7os especiais estritamente fixados como um teste.<\/li>\n  <li><strong>kernel.numa_balancing_scan_delay_ms<\/strong>Tempo de espera antes da primeira an\u00e1lise ap\u00f3s a cria\u00e7\u00e3o do processo. Selecione maior se estiverem em execu\u00e7\u00e3o muitas tarefas de curta dura\u00e7\u00e3o; menor para servi\u00e7os de longa dura\u00e7\u00e3o que exijam uma proximidade r\u00e1pida.<\/li>\n  <li><strong>kernel.numa_balancing_scan_period_min_ms \/ _max_ms<\/strong>Largura de banda dos intervalos de pesquisa. Os intervalos estreitos aumentam a capacidade de resposta, mas tamb\u00e9m a carga da CPU.<\/li>\n  <li><strong>kernel.numa_balancing_scan_size_mb<\/strong>Propor\u00e7\u00e3o do espa\u00e7o de endere\u00e7amento por varrimento. Demasiado grande gera tempestades de falhas, demasiado pequeno reage com lentid\u00e3o.<\/li>\n  <li><strong>vm.zone_reclaim_mode<\/strong>Quando a mem\u00f3ria \u00e9 escassa, o kernel prefere a recupera\u00e7\u00e3o local em vez da aloca\u00e7\u00e3o remota. Para cargas de trabalho gerais de hospedagem, eu normalmente deixo <em>0<\/em>; Para servi\u00e7os de mem\u00f3ria local estritamente sens\u00edveis \u00e0 lat\u00eancia, testo cuidadosamente valores mais elevados.<\/li>\n  <li><strong>P\u00e1ginas enormes transparentes (THP)<\/strong>Em \u201e\/sys\/kernel\/mm\/transparent_hugepage\/{enabled,defrag}\u201c, normalmente defino para <em>enlouquecer<\/em> e desfragmenta\u00e7\u00e3o conservadora. Os perfis r\u00edgidos \u201esempre\u201c trazem vantagens para a TLB, mas correm o risco de ficarem parados devido \u00e0 compacta\u00e7\u00e3o.<\/li>\n  <li><strong>sched_migration_cost_ns<\/strong>Estimativa do custo da migra\u00e7\u00e3o de tarefas. Valores mais elevados atenuam a redistribui\u00e7\u00e3o de agendadores agressivos.<\/li>\n  <li><strong>cgroups cpuset<\/strong>Com <em>cpuset.cpus<\/em> e <em>cpuset.mems<\/em> Separo os servi\u00e7os de forma limpa por n\u00f3 e certifico-me de que <strong>Primeiro toque<\/strong> permanece dentro dos n\u00f3s admiss\u00edveis.<\/li>\n<\/ul>\n<pre><code># Exemplo: balanceamento conservador mas reativo\nsysctl -w kernel.numa_balancing=1\nsysctl -w kernel.numa_balancing_scan_delay_ms=30000\nsysctl -w kernel.numa_balancing_scan_period_min_ms=60000\nsysctl -w kernel.numa_balancing_scan_period_max_ms=300000\nsysctl -w kernel.numa_balancing_scan_size_mb=256\n\n# Use o THP com cuidado\necho madvise &gt; \/sys\/kernel\/mm\/transparent_hugepage\/enabled\necho defer &gt; \/sys\/kernel\/mm\/transparent_hugepage\/defrag\n<\/code><\/pre>\n<p>Continua a ser importante: Alterar apenas um parafuso de ajuste por ronda de teste e testar o efeito contra a mesma curva de carga. \u00c9 assim que eu separo a causa do efeito.<\/p>\n\n<h2>Posicionar corretamente as cargas de trabalho: Bases de dados, caches, contentores<\/h2>\n\n<p>As bases de dados beneficiam quando os pools de buffers permanecem locais por n\u00f3 NUMA e as threads est\u00e3o ligadas perto dos seus heaps. Nas caches na mem\u00f3ria, defino a fragmenta\u00e7\u00e3o para <strong>N\u00f3<\/strong> para evitar buscas remotas. As plataformas de contentores recebem limites e pedidos para que os pods n\u00e3o saltem entre n\u00f3s. Para reservas de mem\u00f3ria, eu uso Huge Pages, o que facilita o armazenamento de hotsets em <strong>Caches<\/strong> ajuste. O quadro seguinte resume as estrat\u00e9gias e os efeitos t\u00edpicos de forma compacta.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Estrat\u00e9gia<\/th>\n      <th>Utiliza\u00e7\u00e3o<\/th>\n      <th>Efeito esperado<\/th>\n      <th>Nota<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Primeiro toque<\/td>\n      <td>Bases de dados, heaps da JVM<\/td>\n      <td>Atribui\u00e7\u00e3o da parte local<\/td>\n      <td>Executar a inicializa\u00e7\u00e3o no n\u00f3 de destino<\/td>\n    <\/tr>\n    <tr>\n      <td>Intercalar<\/td>\n      <td>Carga amplamente distribu\u00edda<\/td>\n      <td>Distribui\u00e7\u00e3o homog\u00e9nea<\/td>\n      <td>N\u00e3o \u00e9 ideal para hotspots<\/td>\n    <\/tr>\n    <tr>\n      <td>Fixa\u00e7\u00e3o de tarefas<\/td>\n      <td>Servi\u00e7os cr\u00edticos em termos de lat\u00eancia<\/td>\n      <td>Lat\u00eancia constante<\/td>\n      <td>Menos flex\u00edvel durante as mudan\u00e7as de carga<\/td>\n    <\/tr>\n    <tr>\n      <td>Equil\u00edbrio autom\u00e1tico<\/td>\n      <td>Cargas de trabalho mistas<\/td>\n      <td>Proximidade din\u00e2mica<\/td>\n      <td>Pondera\u00e7\u00e3o das despesas gerais em rela\u00e7\u00e3o ao lucro<\/td>\n    <\/tr>\n    <tr>\n      <td>P\u00e1ginas enormes<\/td>\n      <td>Grandes pilhas, caches<\/td>\n      <td>Menos faltas de TLB<\/td>\n      <td>Planear reservas limpas<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>Virtualiza\u00e7\u00e3o: NUMA virtual, agendador e personaliza\u00e7\u00e3o de convidados<\/h2>\n\n<p>O Virtual NUMA passa a topologia do anfitri\u00e3o para o SO convidado de uma forma simplificada, para que o primeiro toque e a <strong>Alocador<\/strong> funcionam de forma sensata. Os agendadores do hipervisor prestam aten\u00e7\u00e3o \u00e0 proximidade do n\u00f3 ao distribuir vCPUs e migrar VMs. Raramente alinho VMs grandes em v\u00e1rios n\u00f3s, a menos que a carga de trabalho tenha um grande fluxo e se beneficie da intercala\u00e7\u00e3o. No convidado, eu personalizo os heaps de JVMs ou bancos de dados para que eles permane\u00e7am locais em n\u00f3s NUMA vis\u00edveis. Para o gerenciamento de mem\u00f3ria no convidado, uma olhada em <a href=\"https:\/\/webhosting.de\/pt\/memoria-virtual-gestao-do-servidor-alojamento-armazenamento\/\">Mem\u00f3ria virtual<\/a>, para controlar o tamanho das p\u00e1ginas e a troca de ficheiros.<\/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\/04\/optimierung_hardware_1234.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Proximidade do PCIe: NVMe e NICs nos n\u00f3s certos<\/h2>\n\n<p>Se poss\u00edvel, atribuo SSDs NVMe e NICs r\u00e1pidas ao n\u00f3 no qual o <strong>Carga de trabalho<\/strong> est\u00e1 em execu\u00e7\u00e3o. Isso evita que as solicita\u00e7\u00f5es de E\/S cruzem a interconex\u00e3o e adicionem lat\u00eancia. Eu vinculo NICs de filas m\u00faltiplas a conjuntos de n\u00facleos de um n\u00f3 com RSS\/RPS para que os IRQs permane\u00e7am locais. Para pilhas de armazenamento, vale a pena dividir os pools de threads n\u00f3 a n\u00f3. Se prestar aten\u00e7\u00e3o a isso, reduzir\u00e1 visivelmente as lat\u00eancias do P99 e criar\u00e1 espa\u00e7o para picos de carga.<\/p>\n\n<h2>IRQ e afinidade de fila na pr\u00e1tica<\/h2>\n\n<p>Em primeiro lugar, verifico que <strong>N\u00f3 NUMA<\/strong> dispositivos e fixar IRQs e filas de forma adequada. Isto assegura a manuten\u00e7\u00e3o da localidade do caminho de dados.<\/p>\n<pre><code># Mapeamento de dispositivo para n\u00f3\ncat \/sys\/class\/net\/eth0\/device\/numa_node\ncat \/sys\/block\/nvme0n1\/device\/numa_node\n\n# Definir afinidade de IRQ especificamente (exemplo: n\u00facleos 0-7 de um n\u00f3)\nirq=\necho 0-7 &gt; \/proc\/irq\/$irq\/smp_affinity_list\n\n# Ligar filas de NICs a n\u00facleos (RPS\/RFS)\nfor q in \/sys\/class\/net\/eth0\/queues\/rx-*; do echo 0-7 &gt; \"$q\"\/rps_cpus; done\nsysctl -w net.core.rps_sock_flow_entries=32768\nfor q in \/sys\/class\/net\/eth0\/queues\/rx-*; do echo 4096 &gt; \"$q\"\/rps_flow_cnt; done\n\n# Melhorar a afinidade da fila NVMe\necho 2 &gt; \/sys\/block\/nvme0n1\/queue\/rq_affinity\ncat \/sys\/block\/nvme0n1\/queue\/scheduler # \"none\" preferred\n<\/code><\/pre>\n<p>\u201eExecuto o \u201cirqbalance\" com conhecimento do n\u00f3 ou defino-o para <strong>Exce\u00e7\u00f5es<\/strong> para interrup\u00e7\u00f5es de hot-path. O resultado s\u00e3o lat\u00eancias mais est\u00e1veis, menos saltos de IRQ entre n\u00f3s e um aumento mensur\u00e1vel nos acessos de E\/S locais.<\/p>\n\n<h2>Liga\u00e7\u00e3o est\u00e1tica vs. equil\u00edbrio din\u00e2mico - o meio-termo<\/h2>\n\n<p>Utilizo \u201etaskset\u201c e cgroups para definir regras r\u00edgidas quando deterministas <strong>Lat\u00eancia<\/strong> conta. Deixo o balanceamento autom\u00e1tico de NUMA ativo quando a carga se move e preciso de proximidade adaptativa. Uma mistura geralmente funciona melhor: pinos r\u00edgidos para hotpaths, limites mais abertos para trabalho auxiliar. Verifico regularmente se as migra\u00e7\u00f5es est\u00e3o a aumentar visivelmente, pois isso indica um mau planeamento. O objetivo continua a ser escolher as localiza\u00e7\u00f5es dos dados e dos segmentos de forma a que a migra\u00e7\u00e3o seja rara mas poss\u00edvel.<\/p>\n\n<h2>NUMA em contentores e Kubernetes<\/h2>\n\n<p>Trago um contentor <strong>cpusets<\/strong> e <strong>P\u00e1ginas enormes<\/strong> em linha. Eu atribuo pods\/cont\u00eaineres a um n\u00f3 NUMA armazenando quantidades consistentes de CPU e mem\u00f3ria. Nas orquestra\u00e7\u00f5es, defino pol\u00edticas que favorecem atribui\u00e7\u00f5es de n\u00f3 \u00fanico e, portanto, respeitam o primeiro toque.<\/p>\n<ul>\n  <li><strong>Tempo de execu\u00e7\u00e3o do contentor<\/strong>\u201e-cpuset-cpus\u201c e \u201e-cpuset-mems\u201c mant\u00eam as tarefas e a mem\u00f3ria juntas; atribui p\u00e1ginas enormes como recursos.<\/li>\n  <li><strong>Gestor de topologia\/CPU<\/strong>As atribui\u00e7\u00f5es estritas ou preferenciais garantem a atribui\u00e7\u00e3o de n\u00facleos e \u00e1reas de mem\u00f3ria relacionados.<\/li>\n  <li><strong>QoS garantida<\/strong>Os pedidos\/limites fixos minimizam a redistribui\u00e7\u00e3o pelo programador.<\/li>\n<\/ul>\n<p>Eu deliberadamente dividi sidecars e processos auxiliares para outros n\u00facleos <em>dentro de<\/em> do mesmo n\u00f3 para que o hotpath n\u00e3o seja perturbado mas n\u00e3o entre na corrida entre n\u00f3s.<\/p>\n\n<h2>Compreender as topologias de CPU: CCD\/CCX, SNC e Cluster-on-Die<\/h2>\n\n<p>As CPUs de servidor actuais dividem as tomadas em <strong>Subdom\u00ednios<\/strong> com as suas pr\u00f3prias caches e caminhos. Tenho isto em conta quando corto n\u00facleos\/heaps:<\/p>\n<ul>\n  <li><strong>AMD EPYC<\/strong>CCD\/CCX e \u201eNUMA por socket\u201c (NPS=1\/2\/4) influenciam a precis\u00e3o com que o NUMA \u00e9 cortado. Mais n\u00f3s (NPS=4) aumentam a localidade, mas requerem uma fixa\u00e7\u00e3o limpa.<\/li>\n  <li><strong>Intel<\/strong>Sub-NUMA Clustering (SNC2\/4) divide o LLC em clusters. Bom para cargas com mem\u00f3ria limitada, desde que o SO e a carga de trabalho sejam conscientes dos n\u00f3s.<\/li>\n  <li><strong>Proximidade L3<\/strong>Eu associo threads que usam os mesmos heaps no mesmo cluster L3 para economizar tr\u00e1fego de coer\u00eancia e saltos entre clusters.<\/li>\n<\/ul>\n<p>Estas op\u00e7\u00f5es funcionam como um multiplicador: se utilizadas corretamente, aumentam <strong>Localidade<\/strong> Al\u00e9m disso, se forem incorretamente configurados, aumentam a fragmenta\u00e7\u00e3o e o tr\u00e1fego remoto.<\/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\/04\/hosting-serverraum-7584.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Introdu\u00e7\u00e3o passo a passo e plano de revers\u00e3o<\/h2>\n\n<p>Nunca apresento a afina\u00e7\u00e3o NUMA \u201ebig bang\u201c. Um resiliente <strong>Plano<\/strong> evita surpresas:<\/p>\n<ol>\n  <li><strong>Linha de base<\/strong>Topologia de hardware, lat\u00eancias P50\/P95\/P99, taxa de transfer\u00eancia, captura de taxa numastat.<\/li>\n  <li><strong>Hip\u00f3tese<\/strong>Formular um objetivo espec\u00edfico (por exemplo, acesso remoto -30%, P99 -20%).<\/li>\n  <li><strong>Um passo<\/strong>Alterar apenas um parafuso de ajuste (por exemplo, corte VM, cpuset, pol\u00edtica THP, intervalos de varrimento).<\/li>\n  <li><strong>Can\u00e1rio<\/strong>Testar em 5-10% da frota sob carga real, manter a revers\u00e3o pronta.<\/li>\n  <li><strong>Avalia\u00e7\u00e3o<\/strong>Comparar valores medidos, definir janelas de regress\u00e3o, registar efeitos secund\u00e1rios.<\/li>\n  <li><strong>Lan\u00e7amento<\/strong>Desenrolar veio a veio, medir de novo depois de cada veio.<\/li>\n  <li><strong>Manuten\u00e7\u00e3o<\/strong>Volte a medir trimestralmente (as actualiza\u00e7\u00f5es do kernel, do firmware e da carga de trabalho alteram o \u00f3timo).<\/li>\n<\/ol>\n<p>Isto garante que as melhorias s\u00e3o reproduz\u00edveis e podem ser revertidas em minutos em caso de erro.<\/p>\n\n<h2>Erros comuns - e como evit\u00e1-los<\/h2>\n\n<p>Um passo em falso t\u00edpico \u00e9 a ativa\u00e7\u00e3o da intercala\u00e7\u00e3o de n\u00f3s na BIOS, que oculta a topologia NUMA e <strong>Equil\u00edbrio<\/strong> mais dif\u00edcil. Igualmente desfavor\u00e1vel: VMs com mais vCPUs do que um n\u00f3 oferece, al\u00e9m de p\u00e1ginas enormes reservadas de forma pouco limpa. Alguns administradores fixam tudo com for\u00e7a e assim perdem toda a flexibilidade quando as cargas de trabalho mudam. Outros confiam completamente no kernel, embora os hotspots dif\u00edceis exijam regras claras. Registo as s\u00e9ries de medi\u00e7\u00f5es, reconhe\u00e7o os valores an\u00f3malos logo no in\u00edcio e ajusto a configura\u00e7\u00e3o e as pol\u00edticas passo a passo.<\/p>\n<ul>\n  <li><strong>THP \u201esempre\u201c<\/strong> sem controlo: a compacta\u00e7\u00e3o n\u00e3o planeada perturba a lat\u00eancia. Prefiro utilizar o \u201emadvise\u201c e reservar especificamente p\u00e1ginas enormes.<\/li>\n  <li><strong>vm.zone_reclaim_mode<\/strong> demasiado agressivo: a recupera\u00e7\u00e3o local pode fazer mais mal do que bem no momento errado. Primeiro medir, depois afinar.<\/li>\n  <li><strong>irqbalance cego<\/strong>IRQs n\u00e3o cr\u00edticos movem-se entre n\u00f3s. Defino excep\u00e7\u00f5es ou m\u00e1scaras fixas para hotpaths.<\/li>\n  <li><strong>Mistura de intercala\u00e7\u00e3o + fixa\u00e7\u00e3o r\u00edgida<\/strong>Pol\u00edticas contradit\u00f3rias criam pingue-pongue. Decido-me por uma linha clara para cada servi\u00e7o.<\/li>\n  <li><strong>Cpusets n\u00e3o limpos<\/strong>Os contentores v\u00eaem um n\u00f3, mas mapeiam a mem\u00f3ria para outros n\u00f3s. Sempre defina \u201ecpuset.mems\u201c consistentemente com o conjunto de CPU.<\/li>\n  <li><strong>Carater\u00edsticas do Sub-NUMA<\/strong> activados mas n\u00e3o utilizados: Mais n\u00f3s sem planeamento aumentam a fragmenta\u00e7\u00e3o. Ligar apenas ap\u00f3s os testes.<\/li>\n<\/ul>\n\n<h2>Brevemente resumido<\/h2>\n\n<p>O servidor de balanceamento NUMA re\u00fane processos e dados de forma direcionada, tornando os acessos locais mais frequentes e mais eficientes. <strong>Lat\u00eancias<\/strong> tornam-se mais curtos. Com um tamanho de VM adequado, uma configura\u00e7\u00e3o de BIOS limpa e ferramentas como numactl, \u00e9 criada uma topologia clara que o kernel utiliza. NUMA virtual, p\u00e1ginas enormes e afinidades complementam o balanceamento autom\u00e1tico em vez de o substituir. A liga\u00e7\u00e3o de dispositivos de E\/S perto dos n\u00f3s e a utiliza\u00e7\u00e3o de hotpaths elimina o dispendioso acesso remoto. Desta forma, o hardware de alojamento \u00e9 escalado de forma fi\u00e1vel e cada segundo de CPU proporciona mais <strong>carga \u00fatil<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>O **NUMA balancing server** revoluciona a otimiza\u00e7\u00e3o do acesso \u00e0 mem\u00f3ria no **hardware de alojamento**. Reduzir a lat\u00eancia e maximizar o desempenho do servidor.<\/p>","protected":false},"author":1,"featured_media":18938,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_crdt_document":"","inline_featured_image":false,"footnotes":""},"categories":[676],"tags":[],"class_list":["post-18945","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":"542","_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":"NUMA Balancing Server","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":"18938","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/18945","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=18945"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/18945\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media\/18938"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media?parent=18945"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/categories?post=18945"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/tags?post=18945"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}