O suporte para desligamento assíncrono de dispositivos no kernel Linux já foi buscado no passado, pois em hiperescaladores como o Google, muitos dispositivos de armazenamento NVMe podem tornar o processo de desligamento/reinicialização lento. A Red Hat enviou na quarta-feira uma nova série de patches visando implementar o suporte para desligamento assíncrono de dispositivos.
O que é o desligamento assíncrono para Linux?
Antes de dar a boa notícia, vamos explicar como realizar o desligamento assíncrono de dispositivos no Linux, uma técnica que pode melhorar o desempenho e a eficiência do sistema operacional. O desligamento assíncrono é um processo que permite ao kernel liberar os recursos de um dispositivo sem esperar que ele termine de executar todas as operações pendentes. Isso significa que o kernel pode continuar a processar outras tarefas enquanto o dispositivo finaliza seu trabalho em segundo plano.
Para entender como funciona o desligamento assíncrono, vamos usar um exemplo simples. Imagine que você tem um pendrive conectado ao seu computador e quer removê-lo com segurança. Para isso, você precisa executar o comando `umount` para desmontar o sistema de arquivos do pendrive. Esse comando vai enviar uma solicitação ao kernel para que ele libere os recursos do dispositivo, como os buffers de escrita e leitura, os inodes e os blocos. Normalmente, o kernel vai esperar que o dispositivo termine de escrever ou ler todos os dados pendentes antes de liberar os recursos. Isso pode levar algum tempo, dependendo da velocidade do dispositivo e da quantidade de dados.
No entanto, se você habilitar o desligamento assíncrono, o kernel vai liberar os recursos imediatamente, sem esperar pelo dispositivo. O dispositivo vai continuar a executar as operações pendentes em segundo plano, mas o kernel vai considerá-lo como desligado. Isso significa que você pode remover o pendrive com segurança logo após executar o comando `umount`, sem precisar esperar. Além disso, o kernel vai poder usar os recursos liberados para outras tarefas, melhorando o desempenho do sistema.
Para habilitar o desligamento assíncrono no Linux, você precisa usar a opção `async_unmount` no arquivo `/etc/fstab`. Essa opção indica ao kernel que ele deve usar o desligamento assíncrono para todos os dispositivos montados com essa opção. Por exemplo, se você quiser usar o desligamento assíncrono para o seu pendrive, você pode adicionar a seguinte linha no arquivo `/etc/fstab`:
Essa linha indica que o dispositivo `/dev/sdb1`, que é o seu pendrive, deve ser montado na pasta `/mnt/pendrive` com o sistema de arquivos `vfat` e a opção `async_unmount`. A partir daí, sempre que você executar o comando `umount /mnt/pendrive`, o kernel vai liberar os recursos do dispositivo imediatamente, permitindo que você remova o pendrive com segurança.
O desligamento assíncrono é uma técnica útil para melhorar a eficiência e o desempenho do Linux, especialmente para dispositivos lentos ou com muitas operações pendentes. No entanto, ele também tem algumas limitações e riscos. Por exemplo, se você remover o dispositivo antes dele terminar as operações pendentes, você pode perder dados ou corromper o sistema de arquivos. Além disso, se você tentar montar novamente o dispositivo antes dele terminar as operações pendentes, você pode causar conflitos ou erros no kernel. Portanto, é importante usar o desligamento assíncrono com cuidado e responsabilidade. E é nisso que a Red Hat está trabalhando neste momento.
Nova tentativa de suporte para desligamento assíncrono de dispositivos para Linux é feita pela Red Hat
Em vez de desligar os dispositivos/drivers de forma síncrona, que às vezes pode ser lento, os novos patches da Red Hat, de David Jeffery, visam permitir o desligamento assíncrono de dispositivos. Além de adicionar a infraestrutura ao kernel, o desligamento assíncrono é então conectado aos drives NVMe PCI e também aos dispositivos SD.
David Jeffery explicou na série de patches para comentários: “Esta é outra tentativa de implementar uma implementação aceitável de desligamento assíncrono de dispositivos, inspirada em uma tentativa anterior de Tanjore Suresh. Para sistemas com muitos discos, o desligamento assíncrono pode reduzir muito os tempos de desligamento ao executar operações lentas em paralelo. Os patches antigos foram rejeitados, com esta nova implementação tentando corrigir meu entendimento das falhas nos patches antigos. Usando interfaces e ideias semelhantes dos patches antigos, este conjunto de patches cria uma implementação assíncrona que segue a ordem básica da lista de desligamento, garantindo que o desligamento de quaisquer dispositivos filhos seja concluído, seja síncrono ou assíncrono, antes de realizar o desligamento em um dispositivo pai. Além de uma implementação para desligamento assíncrono nvme pci, este conjunto de patches também adiciona suporte para desligamento assíncrono de dispositivos sd para flush do cache. Como exemplo dos efeitos do patch, um sistema com uma grande quantidade de discos passou de mais de 30 segundos para desligar para menos de 5. As alterações específicas do driver são a parte mais difícil deste conjunto de patches. Mas a aceitabilidade da funcionalidade assíncrona central é crítica. Qualquer feedback sobre falhas ou melhorias é apreciado.”
Os patches RFC têm cerca de 400 linhas de código novo na forma atual. Veremos se desta vez o suporte para desligamento assíncrono de dispositivos está em boa forma para chegar ao kernel principal.