Estou tentando solucionar um problema com E / S em meus discos. A configuração é a seguinte:
- SO: CentOS 5.6
- Layout do disco:
- Discos (
/dev/sda
, /dev/sdb
)
- Partição (
/dev/sda1
, /dev/sdb1
)
Matriz - MD (RAID-1) (
/dev/md0
)
- Pilha LVM (
/dev/VolGrp00/RootLV
)
Inicialmente, percebi que, ao executar uma E / S pesada (por exemplo, mkfs
), o sistema ficava lento, a tal ponto que eu não conseguia mover o ponteiro do mouse na minha sessão X. Eu comecei a registrar algumas métricas e vi que a média de carga iria subir lentamente, até acima de 5,0 no meu servidor dual-core. Ao mesmo tempo, a minha imagem de memória vai de quase 2 GB gratuitos para cerca de 10 MB livres e quase 2 GB de buffer. Com base nisso, suspeito que algum tipo de cache é o culpado, mas não estou familiarizado o suficiente com as porcas e parafusos do LVM, MD e o subsistema de E / S do Linux para saber onde começar a procurar.
Uma esquisitice que encontrei: não parece importar se eu remover a camada LVM e escrever diretamente na matriz, e mesmo remover a matriz não ajuda muito (embora escrever diretamente na partição pareça causar menos tempo rajadas de atrasos do que escrever para o array).
A maioria dos meus testes foi feita com o comando mkfs.ext4 -i 4096 -m 0 <device>
, embora eu tenha testado esse comportamento com dd if=/dev/urandom bs=4K of=<device>
e recebi resultados semelhantes, então tenho certeza que não é culpa do mkfs. Além disso, eu tentei isso em outro sistema (de outro fornecedor de hardware, mas ainda CentOS 5.6) e novamente ver resultados semelhantes.
Estou bem com qualquer solução que faça com que minhas operações de E / S demorem mais para serem concluídas, embora respostas como "usar o sinalizador de E / S direta" sejam inaceitáveis, pois fazem com que o mkfs passe de 10 minutos para 16 horas (Estive lá, tentei isso). Estou procurando por parâmetros de ajuste e também estou pensando em mudar os agendadores de E / S, mas achei que seria útil pedir orientação à comunidade na direção certa.
EDITAR:
Como se constata, o problema está mais relacionado à pressão da memória e ao gerenciador de memória virtual, que faz com que as solicitações de E / S sejam bloqueadas. Aqui está meu entendimento atual do problema: Como mkfs
ou dd
são executados, eles geram mais E / S do que os discos podem acompanhar, então o buffer começa a ser preenchido. À medida que o vm.dirty_ratio
é atingido, as solicitações de E / S de todos os processos começam a ser bloqueadas até que o cache libere algum espaço ( source ). Ao mesmo tempo, condições de pouca memória acionam o kernel para iniciar a troca de processos da memória física para o disco ... isso gera ainda mais E / S e as solicitações de E / S podem ser bloqueadas enquanto aguardam o cache ser limpo. p>
Eu tentei ajustar vm.dirty_ratio
e outros parâmetros relacionados, mas eles só mudam quando o sistema começa a desacelerar (menor relação = maior travamento). Eu também tentei trocar agendadores de I / O e ajustar seus parâmetros para tentar limpar o cache mais rápido, mas não tive sucesso. Como último recurso, tentei executar o mkfs
com ionice -c3
, mas como os discos estão quase inativos no momento em que estou executando o mkfs
, o mesmo problema se manifesta. Eu acho que a desaceleração poderia ser evitada se houvesse uma maneira de limitar a taxa de requisição de E / S de um processo específico, mas não tenho conhecimento de nada que possa fazer isso.
Eu definitivamente ainda estou aberto a sugestões sobre o que tentar - quem quer que me empurre na direção certa recebe a marca de seleção verde.
OUTRA EDIÇÃO:
Eu tropecei em grupos de controle , mas infelizmente só estão disponíveis a partir do RHEL6. Cgroups poderiam ser empregados para iniciar o mkfs em um grupo com estrangulamento de E / S, mas como esses sistemas devem permanecer 5.6 por enquanto eu terei que continuar procurando outra solução ou lidar com os problemas de lentidão até o momento do upgrade. / p>