ionice: Controlando a Prioridade de I/O de Disco
O Que e ionice?
Conclusao:
ionicedefine e consulta a prioridade de I/O de disco de um processo. Enquantonicecontrola tempo de CPU,ionicecontrola 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
rsyncfaz todo o servidor rastejar, a causa usual e contencao de I/O de disco. Reduzir a prioridade do trabalho pesado comioniceprotege 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-npara 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 PIDem um processo ativo.-psozinho mostra a prioridade atual; combine com-c/-npara 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/noneque sao padrao em muitos sistemas modernos ignoram as classes doionice.
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
nicepara trabalho intensivo em CPU eionicepara 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.