6.4. Configuração

Uma das primeiras decisões que você precisará tomar é escolher qual agendador de E/S utilizar. Esta seção provê uma visão geral de cada um dos agendadores principais para ajudá-lo a decidir qual o melhor para sua carga de trabalho.

6.4.1. Completely Fair Queuing (CFQ)

CFQ tenta fornecer alguma justiça nas decisões de agendamento de E/S com base no processo que iniciou a E/S. Três classes de agendamento diferentes são fornecidos: em tempo real (Reat Time - RT), de melhor esforço (Best-Effort -BE), e ocioso. A classe de agendamento pode ser atribuída manualmente a um processo com o comando ionice, ou programaticamente atribuída através da chamada de sistema ioprio_set. Por padrão, os processos são colocados na classe de agendamento de melhor esforço. As classes de agendamento em tempo real e de melhor esforço são subdivididos em oito prioridades de E/S dentro de cada classe, sendo a prioridade 0 a mais alta e 7 a mais baixa. Processos na classe de agendamento em tempo real estão programados muito mais agressivamente do que em processos em melhor esforço ou inativo, portanto, qualquer E/S de tempo real programada é sempre realizada antes da E/S de melhor esforço ou ocioso. Isto significa que a prioridade de E/S em tempo real pode desaparecer com as classes de melhor esforço e ociosas. O agendamento do melhor-esforço é a classe de agendamento padrão e 4 é a prioridade padrão nesta classe. Processos na classe de agendamento de repouso são apenas notados quando não há nenhuma outra E/S pendente no sistema. Assim, é muito importante definir apenas a classe de agendamento de E/S de um processo para ocioso se a E/S do processo não for necessária para fazer quaisquer progressos futuros.
CFQ fornece equidade pela atribuição de um intervalo de tempo para cada um dos processos realizando E/S. Durante seu intervalo de tempo, um processo pode ter (por padrão), até 8 pedidos em vôo de cada vez. O agendador tenta antecipar se um aplicativo emitirá mais E/S em um futuro próximo com base em dados históricos. Caso seja esperado que um processo irá emitir mais E/S, então o CFQ será ocioso, esperando por aquela E/S, mesmo se houver E/S de outros processos à espera de ser emitido.
Por causa da ociosidade realizada pelo CFQ, que muitas vezes não é uma boa opção para hardware que não sofrem de uma grande penalidade de busca, como matrizes de armazenamento externos rápidas ou discos de estado sólido. Se o uso do CFQ em tal armazenamento é uma exigência (por exemplo, se você também deseja usar o agendador cgroup de E/S de peso proporcional), você terá que ajustar algumas configurações para melhorar o desempenho do CFQ. Defina os seguintes parâmetros nos arquivos de mesmo nome localizada no /sys/block/device/queue/iosched/:
slice_idle = 0
quantum = 64
group_idle = 1
Quando o group_idle está configurado para 1, existe ainda o potencial para interrupções de E/S (onde o armazenamento do backend não é cheio devido à ociosidade). No entanto, estas interrupções serão menos frequentes do que a ociosidade em cada fila no sistema.
CFQ é um agendador de E/S de conservação de folga, o que significa que pode ser ocioso, mesmo quando existem solicitações pendentes (como vimos acima). O empilhamento de programadores de conservação de folga pode introduzir grandes latências no caminho de E/S. Um exemplo deste tipo de empilhamento é o uso do CFQ além de um controlador RAID hardware baseado em host. O controlador RAID pode implementar o seu próprio agendador de conservação de folga, causando atrasos em dois níveis na pilha. Conservação de folga funciona melhor quando têm dados suficientes para basear as suas decisões. No caso de empilhamento desses algoritmos de escalonamento, o agendador mais inferior só vai ver o que o agendador superior envia para baixo. Assim, a camada inferior verá um padrão de E/S que não é representativo do volume de trabalho real.

Ajustáveis

