6.4.3. Noop
O agendador Noop E/S implementa algorítimos simples de First-in-first-out (FIFO). A mesclagem de requisições acontece em uma camada de bloco genérica mas é um cache simples de último toque. Se um sistema é limitado à CPU e o armazenamento é rápido, este agendador de E/S pode ser o melhor a utilizar.
Segue abaixo ajustes disponíveis para a camada de bloco.
/sys/block/sdX/queue tunables
- add_random
- Em alguns casos, o cabeçalho de eventos de E/S que contribuem para o pool de entropia para
/dev/random
é mensurável. Em alguns casos, pode ser melhor ajustar este valor para 0. max_sectors_kb
- Por padrão, o tamanho máximo de requisição para disco é de
512
KB. Este ajuste pode ser utilizado tanto para aumentar ou diminuir o valor. O valor mínimo é limitado por tamanho de bloco lógico; o valor máximo é limitado pelomax_hw_sectors_kb
. Existem alguns SSDs que possuem um pior desempenho quando os tamanhos de E/S excedem o tamanho de bloco de remoção interno. Em alguns casos recomendamos ajustar omax_hw_sectors_kb
para baixo para apagar o tamanho do bloco. Você pode testar isto utilizando um gerador de E/S tal como o iozone ou aio-stress, variando o tamanho de histórico, por exemplo, de512
bytes para1
MB. nomerges
- Este ajuste é inicialmente um assistente de depuração. A maioria de cargas de trabalhos de mesclagem de requisição (até mesmo em armazenamento mais rápido tal como SSDs). Em alguns casos, no entanto, deseja-se desabilitar a mesclagem, tal como quando você vê quantos IOPS um backend de armazenamento pode processar sem desabilitar o cabeçalho de leitura ou realizando uma E/S aleatória.
nr_requests
- Cada fila de requisição tem um limiete no número total de descritores de requisição que pode ser alocado para cada uma das E/Ss das leituras e gravações. Por padrão, o número é
128
, o que significa 128 leituras e 128 gravações que podem ser enfileiradas uma por vez antes de colocar um processo em inativo. O processo inativo é o próximo a tentar alocar uma requisição, não necessariamente o processo que tenha alocado todas as requisições disponíveis.Se você possui aplicativo de latência sensível, você deve considerar diminuir o valor donr_requests
em sua fila de requisições e limitar a profundidade da fila de comando no armazenamento para um número mais baixo (até mesmo tão baixo quanto1
), para que a E/S writeback não possa alocar todos os descritores de requisições disponíveis e preencher a fila de dispositivo com uma E/S de gravação. Uma vez que onr_requests
tenha sido alocado, todos os outros processos que estão tentando realizar uma E/S serão transformados em inativos para esperar por requisições a ficarem disponíveis. Isto torna as coisas mais justas, pois as requisições são então distribuídas em uma moda de repetição alternada (ao invés de deixar um processo consumí-los todos em sucessão rápida). Note que este é o único problema ao utilizar a data limite ou agendadores de noop, pois a configuração CFQ padrão protege contra esta situação. optimal_io_size
- Em algumas circunstâncias o armazenamento adjacente irá reportar um tamanho de E/S adequado. Isto é mais comum em hardware e software RAID, onde o tamanho da E/S adequada é o tamanho da faixa. Se este valor é reportado, os aplicativos devem emitir uma E/S alinhada e em múltiplos do tamanho de E/S adequado sempre que possível.
read_ahead_kb
- O sistema operacional pode detectar quando um aplicativo está lendo dados seqüencialmente de um arquivo ou de disco. Nesses casos, ele executa um algoritmo inteligente de leitura antecipado, em que mais dados do que é solicitado pelo usuário é lido a partir do disco. Assim, nas próximas tentativas do usuário de ler um bloco de dados, ele já o fará no cache da página do sistema operacional. A desvantagem é que o sistema operacional pode ler mais dados do disco do que o necessário, o que ocupa espaço no cache de página até que ele seja expulso por causa da alta pressão de memória. Depois de vários processos realizando leituras falsas futuras, aumentaria a pressão de memória nesta circunstância.Para os dispositivos de mapeador, recomenda-se aumentar o valor do
read_ahead_kb
para um número maior, tal como8192
. A razão é que um mapeador de dispositivo é geralmente criado de dispositivos adjacentes múltiplos. Configurar este valor para um padrão (128
KB) multiplicado pelo número de dispositivos que você está mapeando é um bom começo para ajuste. rotational
- Discos rígidos tradicionais são rotacionais (feitos de discos rodopiantes). Os SSDs no entanto, não. A maioria de SSDs promoverão isto adequadamente. Se, no entanto, você encontar um dispositivo que não promova esta bandeira adequadamente, pode ser necessário configurar o rotacional para
0
manualmente; quando o rotacional estiver desabilitado, o elevador de E/S não usará lógica, que significa reduzir buscas, uma vez que existe pouca penalidade para busca de operações em mídia não rotacional. rq_affinity
- Conclusões de E/S podem ser processadas em uma CPU diferente daquela que emitiu a E/S. Configurar o
rq_affinity
para1
faz com que o kernel entregue conclusões para a CPU na qual a E/S foi emitida. Isto pode aprimorar a efetividade do cache de dados de CPU.