ionice: Controlando a Prioridade de I/O de Disco

ionice: Controlando a Prioridade de I/O de Disco

O Que e ionice?

Conclusao: ionice define e consulta a prioridade de I/O de disco de um processo. Enquanto nice controla tempo de CPU, ionice controla quem acessa o disco primeiro.

ionice vem com o pacote util-linux e esta pre-instalado em virtualmente toda distribuicao. Voce o usa para executar tarefas pesadas em I/O (backups, copias em massa) de forma que nao atrapalhem o restante.

Ha duas formas basicas:

# Aplicar uma prioridade a um comando que voce vai iniciar
ionice [opcoes] command [args...]

# Alterar ou consultar um processo ja em execucao (por PID)
ionice [opcoes] -p PID...

Por Que Voce Precisa de ionice?

Conclusao: Quando um backup ou rsync faz todo o servidor rastejar, a causa usual e contencao de I/O de disco. Reduzir a prioridade do trabalho pesado com ionice protege o tempo de resposta dos seus servicos reais.

Mesmo com bastante CPU livre, um unico disco serializa requisicoes de I/O. Quando tar, dd, rsync ou du satura o disco, qualquer servidor web ou banco de dados no mesmo disco subitamente fica extremamente lento.

Reduzir a prioridade de CPU com nice nao faz nada contra atrasos causados por espera de I/O. E exatamente ai que ionice ajuda: coloque uma tarefa pesada em lote na classe idle e ela so executa "quando ninguem mais esta usando o disco."

Um wa (iowait) alto no top significa que o gargalo e I/O, nao CPU. E precisamente quando ionice prova seu valor.

Como Especificar a Classe e Prioridade?

Conclusao: Defina a classe com -c: 1=realtime (prioridade maxima, apenas root), 2=best-effort (padrao), 3=idle (somente quando ocioso). Use -n para um nivel de 0 (mais alto) a 7 (mais baixo).

Ha quatro classes de escalonamento de I/O.

Numero Classe Significado Prioridade -n
0 none Sem classe explicita; derivada do valor nice de CPU ignorada
1 realtime Sempre acessa o disco primeiro; pode inanir outros 0-7
2 best-effort Classe padrao para trabalho normal 0-7
3 idle Executa somente quando ninguem mais precisa do disco ignorada

O nivel -n vai de 0 (mais alto) a 7 (mais baixo). So importa para as classes realtime e best-effort; a classe idle o ignora (idle e sempre a mais baixa).

# Executar um backup na classe idle (nunca perturba outro trabalho)
ionice -c 3 tar czf /backup/data.tar.gz /var/data

# Copia em massa com best-effort na prioridade mais baixa
ionice -c 2 -n 7 cp -a /src/huge.img /mnt/

# Classe realtime (prioridade maxima); requer root
sudo ionice -c 1 -n 0 dd if=/dev/sdb of=/dev/sdc bs=1M

realtime (classe 1) requer root e, mal utilizada, pode inanir completamente o I/O de outros processos. Em producao, use idle ou best-effort; recorra a realtime apenas com um motivo claro.

Como Aplicar a um Processo em Execucao?

Conclusao: Use -p PID em um processo ativo. -p sozinho mostra a prioridade atual; combine com -c/-n para altera-la.

Voce pode repriorizar uma tarefa pesada mesmo se esqueceu o ionice ao iniciar.

# Mostrar a prioridade de I/O atual do PID 1234
ionice -p 1234
best-effort: prio 4
# Mover o PID 1234 em execucao para a classe idle
ionice -c 3 -p 1234

# Voce tambem pode visar por usuario ou grupo de processos
ionice -c 3 -u 1000      # todos os processos do UID 1000
ionice -c 3 -P 5678      # grupo de processos 5678

Detectou um du ou rsync descontrolado? Pegue seu PID com pgrep rsync e rebaixe para idle com ionice -c 3 -p $(pgrep rsync) -- voce alivia o servidor sem matar a tarefa.

E Se ionice Nao Tiver Efeito?

Conclusao: Apenas o scheduler BFQ (e o legado CFQ) respeita prioridades de I/O. Os schedulers mq-deadline / none que sao padrao em muitos sistemas modernos ignoram as classes do ionice.

Esta e a maior armadilha. Uma prioridade so tem efeito quando o scheduler de I/O a interpreta. Historicamente era o CFQ; hoje apenas o BFQ faz isso. O CFQ foi removido no Linux 5.0, e os padroes none ou mq-deadline comuns em NVMe nao distinguem prioridades de I/O.

Primeiro, verifique o scheduler atual para o disco alvo.

# Verificar o scheduler do sda (o valor entre [] e o ativo)
cat /sys/block/sda/queue/scheduler
none mq-deadline kyber [bfq]

Se [bfq] estiver selecionado, ionice funciona. Se mostrar [mq-deadline] ou similar, troque.

# Carregar o modulo bfq se necessario
sudo modprobe bfq

# Trocar o scheduler do sda para bfq (temporario; reverte na reinicializacao)
echo bfq | sudo tee /sys/block/sda/queue/scheduler

Trocar o scheduler afeta o comportamento geral do disco. BFQ e forte em equidade mas pode reduzir throughput em NVMe de altissimo IOPS. Valide o impacto antes de tornar permanente (ex. via regra udev). Se -c idle ainda permite que uma tarefa pesada sobrecarregue todos, suspeite do scheduler primeiro.

Quando Usar nice vs ionice?

Conclusao: Use nice para trabalho intensivo em CPU e ionice para trabalho intensivo em I/O. Para tarefas pesadas em ambos, combine-os.

Gargalo Comando Exemplos
CPU (compute) nice gzip, ffmpeg, builds
I/O de disco ionice tar, rsync, dd, du
Ambos combinar backups em geral

Backups consomem tanto CPU (compressao) quanto I/O (leitura/escrita), entao reduzir ambos e o procedimento padrao.

# Menor prioridade para CPU e I/O
nice -n 19 ionice -c 3 tar czf /backup/data.tar.gz /var/data

Quais Sao os Padroes Comuns do Mundo Real?

Conclusao: Os tres pilares sao "backups noturnos," "copiar/deletar arquivos enormes" e "primeiros socorros para processo descontrolado." Mantenha templates prontos para copiar e colar construidos em torno da classe idle.

# 1) Backup noturno via cron com idle + nice (sem impacto na producao)
nice -n 19 ionice -c 3 rsync -a /var/www/ /backup/www/

# 2) Deletar arquivos enormes sem monopolizar o disco
ionice -c 3 rm -rf /var/log/old-huge-dir/

# 3) Primeiros socorros: rebaixar um processo pesado em execucao para idle
ionice -c 3 -p "$(pgrep -d, -f backup-script)"

A opcao -t (--ignore) permite que o comando continue executando mesmo se a definicao de prioridade falhar. Util quando voce nao quer que um script aborte em sistemas cujo scheduler nao suporta prioridades.

Proximas Leituras