Pular para o conteúdo principal

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.

Comentários

Postagens mais visitadas deste blog

Integração Zabbix + GLPI

Versão atualizada Essa atualização é em consequência de pedidos vindo dos gringos e também a pedido da Zabbix SIA por ser o 4.º conteúdo mais popular no recém criado  https://share.zabbix.com/  e o 1.º entre os brasileiros.   Para conferir a lista dos mais populares, acesse  https://share.zabbix.com/popular Há um tempo que eu queria desenvolver algo para integrar o Zabbix a algum outro sistema. Esse ano surgiu uma oportunidade de implementação de alguns sistemas de inventário e gerenciamento de chamados. Logo pensei em fazer uma integração para abertura e fechamento automático dos tickets quando ocorresse algum problema que o Zabbix identificasse. Porém, o meu entusiasmo foi logo caindo quando eu percebi que não era uma coisa tão trivial de se fazer. Pesquisei várias fontes em busca de informações a respeito dessa integração, porém não passavam de tutoriais ensinando como abrir tickets no GLPI enviando um e-mail. Estudando mais um pouco o GLPI, percebi que não era possível

Primeiros passos com API do Zabbix

Bom galera, Faz tempo que não posto nada sobre Zabbix. Então, quis presentear vocês com um conteúdo mais avançado. Espero que ao menos 1 vez por mês coloco mais assuntos como esse no blog. Vou mostrar para vocês como utilizar a API do Zabbix. Antes vou explicar de forma básica o que API para os que não sabem do que se trata. Programadores tem a obrigação de saber.  :P - API  - Application Programming Interface  - é um conjunto de rotinas e padrões estabelecidos por um software. Isso permite que aplicações de terceiros utilizem as funcionalidades oferecidas pelo software.

Usando LSOF para verificar porta usada por determinado processo

Outro dia fui realizar alguns testes em aplicações rodando no JBoss e verifiquei que nenhuma aplicação estava funcionando. Verifiquei no log do JBoss que o serviço iniciava e ocorria vários erros, informando que não conseguia fazer o deploy das aplicações. Mesmo parando o serviço do JBoss, verifiquei com a ferramenta nmap que a porta 8080 continuava aberta.