Ajuste do Agendador de E/S do Linux: mq-deadline, nenhum, BFQ
16 min de leitura - 1 de junho de 2026

Como escolher e ajustar o agendador de E/S do Linux correto para cargas de trabalho NVMe, SATA e HDD, com comandos sysfs, regras udev e etapas de benchmarking fio.
Ajuste do agendador de E/S do Linux: mq-deadline, none e BFQ
O agendador de E/S do Linux determina a ordem em que os pedidos de leitura e gravação chegam ao seu dispositivo de armazenamento, e a escolha certa depende quase inteiramente do seu hardware. Use none para NVMe, mq-deadline para SSDs SATA e HDDs a executar cargas de trabalho mistas, e bfq quando precisar de impedir que um processo sobrecarregue os outros. Este guia aborda como funcionam os três principais agendadores, como escolher o mais adequado à sua carga de trabalho e como ajustar e verificar o resultado.
Se quiser um guia prático antes de ler, este vídeo aborda os conceitos básicos de como alternar e testar agendadores a partir do terminal.
Como o mq-deadline, o none e o BFQ diferem
Cada agendador lida com os pedidos com uma estratégia diferente. Saber como diferem é o que lhe permite escolher deliberadamente, em vez de executar o que quer que o kernel tenha escolhido no arranque.
mq-deadline
O mq-deadline agendador garante que nenhuma solicitação fique à espera indefinidamente. Ele mantém filas separadas e ordenadas para leituras e gravações, ordenando-as por Endereço de Bloco Lógico (LBA) para reduzir o tempo de busca, e impõe prazos: 500 ms para leituras e 5 segundos para gravações por padrão. Quando uma solicitação atinge o seu prazo, ela salta para o início da fila.
As leituras têm prioridade sobre as gravações, uma vez que as leituras normalmente bloqueiam a aplicação, enquanto as gravações são tratadas de forma assíncrona. Para impedir que as gravações fiquem totalmente prejudicadas, o agendador processa um lote de gravações em atraso após um número definido de leituras. O resultado é uma baixa latência consistente, o que o torna uma excelente opção para servidores de bases de dados e qualquer carga de trabalho que misture leituras e gravações.
nenhuma
O none agendador não faz praticamente nada. Ele encaminha as solicitações diretamente para o dispositivo na ordem First-In-First-Out, sem reordenação, fusão ou priorização. Isso é adequado para unidades NVMe modernas, que gerem as suas próprias filas internas e podem rastrear dezenas de milhares de solicitações em andamento ao mesmo tempo. Remover a camada de agendamento de software proporciona o caminho mais curto possível da aplicação ao dispositivo, que é exatamente o que as cargas de trabalho NVMe de alto rendimento desejam.
O problema é que isto só funciona quando o hardware consegue agendar de forma inteligente por si próprio. Em HDDs ou SSDs SATA com filas curtas, ignorar a reordenação do software geralmente piora o desempenho, em vez de o melhorar.
BFQ
O BFQ (Budget Fair Queuing) coloca a equidade em primeiro lugar. Em vez de intervalos de tempo, atribui a cada processo um orçamento medido em setores de disco. Leitores sequenciais de grande dimensão recebem orçamentos maiores para manter a taxa de transferência elevada, enquanto as tarefas sensíveis à latência recebem orçamentos menores para que sejam atendidas rapidamente, e um ciclo de feedback ajusta os orçamentos à medida que o sistema funciona.
O BFQ mantém as tarefas interativas responsivas mesmo sob carga pesada, de modo que a reprodução de vídeo ou uma consulta à base de dados permanece fluida enquanto uma transferência de ficheiros de grande dimensão é executada em segundo plano. Essa equidade tem um custo em termos de CPU. A sua sobrecarga por pedido é de aproximadamente 1,9 microssegundos, cerca de três vezes a do mq-deadline, e num núcleo ARM mais lento essa sobrecarga limita a taxa de transferência para um valor bem abaixo do que o mesmo agendador atinge num chip x86 rápido. Em servidores onde a taxa de transferência bruta e a eficiência da CPU são mais importantes, essa compensação é difícil de justificar.
| Agendador | Algoritmo | Sobrecarga da CPU | Melhor hardware | Objetivo principal |
|---|---|---|---|---|
mq-deadline | LBA ordenado com prazos | Baixa (~0,7 µs/req) | SSD SATA, HDD, discos virtuais | Latência baixa previsível |
none | FIFO, sem reordenação | Insignificante | SSD NVMe | Largura de banda máxima |
bfq | Orçamentos de partilha proporcional | Moderado (~1,9 µs/req) | HDDs, sistemas partilhados e de secretária | Equidade e capacidade de resposta |
Escolher um agendador adequado à sua carga de trabalho
Dois fatores determinam o agendador certo: o seu hardware de armazenamento e o padrão de acesso da sua aplicação. Comece pelo hardware. Se o dispositivo já reordena os pedidos, como uma unidade NVMe com firmware compatível, o agendamento por software apenas acrescenta sobrecarga, pelo que none ganha. Em discos rígidos rotativos, onde o tempo de busca é determinante, a reordenação por software reduz a latência, pelo que mq-deadline ou bfq são as melhores escolhas. Os SSDs SATA situam-se no meio: mais rápidos do que os HDDs, mas sem as filas profundas do NVMe, sendo que é aí que mq-deadline se encaixa.
A mesma lógica aplica-se quando outra coisa já está a agendar por si. As VMs convidadas no virtio-blk dependem do anfitrião para agendar a E/S, e os controladores RAID de hardware com cache de gravação posterior otimizam a sua própria ordenação. Em ambos os casos, none evita-se pagar duas vezes pelo trabalho.
O padrão de acesso é o segundo fator. Uma base de dados a realizar milhares de leituras aleatórias de 4K por segundo não tem nada em comum com uma tarefa de treino a transmitir grandes blocos sequenciais a partir de uma matriz NVMe, e ambas requerem agendadores diferentes. A tabela abaixo mapeia cargas de trabalho comuns para um ponto de partida.
| Carga de trabalho | Armazenamento | Agendador | Motivo |
|---|---|---|---|
| Formação em IA/ML | SSD NVMe | none | Alto débito sequencial; o firmware gere as filas |
| Base de dados OLTP | SSD NVMe | none | E/S aleatória de baixa latência; evita sobrecarga de software |
| Base de dados OLTP | SSD SATA | mq-deadline | Evita a escassez de gravação; latência de cauda previsível |
| Data warehouse / OLAP | NVMe / SSD rápido | none | Filas paralelas profundas; débito máximo |
| Alojamento web geral | SSD SATA / HDD | mq-deadline | Resposta consistente para E/S mista de ficheiros pequenos |
| Alojamento partilhado / multi-tenant | HDD / SSD | bfq | Equidade entre inquilinos; impede a monopolização de E/S |
| Máquina virtual convidada | virtio-blk | none | O anfitrião já agenda; a dupla agendamento desperdiça CPU |
| Cópia de segurança / arquivo | HDD | mq-deadline | Largura de banda sequencial com prevenção de escassez |
Há uma exceção que vale a pena destacar. Mesmo no NVMe, se a latência de cauda no p99 ou p999 for a métrica que lhe interessa, como em sistemas financeiros, mq-deadline pode superar none ao impor prazos rigorosos e evitar o atraso ocasional de pedidos.
Alteração e ajuste dos parâmetros do agendador
Tanto a troca de agendadores como o ajuste dos seus parâmetros são feitos através do sysfs, sem necessidade de reiniciar o sistema para testar uma alteração.
Alterar o agendador ativo
Verifique o que está disponível para um dispositivo, sendo que o valor entre parênteses é o ativo:
cat /sys/block/sda/queue/schedulerMude para um agendador diferente em tempo de execução. Isto entra em vigor imediatamente, mas não sobrevive a um reinício:
echo bfq | sudo tee /sys/block/sda/queue/schedulerSe bfq não estiver listado, carregue primeiro o módulo:
sudo modprobe bfqPara tornar a escolha permanente, use uma regra udev em vez do antigo elevator= parâmetro do kernel, que já não altera o agendador no RHEL 9 e versões semelhantes. Esta regra define mq-deadline para todos os discos SCSI não rotativos em /etc/udev/rules.d/60-io-scheduler.rules:
ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"Recarregue e aplique-a sem reiniciar:
sudo udevadm control --reload-rules && sudo udevadm triggerEm sistemas baseados no RHEL, os perfis do TuneD fazem o mesmo trabalho através de perfis a nível do sistema, em vez de regras por dispositivo.
Parâmetros que vale a pena ajustar
Cada agendador expõe os seus parâmetros ajustáveis em /sys/block/<device>/queue/iosched/. Para mq-deadline, os prazos são as principais alavancas. As bases de dados sensíveis à latência em SSDs SATA beneficiam de prazos mais curtos:
echo 100 | sudo tee /sys/block/sda/queue/iosched/read_expire
echo 1000 | sudo tee /sys/block/sda/queue/iosched/write_expirePara bfq em sistemas de alto rendimento, desativar a heurística de latência aumenta o rendimento:
echo 0 | sudo tee /sys/block/sda/queue/iosched/low_latency
echo 0 | sudo tee /sys/block/sda/queue/iosched/slice_idle| Agendador | Parâmetro | Padrão | Objetivo de ajuste |
|---|---|---|---|
mq-deadline | read_expire | 500 ms | Menor para uma resposta de leitura mais rápida |
mq-deadline | write_expire | 5000 ms | Menor para reduzir a latência de gravação |
mq-deadline | writes_starved | 3 | Aumente para cargas com grande volume de leitura |
mq-deadline | fifo_batch | 16 | Defina como 1 para obter a latência mínima |
bfq | low_latency | 1 | Defina como 0 para obter o máximo de rendimento |
bfq | slice_idle | 8 ms | Defina como 0 para SSDs ou RAID |
bfq | strict_guarantees | 0 | Defina como 1 para partilha rigorosa de largura de banda |
Para alojamento partilhado, o BFQ combina bem com o cgroups v2. A atribuição de io.weight valores permite atribuir a um processo de base de dados dez vezes a quota de E/S de uma tarefa de cópia de segurança, por exemplo, para que o trabalho em segundo plano não sobreponha o tráfego interativo. Independentemente das alterações que efetuar, o custo por pedido mais elevado do BFQ acumula-se em sistemas limitados pela CPU e com elevado IOPS, pelo que deve realizar testes de desempenho antes de avançar.
Verificar o desempenho após o ajuste
Registe sempre uma linha de base antes de alterar qualquer coisa. Sem ela, não há forma de saber se um ajuste ajudou.
O fio é a ferramenta padrão para isso. Reproduz padrões específicos de carga de trabalho através do tamanho do bloco, profundidade da fila e configurações do motor de E/S. Passe sempre --direct=1 para que ignore a cache de páginas e avalie diretamente o agendador e o dispositivo, em vez de leituras em cache. Adapte o teste à carga de trabalho real:
| Carga de trabalho | Parâmetros do fio |
|---|---|
| Base de dados OLTP | --rw=randread --bs=4k --iodepth=32 --direct=1 |
| Data warehouse | --rw=read --bs=1m --iodepth=32 --direct=1 |
| Gravação antecipada / registo de refazer | --rw=write --bs=4k --iodepth=1 --direct=1 |
| Armazenamento de objetos | --rw=randrw --bs=64k --iodepth=64 --direct=1 |
Execute o mesmo teste com iodepth valores de 1 a 256 para determinar o ponto de saturação do dispositivo, a profundidade em que as IOPS deixam de aumentar e a latência atinge picos. Para monitorização em tempo real após uma alteração, iostat -x 1 relate as métricas que importam: r_await e w_await para a latência de conclusão de leitura e gravação, aqu-sz para a profundidade média da fila e %util para a utilização do dispositivo. Quando %util se situa perto dos 100 por cento, o hardware é o limite e nenhuma alteração no agendador irá ajudar.
Para separar o custo do software do custo do hardware, execute o blktrace com o btt. Ele divide a latência em Q2D, o tempo gasto na fila do software, e D2C, o tempo que o dispositivo leva para atender à solicitação. Se o Q2D for predominante, o agendador é o seu gargalo. Se o D2C for predominante, o hardware é.
Uma coisa a ter em mente ao ler os resultados: a escolha do agendador molda principalmente a cauda da distribuição de latência, não a mediana. Mudar de none para mq-deadline em NVMe pode aumentar a latência mediana em alguns microssegundos, ao mesmo tempo que reduz a latência p99 e p999 para metade. Para serviços voltados para o utilizador e sujeitos a SLAs, essa troca vale quase sempre a pena, razão pela qual medir a latência da cauda, e não a taxa de transferência média, é o objetivo do exercício.
Escolher o agendador certo
O ajuste do agendador consiste em adaptar o algoritmo ao hardware e ao padrão de acesso e, em seguida, comprová-lo através de medições. A versão resumida:
- NVMe: use
nonee deixe que o firmware faça o enfileiramento. - SSD SATA e HDD com E/S mista: use
mq-deadlinepara uma latência previsível. - Hosts partilhados ou multi-tenant: use
bfqpara evitar que uma carga de trabalho sobrecarregue as restantes. - Acompanhe a latência mínima, não a mediana: as alterações do agendador aparecem em p99 e p999, por isso é isso que se deve medir.
- Torne-o persistente: use regras udev ou TuneD, nunca o parâmetro
elevator=.
Tirar o máximo partido de qualquer agendador começa com hardware capaz de acompanhar o ritmo. Se precisar de servidores com suporte NVMe concebidos para cargas de trabalho de alto rendimento e baixa latência, explore as opções de VPS da FDC.

Como alojar modelos de IA da Ollama em servidores dedicados
Saiba como alojar modelos de IA da Ollama em servidores dedicados para manter a segurança dos dados, garantir a escalabilidade e melhorar o desempenho.
5 min de leitura - 8 de setembro de 2025
Como instalar e utilizar o Redis num VPS
9 min de leitura - 7 de janeiro de 2026