{"id":20634,"date":"2026-08-14T11:50:07","date_gmt":"2026-08-14T09:50:07","guid":{"rendered":"https:\/\/webhosting.de\/numa-memory-policies-datenbankserver-optimierung-server\/"},"modified":"2026-08-14T11:50:07","modified_gmt":"2026-08-14T09:50:07","slug":"politicas-de-memoria-numa-otimizacao-de-servidores-de-bases-de-dados-servidores","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pt\/numa-memory-policies-datenbankserver-optimierung-server\/","title":{"rendered":"Pol\u00edticas de mem\u00f3ria NUMA para servidores de bases de dados de grande dimens\u00e3o: otimizar o desempenho de forma espec\u00edfica"},"content":{"rendered":"<p><strong>Mem\u00f3ria NUMA<\/strong> determina, no caso de grandes servidores de bases de dados, a proximidade com que os threads operam em rela\u00e7\u00e3o \u00e0 mem\u00f3ria necess\u00e1ria e em que medida as lat\u00eancias influenciam os tempos de resposta e o d\u00e9bito. Coordeno de forma espec\u00edfica a aloca\u00e7\u00e3o da CPU, a localiza\u00e7\u00e3o da mem\u00f3ria e a dimens\u00e3o da carga de trabalho, reduzo os acessos remotos e, assim, consigo uma solu\u00e7\u00e3o fi\u00e1vel e previs\u00edvel <strong>Desempenho<\/strong>.<\/p>\n\n<h2>Pontos centrais<\/h2>\n<ul>\n  <li><strong>Topologia<\/strong> Compreender: ter em conta de forma espec\u00edfica os n\u00f3s, os n\u00facleos, a RAM e a interliga\u00e7\u00e3o.<\/li>\n  <li><strong>Pol\u00edticas<\/strong> Escolher a op\u00e7\u00e3o adequada: Strict, Preferred, Interleave, de acordo com o objetivo da carga de trabalho.<\/li>\n  <li><strong>afinidade<\/strong> Implementar: vincular threads, IRQs e mem\u00f3ria localmente.<\/li>\n  <li><strong>VMs<\/strong> por n\u00f3: atribuir a vCPU e a RAM a um n\u00f3 NUMA.<\/li>\n  <li><strong>Monitoriza\u00e7\u00e3o<\/strong> Executar: medir as leituras remotas, a lat\u00eancia P99 e a carga dos n\u00f3s.<\/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\/08\/datenbankserver-setup-8273.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Compreender a topologia NUMA<\/h2>\n<p>Come\u00e7o cada otimiza\u00e7\u00e3o com a <strong>Topologia<\/strong>: Quantos n\u00f3s NUMA existem, como est\u00e3o distribu\u00eddos os n\u00facleos, como \u00e9 que a RAM est\u00e1 ligada aos soquetes e qual \u00e9 o custo dos acessos \u00e0 interliga\u00e7\u00e3o. O acesso \u00e0 mem\u00f3ria local demora significativamente menos tempo do que um acesso que ultrapasse os limites dos n\u00f3s; por isso, evito acessos desnecess\u00e1rios <strong>Remoto<\/strong>-M\u00e9todos. Os grandes servidores de bases de dados beneficiam quando planeio os volumes de trabalho de forma a que os threads e os dados permane\u00e7am no mesmo n\u00f3. Se o volume de dados ativo n\u00e3o couber num \u00fanico n\u00f3, planeio a distribui\u00e7\u00e3o de forma deliberada, em vez de deixar isso a cargo do comportamento padr\u00e3o. Desta forma, mantenho a <strong>Lat\u00eancia<\/strong> baixa e permite um d\u00e9bito constante, mesmo sob carga elevada.<\/p>\n\n<h3>Selecionar corretamente as configura\u00e7\u00f5es do BIOS e do hardware<\/h3>\n<p>Verifico no BIOS se <strong>Intercala\u00e7\u00e3o de n\u00f3s<\/strong> est\u00e1 desativada, para que a separa\u00e7\u00e3o NUMA seja mantida. Atribuo os canais de mem\u00f3ria de forma sim\u00e9trica por soquete e presto aten\u00e7\u00e3o \u00e0 configura\u00e7\u00e3o (1DPC vs. 2DPC), para que a frequ\u00eancia e a largura de banda n\u00e3o sofram quedas desnecess\u00e1rias. Funcionalidades como <strong>Estados C<\/strong> E, no que diz respeito aos modos de poupan\u00e7a de energia mais agressivos, defino os objetivos de lat\u00eancia de forma mais conservadora, para que os n\u00facleos n\u00e3o tenham de acordar constantemente. <strong>SMT\/Hyper-Threading<\/strong> Avalio em fun\u00e7\u00e3o da carga de trabalho espec\u00edfica: no caso de cargas de trabalho OLTP fortemente dependentes da mem\u00f3ria, limito o n\u00famero de threads SMT ativos em paralelo por n\u00facleo, para reduzir a press\u00e3o sobre a cache e a variabilidade. Al\u00e9m disso, verifico se os dispositivos PCIe (NICs, NVMe) est\u00e3o ligados localmente por soquete, para que a sua <strong>IRQs<\/strong> e para que os percursos DMA n\u00e3o atravessem a interliga\u00e7\u00e3o. Quem abordar esta quest\u00e3o de forma minuciosa estabelece a base sobre a qual as pol\u00edticas e as afinidades produzem os seus efeitos.<\/p>\n\n<h2>Escolher corretamente as pol\u00edticas de mem\u00f3ria<\/h2>\n<p>A escolha de <strong>Pol\u00edtica<\/strong> determina a partir de que n\u00f3 o kernel aloca mem\u00f3ria e como funcionam os mecanismos de fallback. A op\u00e7\u00e3o \u00abStrict\u00bb estabelece limites r\u00edgidos e interrompe as aloca\u00e7\u00f5es se o n\u00f3 de destino n\u00e3o tiver espa\u00e7o dispon\u00edvel; isto d\u00e1 prioridade a <strong>Desempenho<\/strong> sobre flexibilidade. A estrat\u00e9gia \u00abPreferred\u00bb mant\u00e9m um n\u00f3 preferencial, mas, em caso de escassez, recorre a outros, oferecendo assim um meio-termo. O Interleave distribui as p\u00e1ginas por v\u00e1rios n\u00f3s atrav\u00e9s do m\u00e9todo Round-Robin, o que pode fazer sentido no caso de grandes volumes de dados com utiliza\u00e7\u00e3o uniforme. Para muitas bases de dados, uma estrat\u00e9gia local com Preferred ou Strict \u00e9, na maioria das vezes, a melhor op\u00e7\u00e3o <strong>Escolha<\/strong>.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Pol\u00edtica<\/th>\n      <th>Conduta<\/th>\n      <th>Utiliza\u00e7\u00e3o t\u00edpica<\/th>\n      <th>Vantagens<\/th>\n      <th>Riscos<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Rigoroso<\/td>\n      <td>Utiliza apenas a mem\u00f3ria do n\u00f3 de destino; caso contr\u00e1rio, ocorre um erro<\/td>\n      <td>Cr\u00edtica latente <strong>Bases de dados<\/strong> com um planeamento claro dos n\u00f3s<\/td>\n      <td>O mais local poss\u00edvel <strong>Acessos<\/strong>, lat\u00eancias previs\u00edveis<\/td>\n      <td>A aloca\u00e7\u00e3o pode falhar se o n\u00f3 estiver cheio<\/td>\n    <\/tr>\n    <tr>\n      <td>Preferido<\/td>\n      <td>N\u00f3 preferencial, com possibilidade de recurso a outros<\/td>\n      <td>Geral <strong>Cargas de trabalho<\/strong> com carga vari\u00e1vel<\/td>\n      <td>Boa proximidade com uma flexibilidade aceit\u00e1vel<\/td>\n      <td>Maior percentagem de trabalho \u00e0 dist\u00e2ncia em caso de escassez<\/td>\n    <\/tr>\n    <tr>\n      <td>Intercalar<\/td>\n      <td>Round-Robin em v\u00e1rios n\u00f3s<\/td>\n      <td>Muito grande, amplamente utilizada <strong>Dados<\/strong><\/td>\n      <td>Distribui\u00e7\u00e3o da carga de trabalho por v\u00e1rios n\u00f3s<\/td>\n      <td>Localiza\u00e7\u00e3o menos favor\u00e1vel, lat\u00eancia potencialmente mais elevada<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/NUMA_Optimierung_Besprechung_1234.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Threads, afinidade da CPU e liga\u00e7\u00e3o \u00e0 mem\u00f3ria<\/h2>\n<p>Fixo os threads aos n\u00facleos do n\u00f3 de destino, mapeio a mem\u00f3ria com o numactl e alinho as IRQs de forma a que <strong>Dados<\/strong> manter-se local. Esta combina\u00e7\u00e3o de afinidade da CPU e liga\u00e7\u00e3o \u00e0 mem\u00f3ria reduz as dispendiosas leituras remotas e torna a distribui\u00e7\u00e3o do tempo de execu\u00e7\u00e3o mais compacta. Para um controlo granular, utilizo pol\u00edticas ao n\u00edvel do processo ou do thread e mantenho o buffer pool o mais pr\u00f3ximo poss\u00edvel dos threads de trabalho ativos. Quem quiser aprofundar o assunto encontrar\u00e1 passos pr\u00e1ticos para <a href=\"https:\/\/webhosting.de\/pt\/servidor-numa-localidade-cpu-memoria-afinidade-otimizacao-nucleo\/\">Afinidade com a CPU<\/a>, que podem ser aplicadas diretamente em servidores produtivos. \u00c9 assim que garanto a consist\u00eancia <strong>Lat\u00eancias<\/strong> mesmo quando o sistema est\u00e1 sob forte carga.<\/p>\n\n<h3>Dar prioridade aos Hotsets locais<\/h3>\n<p>Identifico os \u00abhotsets\u00bb da <strong>Carga de trabalho<\/strong> e coloco-os estritamente a n\u00edvel local, enquanto os dados pouco utilizados podem ser armazenados de forma mais flex\u00edvel. Gra\u00e7as a esta prioriza\u00e7\u00e3o, mantenho-me pr\u00f3ximo da RAM do n\u00f3 nas rotas principais. Se a carga aumentar, a solu\u00e7\u00e3o escala de forma eficiente, porque os caminhos mais dispendiosos continuam a ser executados localmente. Sem esta organiza\u00e7\u00e3o, a curva de lat\u00eancia desvia-se assim que os threads come\u00e7am a aceder cada vez mais a dados em v\u00e1rios n\u00f3s. Uma clara <strong>Encaderna\u00e7\u00e3o<\/strong> impede precisamente este comportamento de forma fi\u00e1vel.<\/p>\n\n<h3>Unificar o NUMA de armazenamento e de rede<\/h3>\n<p>Eu organizo <strong>NICs<\/strong> e <strong>NVMe<\/strong>-Atribuo os dispositivos de forma espec\u00edfica aos soquetes e redireciono as suas IRQs para n\u00facleos locais. Mantenho o direcionamento de rece\u00e7\u00e3o\/transmiss\u00e3o (RSS\/RPS\/XPS) consistente por n\u00f3, para que os pacotes sejam processados no mesmo local onde os threads da base de dados est\u00e3o a ser executados. No caso do NVMe, utilizo v\u00e1rias filas por n\u00facleo e fixo os threads de E\/S localmente, para que os caminhos de registo e de dados n\u00e3o oscilem atrav\u00e9s da interliga\u00e7\u00e3o. Para a replica\u00e7\u00e3o, separo os caminhos de rede por n\u00f3, para que os fluxos WAL\/Redo recebidos cheguem localmente. Desta forma, mant\u00eam-se <strong>IO<\/strong>\u2013 e os percursos da CPU s\u00e3o congruentes, e a base de dados n\u00e3o desperdi\u00e7a ciclos em c\u00f3pias desnecess\u00e1rias atrav\u00e9s do sistema de mem\u00f3ria.<\/p>\n\n<h2>Planear m\u00e1quinas virtuais com base no tamanho dos n\u00f3s<\/h2>\n<p>Dimensiono as m\u00e1quinas virtuais de forma a que o n\u00famero de vCPUs e a mem\u00f3ria RAM se enquadrem num n\u00f3 NUMA f\u00edsico, pois isso reduz <strong>Lat\u00eancia<\/strong> e tr\u00e1fego de interliga\u00e7\u00e3o. As VMs de grande dimens\u00e3o, que s\u00e3o maiores do que um n\u00f3, distribuem inevitavelmente os acessos \u00e0 mem\u00f3ria, perdendo assim a previsibilidade. Se uma VM tiver de ser maior, planeio explicitamente o vNUMA e procuro garantir uma distribui\u00e7\u00e3o sim\u00e9trica pelos n\u00f3s. No que diz respeito ao lado do anfitri\u00e3o, evito a sobre-subscri\u00e7\u00e3o em cargas de trabalho com lat\u00eancia e mantenho a mem\u00f3ria local reservada por VM. Uma vis\u00e3o geral r\u00e1pida da estrutura f\u00edsica dos n\u00f3s \u00e9 fornecida por \u201e<a href=\"https:\/\/webhosting.de\/pt\/numa-nodes-alojamento-de-servidores-grandes-sistemas-serverboost\/\">Planear n\u00f3s NUMA<\/a>\u201c, o que facilita a tomada de decis\u00f5es sobre o tamanho da VM e <strong>Erro<\/strong> evita problemas na coloca\u00e7\u00e3o.<\/p>\n\n<h3>Ter em conta as defini\u00e7\u00f5es do hipervisor<\/h3>\n<p>Verifico como o hipervisor apresenta o vNUMA e mantenho a atribui\u00e7\u00e3o de grupos de vCPU a <strong>N\u00facleos<\/strong> consistente. Al\u00e9m disso, certifico-me de que a topologia NUMA da VM corresponda \u00e0 do anfitri\u00e3o, para que o agendador possa permanecer local. Mantenho as reservas de mem\u00f3ria e as regras de anti-afinidade t\u00e3o reduzidas quanto poss\u00edvel, mas t\u00e3o rigorosas quanto necess\u00e1rio. Prefiro substituir uma elevada densidade de m\u00e1quinas virtuais num \u00fanico soquete por uma distribui\u00e7\u00e3o pr\u00f3xima dos n\u00f3s. Assim, fa\u00e7o o seguinte: <strong>Remoto<\/strong>- Reduzir ao m\u00ednimo os acessos e manter os percursos de E\/S est\u00e1veis.<\/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\/08\/numa-memory-policies-database-8672.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h3>Pr\u00e1tica de contentores e orquestra\u00e7\u00e3o<\/h3>\n<p>Nos recipientes, coloco <strong>cpuset<\/strong>-Limites consistentes: CPUs e m\u00e1scaras de mem\u00f3ria associadas (<em>cpuset.cpus<\/em>, <em>cpuset.mems<\/em>) est\u00e3o interligados. As \u00abslices\u00bb e as \u00abunits\u00bb do Systemd recebem afinidades fixas de CPU, para que o kernel aplique efetivamente a prioriza\u00e7\u00e3o de mem\u00f3ria. Nas camadas de orquestra\u00e7\u00e3o, pretendo utilizar pods\/servi\u00e7os <strong>perto do n\u00f3<\/strong>, utilizo avalia\u00e7\u00f5es de topologia e atribui\u00e7\u00e3o est\u00e1tica de CPU para que uma carga de trabalho n\u00e3o oscile entre n\u00f3s. Declaro explicitamente as Huge Pages por pod\/contentor e mantenho est\u00e1veis o seu tamanho e n\u00famero por n\u00f3. Importante: atribuo os processos de infraestrutura e secund\u00e1rios (registo, sidecars, c\u00f3pias de seguran\u00e7a) a outros n\u00facleos ou mesmo ao outro n\u00f3 NUMA, para n\u00e3o interferir com os conjuntos ativos da base de dados.<\/p>\n\n<h2>Equil\u00edbrio NUMA e otimiza\u00e7\u00e3o do sistema operativo<\/h2>\n<p>O equil\u00edbrio autom\u00e1tico NUMA pode localizar <strong>Acessos<\/strong> melhorar quando as cargas de trabalho se deslocam ou quando as fases sofrem altera\u00e7\u00f5es significativas. Utilizo-o de forma seletiva, mas observo se a movimenta\u00e7\u00e3o de p\u00e1ginas de um lado para o outro causa mais problemas do que benef\u00edcios. Os processos bem definidos, com uma afinidade clara, beneficiam frequentemente de pol\u00edticas definidas manualmente, em vez de reajustes constantes. Verifico os par\u00e2metros do kernel, o controlo de IRQ e as Huge Pages transparentes, sempre no contexto da base de dados e da plataforma. Como ponto de partida, isto ajuda-me <a href=\"https:\/\/webhosting.de\/pt\/numa-balanceamento-servidor-memoria-otimizacao-hardware-numaflux\/\">Balanceamento NUMA<\/a>-Guia para testar as configura\u00e7\u00f5es passo a passo e a <strong>dispers\u00e3o<\/strong> reduzir as lat\u00eancias.<\/p>\n\n<h2>Utilizar as \u00abHuge Pages\u00bb de forma seletiva<\/h2>\n<p>Utilizo as Huge Pages para reduzir as falhas do TLB e grandes <strong>Mem\u00f3ria<\/strong>abordar as \u00e1reas de forma mais eficiente. Para os servidores de bases de dados, reservo as p\u00e1ginas antecipadamente, atribuo-as aos n\u00f3s e verifico se a inst\u00e2ncia as utiliza efetivamente. Desativo frequentemente as Transparent Huge Pages quando h\u00e1 objetivos de lat\u00eancia e defino Huge Pages est\u00e1ticas, para que a aloca\u00e7\u00e3o se mantenha determin\u00edstica. No entanto, a proximidade ao n\u00f3 NUMA continua a ser determinante; as Huge Pages refor\u00e7am uma boa estrat\u00e9gia, mas n\u00e3o a substituem. Quem ignorar isto dificilmente obter\u00e1 resultados <strong>Desempenho<\/strong> e corre o risco de efeitos secund\u00e1rios durante a pagina\u00e7\u00e3o.<\/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\/08\/numa_optimierung_7436.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Dimensionamento de bases de dados: buffer pool e carga de trabalho<\/h2>\n<p>Planeio o volume de trabalho ativo de forma a que o buffer pool, as caches de bloqueios e de planos e os recursos mais solicitados <strong>Tabelas<\/strong> caber num n\u00f3. No caso de inst\u00e2ncias muito grandes, divido os servi\u00e7os ou shards pelos n\u00f3s, em vez de criar uma inst\u00e2ncia monol\u00edtica gigantesca que abranja todos os n\u00f3s. Para casos OLTP, mantenho o buffer pool por n\u00f3 compacto e dou prioridade \u00e0s taxas de acerto locais. Para an\u00e1lises OLAP, o interleave pode fazer sentido em casos espec\u00edficos, quando o volume de dados \u00e9 gigantesco e uniforme. Sem esta disciplina, o <strong>Interconex\u00e3o<\/strong>-O tr\u00e1fego e consome as reservas precisamente quando ocorrem picos de carga.<\/p>\n\n<h3>Dicas espec\u00edficas para bases de dados<\/h3>\n<p>Tenho em conta o modelo de processos e threads do motor: <strong>PostgreSQL<\/strong> Utiliza processos, por isso executo a inst\u00e2ncia principal, o Autovacuum e o Checkpointer separadamente em cada n\u00f3 e mantenho <em>buffers partilhados<\/em> localmente por Shard. Em <strong>MySQL\/InnoDB<\/strong> arquivo <em>inst\u00e2ncias do buffer pool<\/em> no n\u00f3 e alinhar localmente os threads de E\/S e o gravador de registos. <strong>Servidor SQL<\/strong> beneficia de um Soft-NUMA adaptado e de uma aloca\u00e7\u00e3o que organiza os agendadores e os grupos de mem\u00f3ria ao longo dos n\u00f3s f\u00edsicos. <strong>Or\u00e1culo<\/strong>-Configurei as inst\u00e2ncias com Large Pages locais e segmentei os servidores de trabalho e de E\/S pelos n\u00f3s. De um modo geral, reduzo a conten\u00e7\u00e3o de arena do alocador (por exemplo, jemalloc) atrav\u00e9s de arenas otimizadas para NUMA e asseguro que <strong>Gestor de Bloqueios<\/strong> e manter os pontos cr\u00edticos de bloqueio (latch hotspots) localizados, distribuindo o particionamento e o sharding pelos n\u00f3s.<\/p>\n\n<h2>Monitoriza\u00e7\u00e3o: m\u00e9tricas que importam<\/h2>\n<p>Medei as leituras remotas, o tr\u00e1fego de interliga\u00e7\u00e3o entre n\u00f3s, as falhas de p\u00e1gina por n\u00f3 e o P99-<strong>Lat\u00eancia<\/strong> das consultas relevantes. Al\u00e9m disso, observo a utiliza\u00e7\u00e3o da CPU por n\u00f3, os r\u00e1cios de falhas NUMA e a percentagem de acessos \u00e0 mem\u00f3ria local. Esta vis\u00e3o permite verificar se a pol\u00edtica est\u00e1 a surtir efeito ou se os threads est\u00e3o a aceder de forma descontrolada a p\u00e1ginas remotas. Estabele\u00e7o uma correla\u00e7\u00e3o entre os picos e as decis\u00f5es do agendador, os eventos de migra\u00e7\u00e3o e os erros de aloca\u00e7\u00e3o. S\u00f3 estas m\u00e9tricas confirmam que a <strong>Pol\u00edtica<\/strong> n\u00e3o s\u00f3 no laborat\u00f3rio, mas de forma permanente no sistema produtivo.<\/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\/08\/numa_memory_optimierung_3481.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Estrat\u00e9gia de teste e implementa\u00e7\u00e3o<\/h2>\n<p>Fa\u00e7o os testes por etapas: primeiro, microbenchmarks para <strong>Largura de banda<\/strong> e a lat\u00eancia por n\u00f3; depois, cargas de trabalho realistas com caches frios e quentes. Aumento gradualmente os n\u00edveis de carga, me\u00e7o os valores P95\/P99\/P99,9 e observo a distribui\u00e7\u00e3o, n\u00e3o apenas os valores m\u00e9dios. Documento cada altera\u00e7\u00e3o (pol\u00edtica, afinidades, Huge Pages, redirecionamento de IRQ) e comparo A\/B em condi\u00e7\u00f5es id\u00eanticas. Antes da implementa\u00e7\u00e3o, defino <strong>Crit\u00e9rios de anula\u00e7\u00e3o<\/strong> e um plano de revers\u00e3o, para que, em caso de regress\u00f5es, eu possa regressar rapidamente \u00e0 configura\u00e7\u00e3o anterior. Um breve teste de estabilidade sob carga cont\u00ednua permite verificar <strong>Deriva<\/strong> e migra\u00e7\u00f5es que permanecem invis\u00edveis em per\u00edodos curtos.<\/p>\n\n<h2>Procedimento passo a passo<\/h2>\n<p>Primeiro, registo a <strong>Topologia<\/strong>: N\u00famero de n\u00f3s, atribui\u00e7\u00e3o de n\u00facleos, canais de mem\u00f3ria e interliga\u00e7\u00e3o. Em seguida, determino a carga de trabalho alvo por n\u00f3 e verifico se os \u00abhotsets\u00bb se encaixam. No passo seguinte, defino a afinidade da CPU, o direcionamento de IRQ e a liga\u00e7\u00e3o de mem\u00f3ria ao n\u00edvel do processo ou do thread. Em seguida, ativo ou desativo o balanceamento NUMA, dependendo da din\u00e2mica da carga de trabalho, e, se necess\u00e1rio, reservo Huge Pages por n\u00f3. Por fim, verifico o resultado com testes de carga repet\u00edveis e monitorizo <strong>N\u00fameros-chave<\/strong> em funcionamento cont\u00ednuo.<\/p>\n\n<h2>Exemplos pr\u00e1ticos e obst\u00e1culos<\/h2>\n<p>Uma inst\u00e2ncia OLTP com muitas transa\u00e7\u00f5es curtas obt\u00e9m ganhos mensur\u00e1veis quando defino os threads de trabalho e o buffer pool para um <strong>N\u00f3<\/strong> definir e selecionar \u201eStrict\u201c ou \u00abPreferred\u00bb. Um armaz\u00e9m de dados com varreduras amplas pode beneficiar do \u00abInterleave\u00bb se os dados forem utilizados de forma muito uniforme e os n\u00f3s estiverem bem aproveitados. As m\u00e1quinas virtuais (VMs) perdem visivelmente a previsibilidade assim que ultrapassam os limites dos n\u00f3s e o hipervisor atribui mem\u00f3ria de forma deslocada. Vejo frequentemente que uma \u00fanica VM \u00abextensa\u00bb sobrecarrega a interliga\u00e7\u00e3o e, consequentemente, tamb\u00e9m abranda as VMs vizinhas. Estes efeitos desaparecem assim que passo para o modo local <strong>Atribui\u00e7\u00e3o<\/strong> e volte a uma configura\u00e7\u00e3o vNUMA mais simples.<\/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\/08\/serverraum-numa-9023.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Cen\u00e1rios de erro e anti-padr\u00f5es<\/h2>\n<p>Com <strong>Rigoroso<\/strong> aumenta o risco de as aloca\u00e7\u00f5es falharem e de o OOM-Killer intervir. Por isso, mantenho espa\u00e7o livre no n\u00f3 de destino, monitorizo as tentativas falhadas e defino planos alternativos (por exemplo, redimensionamento seletivo fora dos hor\u00e1rios de pico). Transparent Huge Pages no <em>sempre<\/em>- O modo provoca em percursos de lat\u00eancia <strong>Desfragmenta\u00e7\u00e3o<\/strong> e est\u00e1bulos \u2013 utilizo reservas est\u00e1ticas ou ativo o THP <em>enlouquecer<\/em>. O equil\u00edbrio autom\u00e1tico NUMA pode deslocar p\u00e1ginas para um lado e para o outro quando a carga oscila; se detetar padr\u00f5es de \u00abpage bounce\u00bb, volto a definir as pol\u00edticas manualmente. Nas m\u00e1quinas virtuais, <strong>Balonismo<\/strong> e a compress\u00e3o de mem\u00f3ria \u00e9 prejudicial para a previsibilidade; desativo estas fun\u00e7\u00f5es para bases de dados cr\u00edticas. S\u00f3 planeio migra\u00e7\u00f5es em tempo real entre n\u00f3s durante janelas de inatividade ou, em alternativa, transfiro primeiro os dados a n\u00edvel da base de dados, para que a interliga\u00e7\u00e3o n\u00e3o fique sobrecarregada de forma secund\u00e1ria.<\/p>\n\n<h2>Planeamento da capacidade e crescimento<\/h2>\n<p>Estou a planear, por cada n\u00f3, uma <strong>Reserva<\/strong> Defino valores entre 10 e 20 % para picos de carga, Autovacuum\/Compaction e tarefas de manuten\u00e7\u00e3o peri\u00f3dicas. Se o volume de dados aumentar, come\u00e7o por escalar ao longo dos n\u00f3s (shards\/servi\u00e7os), em vez de aumentar cegamente todo o buffer pool. Impedo o \u201ecrescimento silencioso\u201c atrav\u00e9s de limites r\u00edgidos por n\u00f3 e de alertas, assim que as taxas de acertos locais diminu\u00edrem ou as propor\u00e7\u00f5es remotas aumentarem. Nas proje\u00e7\u00f5es para os pr\u00f3ximos trimestres, tenho em conta n\u00e3o s\u00f3 o volume de dados, mas tamb\u00e9m <strong>Taxas de transa\u00e7\u00e3o<\/strong> e altera\u00e7\u00f5es na distribui\u00e7\u00e3o do acesso, uma vez que estas alteram frequentemente os conjuntos ativos mais rapidamente do que a mera necessidade de mem\u00f3ria. Desta forma, a plataforma mant\u00e9m-se est\u00e1vel \u2013 e as expans\u00f5es s\u00e3o realizadas de forma controlada, sem sacrificar a localidade NUMA.<\/p>\n\n<h2>Balan\u00e7o curto<\/h2>\n<p>Eu otimizo grandes servidores de bases de dados ao <strong>NUMA<\/strong>-Combinar de forma eficaz a topologia, as pol\u00edticas e a dimens\u00e3o da carga de trabalho. A aloca\u00e7\u00e3o de mem\u00f3ria local proporciona os milissegundos decisivos, enquanto os acessos remotos n\u00e3o planeados aumentam a lat\u00eancia P99. No futuro, planeio as m\u00e1quinas virtuais de forma a que se encaixem nos n\u00f3s ou utilizem claramente o vNUMA. Utilizo de forma seletiva as configura\u00e7\u00f5es do sistema operativo, as afinidades e as Huge Pages, verifico o seu impacto e s\u00f3 implemento altera\u00e7\u00f5es com base em pontos de medi\u00e7\u00e3o. Quem seguir estes passos alcan\u00e7ar\u00e1 o desempenho esperado <strong>Desempenho<\/strong> com hardware moderno e mant\u00e9m as plataformas r\u00e1pidas e fi\u00e1veis, mesmo sob cargas elevadas.<\/p>","protected":false},"excerpt":{"rendered":"<p>As pol\u00edticas de mem\u00f3ria NUMA otimizam os grandes servidores de bases de dados atrav\u00e9s da aloca\u00e7\u00e3o local de mem\u00f3ria, da afinidade da CPU e do hardware de servidor adequado.<\/p>","protected":false},"author":1,"featured_media":20627,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[676],"tags":[],"class_list":["post-20634","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":"149","_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 Memory","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":"20627","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/20634","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=20634"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/20634\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media\/20627"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media?parent=20634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/categories?post=20634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/tags?post=20634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}