back_seek_max
Buscas revertidas são geralmente ruins para o desempenho, pois podem incorrer em maiores atrasos no reposicionamento dos cabeçalhos do que as buscas normais. No entanto, o CFQ ainda vai realizá-las, se elas forem pequenas o suficiente. Este ajuste controla a distância máxima em KB que o agendador de E/S permitirá a procura revertida. O padrão é 16 KB.
back_seek_penalty
Devido à ineficiência da procura revertida, uma penalidade está associada a cada um. A pena é um multiplicador, por exemplo, considere a posição da cabeça do disco de 1024 KB. Suponha que existem dois pedidos na fila, um de 1008KB e outro em 1040KB. Os dois pedidos estão equidistantes da posição da cabeça atual. No entanto, depois de aplicar a pena de procura invertida (padrão: 2), a requisição em uma posição futura em discos estará agora duas vezes mais perto do que as requisições anteriores. Assim, a cabeça moverá para frente.
fifo_expire_async
Este ajuste controla quanto tempo uma requisição assíncrona (gravação de buffer) pode ficar sem serviços. Após o tempo de expiração (em milisegundos), uma requisição assíncrona faltando será movida para a lista de expedição. O padrão é 250 ms.
fifo_expire_sync
Este é o mesmo que o ajuste fifo_expire_async, para requisições em sincronia (leitura e gravação de O_DIRECT). O padrão é 125 ms.
group_idle
Quando definido, o CFQ ficará em ocioso no último processo emitindo a E/S em um cgroup. Isto deve ser definido para 1 ao usar o cgroup de E/S de peso proporcional e configurando o slice_idle to 0 (geralmente feito em armazenamento rápido).
group_isolation
Se a isolação de grupo estiver ativada (definida para 1), ela fornecerá uma isolação mais forte entre grupos a custo de rendimento. Em geral, se a isolação de grupo estiver desativada, a fairness é fornecida para cargas de trabalho sequenciais somente. A ativação da isolação de grupo, proporcionará fairness para ambas cargas de trabalho aleatória e sequencial. O valor padrão é 0) (desabilitado). Consulte o Documentation/cgroups/blkio-controller.txt para mais informações.
low_latency
Quando uma latência baixa é ativada (definida para 1), o CFQ tenta fornecer um máximo de tempo de espera de 300 ms para cada processo emitindo E/S em um dispositivo. Isto favorece o fairness sobre o rendimento. Desabilitar a latência baixa (definindo-a para 0) ignora a latência de alvo, permitindo que cada processo no sistema obtenha uma faixa o tempo integral. Baixa latência é ativada por padrão.
quantum
O quantum controla o número de E/Ss que o CFQ irá enviar ao armazenamento por vez, principalmente limitando a profundidade da fila do dispositivo. Por padrão, isto é definido para 8. O armazenamento pode suportar filas muito mais produndas, mas aumentar o quantum também terá um impacto negativo na latêcia, especialmente na presença de cargas de trabalho de gravação sequencial grandes.
slice_async
Este ajuste controla a parte de tempo alocada para cada processo que emite E/S assíncronas (gravação em buffer). Por padrão ele é ajustado para 40 ms.
slice_idle
Isto especifica quanto tempo o CFQ deve ficar ocioso enquanto espera por novas solicitações. O valor padrão no Red Hat Enterprise Linux 6.1 e anteriores a ele é de 8 ms. No Red Hat Enterprise Linux 6.2 e posteriores a ele, o valor padrão é 0. O valor zero melhora a taxa de transferência de armazenamento RAID externo, removendo todos os ociosos da fila e nível de árvore de serviço. No entanto, um valor de zero pode degradar o rendimento da armazenagem não RAID interna, uma vez que aumenta o número total de procura. Para o armazenamento não-RAID, recomendamos uma slice_idle valor que é maior do que 0.
slice_sync
Este ajuste dita a faixa de tempo alocada para um processo emitindo E/S assíncronas (leitura ou gravação diretas). O padrão é 100 ms.