Otimização de NVMe em servidores Linux: um guia completo de otimização

Última atualização: 17/12/2025
autor: Isaac
  • O desempenho real do NVMe em Linux Depende muito de Hardwares tais como o kernel, o sistema de arquivos e o banco de dados.
  • Ajustes como desativar o APST, escolher o agendador apropriado, otimizar o NUMA e usar o TRIM periodicamente melhoram a latência e a estabilidade.
  • O InnoDB requer ajustes específicos (pool de buffers, toras, método flush) para aproveitar o NVMe em cargas MySQL/MariaDB.
  • Índices bem projetados, consultas otimizadas e monitoramento contínuo são essenciais para que o ajuste do NVMe tenha um impacto real.

Configurações NVMe em servidores Linux

Se você trabalha com servidores Linux e migrou para unidades NVMe, provavelmente já percebeu que, embora sejam muito mais rápido do que HDDs ou até mesmo SSD SATANem sempre se vê na produção os números espetaculares prometidos nas especificações técnicas. Não é que o hardware seja o culpado: geralmente são o sistema operacional, a configuração do kernel e os serviços que estão limitando o desempenho.

Neste artigo, vamos ver como realizar um Otimização avançada de NVMe em servidores LinuxConsideraremos tanto o desempenho puro (latência, IOPS e largura de banda) quanto a durabilidade da unidade. Além disso, integraremos a tecnologia com a camada de banco de dados (MySQL/MariaDB, especialmente InnoDB) e com as melhores práticas para o uso de SSDs e NVMe, garantindo o desempenho ideal da sua plataforma. O objetivo é que você possa migrar facilmente dos testes de laboratório com o Fio para cargas de trabalho de produção reais com desempenho excepcional.

Pré-requisitos e ferramentas para otimizar NVMe no Linux

Antes de começar a alterar os parâmetros, é essencial ter acesso raiz para o servidor e um bom plano de backupMuitas das configurações que discutiremos afetam o kernel, o particionamento ou até mesmo o formato do dispositivo, portanto, qualquer erro pode causar a falha de um serviço ou tornar um volume irrecuperável.

Você também precisa ter Algumas ferramentas para gerenciar NVMe, monitorar E/S e realizar testes de desempenho.No Debian ou Ubuntu, você pode instalá-los com:

Instalação no Debian/Ubuntu: sudo apt update
sudo apt install nvme-cli fio util-linux iotop sysstat numactl -y

Em sistemas baseados em RHEL (Rocky, Alma, CentOS, etc.), isso é alcançado com:

Instalação no RHEL e derivados: sudo dnf update -y
sudo dnf install nvme-cli fio util-linux iotop sysstat numactl -y

Com essas ferramentas você pode Identifique seus dispositivos NVMe, verifique a integridade deles e atualizar firmware no Linuxmedir latência e taxa de transferência De forma objetiva e repetível, é fundamental realizar algo crítico antes de tocar em qualquer coisa, para poder comparar o "antes" com o "depois".

Descubra, identifique e meça seus dispositivos NVMe.

Monitoramento de desempenho de NVMe no Linux

O primeiro passo é listar quais unidades NVMe você possui e quais são suas especificações. Você pode ver isso muito claramente com o nvme-cli e sem ter que lidar com nomes estranhos em /dev.

Listar dispositivos NVMe: nvme list

Se você quiser se aprofundar, o seguinte comando mostra o capacidades do controlador NVMe (filas de comandos, tamanho máximo de transferência, etc.):

Detalhes do controlador NVMe: nvme id-ctrl -H /dev/nvme0

E para ver as informações sobre o “espaço de nomes” (formatos LBA, tamanhos de setor e classificação de desempenho relativo):

Detalhes do namespace NVMe: nvme id-ns -H /dev/nvme0n1

Antes de começar a ajustar o sistema, é uma boa ideia salvar um Linha de base de desempenho com fioPor exemplo, você pode medir a latência em leituras aleatórias de 4K com E/S direta:

Benchmark base (fio randread 4K): fio --name=randread --filename=/dev/nvme0n1 --rw=randread --bs=4k \
--iodepth=64 --numjobs=1 --ioengine=io_uring --direct=1 --time_based=1 --runtime=20

