Comparação entre os escalonadores BFQ e MQ-Deadline (acesso a disco) no Arch e Debian

Neste artigo vou fazer uma comparação entre os escalonadores BFQ e MQ-Deadline para acesso ao disco nas distribuições Arch Linux e Debian 13 para mostrar a diferença de desempenho de acordo com o hardware de disco usado.

[ Hits: 1.559 ]

Por: Sidnei Serra em 07/09/2025 | Blog: https://www.youtube.com/channel/UCRgokKtNlttdmg2RJEa2VYw


O que são escalonadores e o hardware usado nos testes



Um scheduler ou agendador é um recurso do kernel para gerenciar filas e prioridades de acesso ao disco de acordo com a demanda de requisições e vamos ver aqui os dois principais

1. None ou nenhum


Usado (ou não usado...) basicamente em discos NVMe pois, pela velocidade de acesso aos dados dos discos e a quase inexistente latência - já que não tem partes móveis - normalmente o kernel escolhe não usar nada como agendador, as filas de requisições de acesso são praticamente instantâneas e rápidas o suficiente para dispensar o uso de um; no máximo poderia ser usado um mq-deadline, por exemplo;

2. MQ-Deadline


Um agendador "simples" e direto, rápido e pode ser usado com SSD, NVMe ou discos rígidos mas, dependendo de como o kernel foi compilado (patches, etc), pode ter melhores ou piores resultados dependendo do disco ou do kernel conforme falado. O Deadline "prefere" discos mais rápidos pois ele tende a ser mais seletivo entre as tarefas de acesso ao disco, como por exemplo copiar arquivos grandes e durante essa tarefa de cópia abrir o navegador de internet - este pode "ficar esperando" até o agendador "encaixar" a abertura do navegador;

3. BFQ


Um agendador mais elaborado que distribui as tarefas de acesso ao disco de modo mais uniforme, onde uma nova tarefa não precisa esperar tanto para ser executada enquanto há outra já em operação; tende a dar uma melhor experiência de uso do sistema ao usuário que tem disco rígido mas, como no Dealine, vai depender do disco e do kernel utilizado.

O sistema costuma então, de modo automático, definir o MQ-Deadline para SSDs e para HDDs para dar uma "universalidade" no acesso ao disco mas isso pode ser melhor estruturado para cada caso - tipo de disco HDD usado, por exemplo.

Os testes foram feitos em uma máquina Core2Duo com placa-mãe Asrock G41-VS3 com um disco de 1TB x 5900rpm Seagate Video 3.5 HDDST1000VM002.

Gráfico de teste entre o BFQ e o MQ-Deadline no Arch e no Debian 13:
O que são escalonadores e o hardware usado nos testes
    Próxima página

Páginas do artigo
   1. O que são escalonadores e o hardware usado nos testes
   2. Teste no Arch Linux - kernel 6.16.0-arch2-1
   3. Teste no Debian 13 - kernel 6.12.41+deb13-amd64
   4. O script de teste e como escolher o escalonador a ser usado
Outros artigos deste autor

Mitigação - O que é e quando é "seguro" desabilitar

O que é o THP na configuração de RAM do Linux e quando desabilitá-lo

Conciliando o uso da ZRAM e SWAP em disco na sua máquina

Máquina perereca - até onde é possível o uso de Linux?

Leitura recomendada

CUPS - Gerenciador de impressões

Vim com corretor ortográfico em pt_BR/es_ES/en_US

Instalação do cliente no-ip no Debian

Bind9 slave em chroot no Debian Lenny

Configuração fácil de um servidor PPP

  
Comentários
[1] Comentário enviado por Zoiudo em 14/09/2025 - 18:43h

Uma correção para o script desse artigo:

#!/bin/bash
# Script para comparar mq-deadline vs bfq automaticamente
# Requer: sudo, fio

DISK="/dev/sda" # ajuste se necessário
WORKDIR="$HOME/teste-scheduler"
RESULTS="$WORKDIR/resultados.txt"
SUMMARY="$WORKDIR/resumo.txt"

mkdir -p "$WORKDIR"
rm -f "$RESULTS" "$SUMMARY"
echo "== Teste iniciado em $(date) ==" > "$SUMMARY"


rodar_teste() {
local sched="$1"

# Ajusta o scheduler
sudo tee /sys/block/sda/queue/scheduler <<< "$sched" >/dev/null
echo ">> Scheduler: $sched" | tee -a "$RESULTS" >&2

local total_bw=0

for test in \
"seqread:--rw=read --bs=1M --size=2G --runtime=30s --time_based" \
"seqwrite:--rw=write --bs=1M --size=2G --runtime=30s --time_based" \
"randread:--rw=randread --bs=4k --size=1G --runtime=30s --time_based" \
"randwrite:--rw=randwrite --bs=4k --size=1G --runtime=30s --time_based"
do
local name=${test%%:*}
local opts=${test#*:}

# Apaga arquivo anterior para garantir teste limpo
rm -f "$WORKDIR/testfile"

# Limpa cache antes de leituras seq
if [[ "$name" == "seqread" ]]; then
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
fi

echo "Executando $name..." | tee -a "$RESULTS" >&2

local bw=$(fio --name=$name $opts --numjobs=1 --filename="$WORKDIR/testfile" 2>&1 \
| grep "BW=" | awk -F'BW=' '{print $2}' | awk '{print $1}')

echo "$name: $bw" | tee -a "$RESULTS" >&2

# Converter para KB/s
local unit=$(echo "$bw" | grep -o '[KMG]iB/s')
local value=$(echo "$bw" | grep -o '^[0-9.]*')

local kb=0
case $unit in
KiB/s) kb=$(awk "BEGIN{printf \"%d\", $value}") ;;
MiB/s) kb=$(awk "BEGIN{printf \"%d\", $value*1024}") ;;
GiB/s) kb=$(awk "BEGIN{printf \"%d\", $value*1024*1024}") ;;
esac

total_bw=$((total_bw + kb))
done

echo "$sched total score (KB/s): $total_bw" >> "$SUMMARY"

# Somente o número vai para stdout
echo "$total_bw"
}


# Rodar para os dois schedulers
score_deadline=$(rodar_teste mq-deadline)
score_bfq=$(rodar_teste bfq)

echo "" >> "$SUMMARY"
if [ "$score_deadline" -gt "$score_bfq" ]; then
echo "Melhor scheduler para este sistema: mq-deadline" | tee -a "$SUMMARY"
else
echo "Melhor scheduler para este sistema: bfq" | tee -a "$SUMMARY"
fi

echo "== Teste concluído em $(date) ==" >> "$SUMMARY"
cat "$SUMMARY"


#
##
###
#### Conhecimento não vem de graça, valorize o aprendizado e a ajuda recebida! ####


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts