Escalonamento de I/O no GNU/Linux

Após dias de ausência, volto a postar no blog trazendo um assunto bastante interessante, ainda mais para os que gostam de performance.


O Kernel do GNU/Linux é responsável por controlar o acesso ao disco por meio de agendamento de requisições de I/O. Esse recurso é muito importante para sistemas que utilizam, de forma concorrente, o acesso à leitura e escrita em discos rígidos. Com isso, o sistema busca aperfeiçoar a utilização da cabeça de leitura/gravação dos discos de modo a economizar tempo e ter o melhor  desempenho possível para atender as requisições.


Existem diversos algoritmos que tem o propósito de organizar a leitura e escrita no disco. Os mais utilizados atualmente e que estão incluídos por padrão no Kernel 2.6 do GNU/Linux são: NOOP; CFQ; Anticipatory e Deadline.

Os objetivos de utilizar algoritmos de escalonamento de I/O são:

  • Minimizar o tempo desperdiçado de procura no disco rígido.
  • Priorizar certas solicitações de I/O pelos processos.
  • Dar uma parte da largura de banda de disco para cada processo em execução.
  • Garantir que certos pedidos serão atendidos antes de um prazo determinado.
 
Cada um destes algoritmos implementa níveis de recursos e características diferentes. É importante mencionar que cada algoritmo pode se adaptar melhor a determinadas cargas de trabalho e, por isso, devem ser realizados testes para escolher o que melhor se adapta. Para isso, recomendo a utilização de benchmarks como o Phoronix Test Suite.

Como mencionado anteriormente, a ideia de utilizar esses algoritmos é economizar o uso da cabeça de leitura e gravação do disco. Caso não existissem estes algoritmos, nenhum tipo de técnica seria adotado. Neste caso, as requisições seriam tratadas em uma estrutura de dados do tipo fila, como FIFO (First In First Out – O primeiro a entrar é o primeiro a sai). Nos dias de hoje, isso é inadmissível, pois os sistemas exigem rapidez e agilidade nos tratamentos de requisições, além da disponibilidade dos dados em um tempo hábil. Sem uma política de escalonamento, a cabeça de leitura/gravação iria perder muito tempo para atender as requisições. Observe o exemplo da figura abaixo:


Suponha que chegaram requisições para acesso ao disco na seguinte seqüência:
A > B > C. Conforme ilustrada na figura acima, a cabeça de leitura/gravação do disco será movida até o setor A, em seguida será movida para o setor B, e por último para o setor C.
Observe que é uma operação muito custosa: a cabeça de leitura iria passar pelo setor C em um segundo movimento para atender a requisição do setor B, desperdiçando tempo para finalizar o atendimento das três requisições.
Os algoritmos de escalonamento foram criados justamente para melhorar o
desempenho na utilização de dispositivos de armazenamento físico, de forma a atender diversas requisições de processos concorrentes em menos tempo. Ou seja, o algoritmo irá ordernar as requisições de maneira que todas possam ser atendidas no menor tempo possível. Vejamos então estes algoritmos:

NOOP
Técnica extremamente simples que praticamente não adiciona nenhum recurso. É um algoritmo com apenas uma fila, no mesmo estilo de FIFO, e utiliza uma quantidade mínima de CPU. O único recurso extra deste algoritmo é a execução de junção entre as últimas requisições apenas. Junção é o processo de agrupar setores idênticos a fim de ser realizada a operação uma única vez. Portanto, este mecanismo tenta melhorar os últimos itens da fila para buscar uma possibilidade de resumir operações de I/O.

CFQ
Complete Fair Queue. O principal conceito desde algoritmo é permitir que haja
justiça entre os processos do sistema ao utilizar recursos de I/O. Este algoritmo tenta distribuir a largura de banda de I/O entre todas as requisições. Através de um processo interno, este escalonamento procura criar filas independentes para cada processo que queira usar os recursos de I/O. CFQ é o algoritmo padrão na maioria das distribuições GNU/Linux, justamente por ser uma boa opção em sistemas onde o recurso de I/O não deve ser monopolizado por nenhum processo.

Anticipatory
Este algoritmo apresenta um atraso controlado para que algumas ações possam ser antecipadas. Isso é uma boa técnica para realizar operações de áreas de disco que estão próximas. Com as áreas adjacentes é possível realizar um processo de junção ou reordenação (controle devido dos movimentos de cabeça de leitura), melhorando o desempenho e a eficiência dos acessos ao disco. Um problema que pode ocorrer com o uso desde algoritmo é a presença de uma latência maior, causada pela espera das requisições.

Deadline
Este algoritmo oferece uma garantia de execução em tempo real das operações de I/O. Ele utiliza um conjunto de filas e estas são orientadas em tempos de execução. Esta política favorece as operações de leitura, pois tem um prazo de expiração menor se comparado com o prazo das operações de escrita.


Definindo um escalonador
O GNU/Linux oferece muitos recursos para personalização de sistemas. E pensando em oferecer mais praticidade, foi adicionado ao kernel 2.6 o recurso de não ser mais necessário reiniciar o  sistema para que as alterações de escalonador tornem-se efetivadas.
Portanto, o correto é testar cada escalonador em seu ambiente para obter os resultados e a partir daí analisar para se obter uma resposta com dados comprovados que a escolha seja a melhor possível.

Para verificar qual o escalonador que está ativo em seu sistema execute o comando conforme o exemplo abaixo:

[janssen@caixapreta ~]$ cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

O termo entre colchetes exibe qual o escalonador está ativado no sistema para o
dispositivo sda (o primeiro disco SATA instalado no sistema GNU/Linux). Para alterar o escalonador de I/O, é preciso executar o seguinte comando:

[janssen@caixapreta ~]$ echo deadline > /sys/block/sda/queue/scheduler

Essa configuração é efetivada em tempo real, não precisa reiniciar o sistema. Para efetivar a sua escolha, sugiro adicionar o comando acima em algum script de inicialização do sistema.

Aqui tem disponível o meu TCC sobre Otimização de Servidores GNU/Linux para SGBD. Nele tem um comparativo entre os escalonadores de I/O sobre alguns testes que eu fiz em alguns sistemas de arquivos utilizando disco SATA.

Para saber mais sobre o assunto, sugiro a leitura dos seguintes artigos:

Kernel Korner - I/O Schedulers
DevelopWorks

É isso leitores. Espero que aproveitem mais esta dica que eu selecionei para vocês.

Abraços e até a próxima.

Share this:

,

COMENTÁRIOS

0 comentários:

Postar um comentário