E a taxa de transferência de leitura sequencial a 128K:

Benchmark base (fio seqread 128K): fio --name=seqread --filename=/dev/nvme0n1 --rw=read --bs=128k \
--iodepth=64 --numjobs=1 --ioengine=io_uring --direct=1 --time_based=1 --runtime=20

Para entender como o sistema como um todo se comporta, é útil complementar isso com iostat e smart-log:

iostat / verificações de log inteligente: iostat -x 2 10
nvme smart-log /dev/nvme0

Dessa forma, você saberá se o seu gargalo está em tempos de atendimento na fila, temperatura, erros de mídia ou simplesmente na camada superior (sistema de arquivos, banco de dados, etc.).

Gerenciamento de energia NVMe (APST) para baixa latência

As unidades NVMe implementam APST (Transição Autônoma de Estado de Energia)Um mecanismo para economizar energia entrando em estados de baixo consumo de energia mais profundos. Isso é bom para laptopsMas em um servidor onde filas de milissegundos ou microssegundos são importantes, esses "despertares" do SSD podem introduzir picos de latência desagradáveis.

Se você priorizar latência consistente na economia de energiaVocê pode desativar o APST ajustando o parâmetro do módulo nvme_core (consulte o notícias do kernelEm sistemas com GRUB, bastaria adicionar:

Desativar APST (GRUB): sudo sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="nvme_core.default_ps_max_latency_us=0 /' /etc/default/grub
sudo update-grub

Após a reinicialização, o kernel deixará de enviar a unidade para estados de economia de energia profunda e, em geral, As filas com latência de 99% e 99.9% devem apresentar melhorias.desde que o sistema de refrigeração do servidor seja adequado para o aumento de temperatura.

Agendador de E/S adequado para configurações de NVMe e camada de bloco.

O agendador de E/S é a camada que decide. Em que ordem as solicitações de leitura e gravação são atendidas? em direção ao dispositivo. Com discos rígidos mecânicos, fazia muito sentido usar agendadores complexos que otimizavam o movimento físico das cabeças de leitura/gravação, mas com NVMe isso é desnecessário e pode até ser um obstáculo.

Na maioria das distribuições modernas, os drives NVMe já utilizam agendador «nenhum» (ou mq-deadline em certos casos)Mesmo assim, vale a pena conferir:

Verificar agendador de E/S: cat /sys/block/nvme0n1/queue/scheduler

Se você observar algo diferente e sua carga de trabalho for principalmente de E/S aleatória de baixa latência, você pode forçar o agendador a definir "nenhum":

Forçar agendador 'nenhum': echo none | sudo tee /sys/block/nvme0n1/queue/scheduler

Para cargas de trabalho altamente mistas com operações de gravação intensivas, o "mq-deadline" pode fornecer melhor equilíbrio entre taxa de transferência e latência:

Forçar agendamento 'mq-deadline': echo mq-deadline | sudo tee /sys/block/nvme0n1/queue/scheduler

Além do agendador, a camada de blocos oferece dois outros controles importantes: leitura antecipada e tamanho máximo da solicitaçãoA função read-ahead (read_ahead_kb) "lê antecipadamente" mais dados do que o solicitado, o que é útil em acessos sequenciais longos, mas contraproducente em acessos aleatórios.

Valores típicos de read_ahead_kb: echo 128 | sudo tee /sys/block/nvme0n1/queue/read_ahead_kb # cargas aleatorias (BBDD)
echo 4096 | sudo tee /sys/block/nvme0n1/queue/read_ahead_kb # secuencial grande (backups, vídeo, etc.)

Em relação a tamanho máximo da solicitação (max_sectors_kb)É recomendável alinhá-lo com o tamanho ideal de E/S da unidade e não exceder o hardware máximo:

  Aplicar atualizações imediatamente ou após reiniciar o sistema Linux: qual é a melhor opção e quando fazê-lo?

Consulte os tamanhos ideais de E/S: cat /sys/block/nvme0n1/queue/optimal_io_size
cat /sys/block/nvme0n1/queue/max_hw_sectors_kb

Sabendo disso, você pode definir um valor razoável, por exemplo, 1024 KB:

Defina max_sectors_kb: sudo sh -c 'echo 1024 > /sys/block/nvme0n1/queue/max_sectors_kb'

Ajuste a afinidade da CPU e do NUMA para NVMe.

Em servidores modernos com múltiplas CPUs ou sockets (NUMA), o A latência de acesso à memória e aos dispositivos não é uniforme.Uma unidade NVMe está fisicamente próxima de um nó NUMA específico e, se os threads que a utilizam residem em outro nó, cada operação de E/S atravessa o barramento entre sockets, resultando em latência.

Por isso, é importante entender tanto as interrupções NVMe quanto os processos que as utilizam. estão conectados ao mesmo nó NUMAPrimeiro, descubra quais IRQs o SSD NVMe utiliza:

Localize as interrupções NVMe: grep -i nvme /proc/interrupts

Em seguida, você pode atribuir, por exemplo, todas as IRQs de nvme0 aos núcleos 0 a 3:

Atribuir afinidade IRQ aos núcleos: for i in $(grep -i nvme0 /proc/interrupts | awk -F: '{print $1}'); do
echo 0-3 | sudo tee /proc/irq/$i/smp_affinity_list
done

Ao iniciar seu banco de dados ou serviço principal, mesmo em virtualização com KVM, EUA use numactl para corrigir problemas de CPU e memória. para o mesmo nó:

Execute o serviço com numactl: numactl --cpunodebind=0 --membind=0 tu-binario --tus-opciones

Outro pequeno ajuste na camada de blocos é afinidade rqIsso indica como as filas de conclusão de E/S são processadas. Um valor de 2 força a conclusão a ser tratada no mesmo núcleo que emitiu a solicitação, melhorando a localidade do cache.

Ativar rq_affinity=2: echo 2 | sudo tee /sys/block/nvme0n1/queue/rq_affinity

Torne as alterações de ajuste do NVMe permanentes com o udev.

Todas as alterações feitas modificando arquivos em /sys Eles se perdem ao reiniciar.Para evitar ter que executar scripts manualmente a cada vez, a abordagem mais limpa é usar regras udev que aplicam ajustes assim que o kernel detecta o dispositivo.

Por exemplo, para definir o agendador como nenhum, a afinidade de consulta (rq_affinity) como 2 e a leitura antecipada (read_ahead) como 128 KB em todas as unidades NVMe, você pode criar:

Crie uma regra udev para ajuste: sudo nano /etc/udev/rules.d/60-nvme-tuning.rules

Com o conteúdo:

Exemplo de uma regra udev: ACTION=="add|change", KERNEL=="nvme*n*", \
ATTR{queue/rq_affinity}="2", \
ATTR{queue/scheduler}="none", \
ATTR{queue/read_ahead_kb}="128"

Em seguida, recarregue o udev e acione as regras:

Aplicar regras udev: sudo udevadm control --reload
sudo udevadm trigger

Se você também deseja garantir que todas as unidades montadas se beneficiem de Opções como noatime ou tmpfs para diretórios temporáriosCombine essas regras com uma boa configuração do arquivo /etc/fstab, o que também reduz as gravações e contribui para a longevidade de SSDs e NVMe.

Alinhamento de partições, setores lógicos e TRIM em NVMe

Para que uma unidade NVMe funcione corretamente a longo prazo, os parâmetros do kernel por si só não são suficientes: Geometria lógica de partições e o uso de TRIMnem tecnologias como a armazenamento de memória persistenteElas fazem a diferença, especialmente em cargas de banco de dados e virtualização, onde a fragmentação e a sobrescrita são constantes.

A primeira coisa a fazer é verificar se suas partições estão alinhado em 1 MiBIsso geralmente se encaixa bem com a geometria interna da maioria dos SSDs modernos. Com o parted, você pode criar um layout organizado:

Particionamento alinhado (parted): sudo parted -s /dev/nvme0n1 mklabel gpt
sudo parted -s /dev/nvme0n1 mkpart primary 1MiB 100%
sudo parted -s /dev/nvme0n1 align-check optimal 1

Além disso, muitas unidades NVMe oferecem vários formatos LBA (LBAF) com diferentes tamanhos de setorNormalmente 512 bits e 4K. Você pode visualizar as opções e a métrica RP (Desempenho Relativo) com:

Visualizar formatos LBA: nvme id-ns -H /dev/nvme0n1 | grep -E 'LBA Format|Relative'

Se você decidir mudar, esteja ciente de que é uma mudança. operação destrutiva que apaga todo o conteúdo da unidade. Um exemplo de escolha do formato com índice 1 seria:

Alterar o formato LBA (operação destrutiva): sudo nvme format /dev/nvme0n1 --lbaf=1

Quanto ao TRIM, a ideia é informar à unidade quais blocos não contêm mais dados válidos para que ela possa reutilize-os sem penalidadePrimeiro, verifique se o dispositivo é compatível com o comando lsblk:

Verifique a compatibilidade com TRIM: lsblk --discard

Se você vir um valor DISC-GRAN diferente de zero, significa que há suporte. A maioria das distribuições mais recentes o habilita. Cronômetro semanal de fstrim Essa é a opção recomendada, melhor do que usar a opção discard em /etc/fstab, que adiciona sobrecarga a cada exclusão:

Ativar fstrim periódico: systemctl enable --now fstrim.timer
systemctl status fstrim.timer

Selecionando e instalando sistemas de arquivos em NVMe

A camada do sistema de arquivos é o filtro final entre seu aplicativo e o NVMe. XFS e ext4 funcionam muito bem em servidores Linux.E na maioria dos casos é aconselhável usar as opções padrão com pequenos ajustes destinados a reduzir gravações desnecessárias.

Uma opção muito eficaz, praticamente sem desvantagens, é noatimeIsso impede a atualização da última data e hora de acesso sempre que um arquivo é lido. Isso reduz as gravações em disco, o que melhora tanto a longevidade dos arquivos quanto o desempenho. Um exemplo em /etc/fstab com ext4 seria:

Exemplo de fstab (ext4 noatime): /dev/nvme0n1p1 / ext4 noatime,errors=remount-ro 0 1

Com o XFS, a filosofia é a mesma: use o sistema de arquivos padrão e adicione `noatime` se quiser prolongar ainda mais a vida útil do SSD. No caso do ext4 e do XFS, é... De preferência, TRIM periódico com fstrim.timer em vez da opção de descarte, exceto em casos muito específicos.

Se você trabalha com cartões SD ou mídias removíveis, lembre-se de que muitos usam FAT32 ou exFAT, que Eles não têm diários nem o método TRIM.Nesses casos, o ajuste se concentra mais na escolha de placas de maior qualidade e capacidade, e na minimização de gravações, alterando /var/log, /tmp ou diretórios com muita E/S para tmpfs quando fizer sentido.

Otimização geral de SSD/NVMe: noatime, tmpfs, swap e registro de logs.

Além dos ajustes específicos para NVMe, há um conjunto de otimizações clássicas para SSDs que continuam muito eficazes. A primeira delas é verificar quais diretórios estão sofrendo maior sobrecarga. leitura e escrita constantes usando iotop:

  Como instalar e configurar o Heroic Games Launcher no Linux e Steam Deck

Monitoramento de E/S em tempo real: iotop -oPa

Deixe o processo rodar por um tempo e você verá quais processos e caminhos têm prioridade. A partir daí, você pode mover alguns diretórios altamente voláteis para... tmpfs na RAMDesde que você tenha bastante memória. Exemplos típicos em /etc/fstab:

Exemplo de tmpfs no fstab: tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0

Em muitas distribuições Linux modernas, /tmp já é tmpfs, mas você ainda pode mover /var/tmp ou outros diretórios que geram muitos dados para a RAM. Outra opção é /var/log, caso não se importe em perder os logs entre reinicializações ou se você envia os logs para um servidor syslog remoto.

tmpfs /var/log tmpfs defaults,noatime,mode=0755 0 0

Em paralelo, revise o Configuração do systemd-journal Em /etc/systemd/journald.conf, é possível limitar o tamanho máximo do log (SystemMaxUse, RuntimeMaxUse, etc.) e o nível de detalhe (MaxLevelStore), evitando sobrecargas de escrita desnecessárias.

Outro ponto fundamental para qualquer SSD ou NVMe é o uso de política de troca e permutabilidadeReduzir esse valor permite que o kernel utilize a RAM de forma mais eficiente e reduz o uso do disco:

Ajuste de swapping: vm.swappiness=1

Se você tem uma memória excepcionalmente boa e está ciente do risco, pode até mesmo defini-lo como 0, embora na prática seja geralmente mais equilibrado combiná-lo com zram ou zswapque comprimem e gerenciam a troca na memória antes de chegar ao disco físico, reduzindo significativamente as gravações no NVMe.

Diagnóstico de problemas reais versus benchmarks sintéticos (fio, dd, cópias de arquivos)

Não é incomum um administrador se deparar com a situação em que O fio apresenta números excelentes, mas uma simples cópia de arquivo ou uma consulta SELECT INTO em um banco de dados parece absurdamente lenta.É crucial entender que as cargas do mundo real não se assemelham a um parâmetro de referência perfeito e que muitos outros fatores estão envolvidos.

Comandos como dd com bs=1M Eles geralmente mostram velocidades limitadas pelo camada do sistema de arquivos, o cache de páginas do kernel, o próprio dd e a forma como ele gravaDa mesma forma, uma operação massiva em MSSQL, MySQL ou MariaDB em ext4 ou XFS mede não apenas o NVMe, mas também o registro em diário, fsync, liberação de logs, bloqueios, CPU, agendador do kernel e muito mais.

Se em um servidor com Epyc, grande quantidade de RAM e unidades NVMe de alta performance você observar que os backups não ultrapassam 1-2 GB/s, mas o Fio reporta valores próximos à especificação, o gargalo provavelmente está no... camada de software (sistema de arquivos, banco de dados, configuração de registro em diário, tamanho do log, etc.) ou na forma como o paralelismo está sendo utilizado (número de threads efetivas, limites de concorrência no banco de dados, etc.).

A abordagem prática consiste em combinar ferramentas de baixo nível (fio, iostat, smart-log) com medições de nível de aplicação e ajustar em camadas: primeiro o kernel e o NVMe, depois o sistema de arquivos e, finalmente, o banco de dados e as próprias consultas.

O papel do hardware e do sistema operacional no desempenho do banco de dados.

Quando falamos em afinação bases de dados Em relação ao NVMe, é crucial lembrar que a configuração padrão raramente é suficiente para produção. A pirâmide de desempenho começa com o hardware.CPU, quantidade de RAM e, acima de tudo, tipo de armazenamento.

Na base dessa pirâmide está o qualidade de armazenamentoDiscos rígidos mecânicos já não fazem sentido para bases de dados transacionais complexas; SSDs SATA são o mínimo aceitável; e unidades NVMe conectadas via PCIe são o padrão ouro graças à sua baixa latência e altíssimo IOPS.

Acima disso está o sistema operacional: como ele gerencia memória, cache de páginas, E/S de disco e escalonamento de processos Isso afeta diretamente o banco de dados. Configurações como swappiness, seleção do agendador, uso de O_DIRECT no InnoDB, afinidade NUMA e montagem de diretórios em tmpfs podem fazer mais diferença do que uma simples alteração de parâmetro interno no MySQL.

Só então faz sentido lutar contra o Configuração do servidor de banco de dados (InnoDB, buffers globais, logs, etc.) e, acima de tudo, com o design de esquemas e índices e com a qualidade das consultas SQL.

MySQL/MariaDB em NVMe: otimizando o InnoDB para explorar ao máximo o hardware.

O InnoDB é o mecanismo de armazenamento padrão moderno por um motivo: Oferece transações ACID, bloqueio em nível de linha, boa resistência à corrupção e capacidade de lidar com alta concorrência.Mas para que realmente brilhe, sua configuração precisa estar alinhada com o hardware subjacente, especialmente com unidades NVMe rápidas.

O parâmetro da estrela é innodb_buffer_pool_sizeIsso define quanta RAM o InnoDB dedica para manter os dados e índices mais acessados ​​na memória. Como regra geral, em um servidor de banco de dados dedicado, entre 70% e 80% da RAM disponível é reservada para o pool de buffers, ajustando-se de acordo com os outros serviços em execução na máquina.

Quando os dados cabem principalmente no buffer pool, as leituras são resolvidas na RAM e o NVMe é usado principalmente para Gravações sequenciais de logs e descarga controladaCaso contrário, cada falha de cache envolve uma viagem ao disco e, mesmo que seja NVMe, o tempo O tempo de resposta será ordens de magnitude mais lento do que um acesso à memória.

O outro bloco de ajuste principal é o Logs do InnoDB (innodb_log_file_size e innodb_log_buffer_size)Um log de tamanho adequado permite agrupar mais alterações em longas gravações sequenciais, reduzindo a pressão de E/S aleatória nos arquivos de dados:

  • Arquivo de log grande: Melhor desempenho de gravação, mas tempos de recuperação mais longos após uma falha, pois mais eventos precisam ser reproduzidos.
  • Arquivo de log pequeno: Recuperação mais rápida, mas possível gargalo na escrita intensiva.

Para aproveitar ao máximo o NVMe, geralmente vale a pena ter Troncos ligeiramente maiores que o normalPorque a unidade consegue lidar confortavelmente com gravações sequenciais e o tempo de recuperação geralmente ainda é aceitável.

Concorrência, threads e E/S no InnoDB sobre NVMe

Em ambientes com muitas CPUs e unidades NVMe rápidas, é tentador ajustar parâmetros como innodb_thread_concurrency, innodb_read_io_threads e innodb_write_io_threadsNo entanto, nas versões atuais do MySQL/MariaDB, é prática comum deixar o parâmetro innodb_thread_concurrency em 0 para que o próprio mecanismo gerencie a concorrência interna.

  Google lança Linux Terminal nativo para Android: tudo o que você precisa saber

O importante é garantir que o servidor não fique sem espaço. Threads para operações de leitura e escrita E que a camada inferior (kernel e NVMe) esteja preparada para lidar com filas de E/S profundas quando a carga realmente exigir. Com NVMe, geralmente não há problema, mas é recomendável usar ferramentas como Performance Schema ou sys schema para verificar esperas anômalas de E/S.

A forma como o InnoDB interage com o sistema de arquivos também é crucial. O parâmetro innodb_flush_method=O_DIRECT No Linux, evita-se o armazenamento em buffer duplo com o cache do sistema de arquivos e a gravação é feita diretamente no dispositivo, o que é especialmente recomendado quando há RAID com cache protegido ou NVMe com um bom cache interno.

Gerenciamento de conexões, buffers de sessão e caches globais.

O NVMe rápido não é muito útil se o servidor de banco de dados estiver sobrecarregado. Milhares de conexões inativas, buffers de sessão gigantescos ou uma configuração de cache de consultas desatualizada.Portanto, além de ajustar o InnoDB, é necessário organizar os parâmetros gerais.

A variável max_connections define o número máximo de conexões simultâneas permitidas. Aumentá-lo cegamente porque "há muita RAM" é um erro: cada conexão arrasta consigo buffers e estruturas internas que se acumulam na memória. A melhor prática é monitorar Max_used_connections e Ajuste o valor de max_connections ligeiramente acima do pico real.Deixando espaço, mas sem exagerar.

`wait_timeout` especifica por quanto tempo uma conexão ociosa é mantida ativa antes de ser fechada. Valores padrão em horas não fazem muito sentido neste contexto. aplicações web com pools de conexõesReduzir esse tempo para 60 ou até mesmo 30 segundos ajuda a limpar sessões abandonadas e evita que a memória seja preenchida com conexões "em repouso".

Parâmetro tamanho_do_cache_de_thread Essa configuração controla quantas threads são armazenadas em cache para reutilização em novas conexões. Se o valor de `Threads_created` for significativamente maior que o de `Connections`, isso indica um cache pequeno. Ajustar essa configuração reduz o custo de criação de threads e melhora a capacidade de resposta durante picos de tráfego.

Com relação ao cache de consultas, ele está obsoleto no MySQL moderno e geralmente está ausente no MariaDB. causam mais bloqueios e problemas de invalidação do que benefícios Em sistemas com altas taxas de gravação, não oferece nenhuma vantagem especial em relação ao NVMe e, na maioria dos casos, é melhor desativá-lo.

Buffers de trabalho por sessão: tenha cuidado com a memória.

Parâmetros como sort_buffer_size, join_buffer_size e read_buffer_size Eles são alocados por thread conforme a necessidade, o que significa que valores enormes multiplicados por centenas de conexões podem consumir toda a RAM em velocidade máxima.

Esses buffers são usados ​​para operações específicas (classificações sem índice, junções sem índice, leituras sequenciais) e devem crescer apenas para casos específicos de consultas intensivas e controladasGlobalmente, é melhor manter valores conservadores e, se necessário, aumentá-los caso a caso em uma sessão de manutenção ou processo em lote, em vez de definir limites enormes para todos os clientes.

Projeto de esquema, índice e consulta: a camada onde se obtém o maior lucro.

Não importa o quanto você tenha de NVMe, otimização de kernel e InnoDB, se suas tabelas não tiverem Índices e consultas apropriados realizam varreduras completas e massivas.O hardware não vai conseguir te salvar. A ferramenta essencial para entender o que está acontecendo é o EXPLICAÇÃO.

Ao analisar um plano de execução, preste atenção a:

  • Tipo: Se você vir "ALL" em tabelas grandes, significa que houve uma varredura completa e você precisa adicionar índices.
  • chave e possíveis_chaves: Quais índices poderiam ser usados ​​e qual deles é efetivamente usado?
  • filas: Número estimado de linhas a serem examinadas; quanto menor, melhor.

A indexação correta é fundamental. as colunas usadas em WHERE e nas condições JOIN...bem como reescrever subconsultas correlacionadas em JOINs sempre que possível. Um bom projeto de índice reduz a E/S necessária por consulta e, portanto, aproveita melhor a baixa latência do NVMe.

Em nível esquemático, use tipos de dados tão pequenos quanto possívelA normalização para um nível razoável e a definição de chaves primárias simples (INT/BIGINT AUTO_INCREMENT) no InnoDB ajudam a tornar as tabelas mais compactas, a se adequarem melhor ao pool de buffers e a aproveitarem o cache e o hardware subjacente.

Ciclo de monitoramento contínuo e ajuste iterativo

Toda essa afinação é inútil se não Você mede o antes e o depois. de cada alteração. Para o banco de dados, o Log de Consultas Lentas, o Esquema de Desempenho e o esquema do sistema permitem localizar consultas lentas, tabelas com muitas varreduras completas, índices subutilizados ou arquivos que concentram muita E/S.

Ferramentas externas como Prometheus/Grafana, Percona PMM ou outros sistemas de monitoramento Elas facilitam a visualização do panorama geral: latência média e consultas p95/p99, QPS, uso da CPU, filas de E/S, temperatura e integridade do NVMe, etc. Com essas informações, você pode aplicar um processo iterativo sensato:

  • Defina uma linha de base de desempenho (hardware + kernel + banco de dados).
  • Identifique o principal gargalo naquele momento.
  • Aplicar uma única alteração (por exemplo, ajustar o pool de buffers, alterar o agendador ou adicionar um índice).
  • Meça novamente e decida se a alteração permanece, é revertida ou é modificada.

Otimizar NVMe e bancos de dados no Linux não é um truque de mágica ou uma simples alteração de parâmetro, mas sim uma abordagem complexa. processo contínuo de medição, compreensão e ajuste em camadasCombinando hardware de qualidade (especialmente NVMe de alta qualidade), um kernel bem otimizado (APST, agendador, NUMA, TRIM), sistemas de arquivos configurados de forma inteligente (noatime, tmpfs quando apropriado) e um MySQL/MariaDB bem parametrizado com esquemas e índices sólidos, é perfeitamente possível fazer com que seus servidores Linux liberem todo o potencial de seus drives NVMe em cargas de trabalho reais, além dos benchmarks sintéticos de laboratório.

O que há de novo no Linux 6.18
Artigo relacionado:
Linux 6.18: todas as novas funcionalidades do novo kernel