Este tópico descreve a causa e as soluções para o problema em que um disco Non-Volatile Memory Express (NVMe) em uma instância Elastic Compute Service (ECS) Linux fica indisponível devido a um parâmetro io_timeout inválido.
Descrição do problema
Quando uma instância ECS Linux utiliza um disco NVMe como disco do sistema, as operações de leitura e gravação de I/O tornam-se lentas. Consequentemente, o sistema operacional ou as aplicações hospedadas na instância não conseguem ler nem gravar no disco NVMe. O status dos sistemas de arquivos no disco NVMe muda de leitura e gravação para somente leitura. As operações de gravação subsequentes falham, impedindo que o sistema operacional e as aplicações forneçam serviços conforme o esperado.
Leitura e gravação lenta de I/O refere-se a um cenário em que as operações de leitura e gravação em discos ocorrem a uma taxa inferior à esperada ou demoram muito para serem concluídas.
Causa
O parâmetro io_timeout do driver NVMe especifica o período máximo de timeout de I/O. Se a latência de uma operação de I/O exceder o valor desse parâmetro, o driver NVMe interromperá a operação e retornará um erro. Como resultado, o status dos sistemas de arquivos no disco NVMe pode mudar de leitura e gravação para somente leitura. Caso o disco NVMe mude para somente leitura, as operações de gravação subsequentes falharão. Isso impede que o sistema operacional da instância ou as aplicações hospedadas nela forneçam serviços conforme o esperado.
Na maioria das distribuições Linux, o parâmetro
io_timeouttem valor padrão de 30 segundos. Para evitar erros de timeout nas operações de I/O do disco NVMe, defina o parâmetroio_timeoutcom o valor máximo suportado. Em versões recentes do kernel, o valor máximo suportado é 4294967295 segundos. Em versões anteriores, o limite é 255 segundos.O módulo do kernel do driver NVMe varia conforme a versão do kernel. Os módulos utilizados são:
nvme.koenvme_core.ko. O nome completo do parâmetro io_timeout pode sernvme.io_timeoutounvme_core.io_timeout.
Soluções
Configure temporariamente o parâmetro io_timeout
Siga as etapas abaixo para defina o parâmetro io_timeout. O valor especifique é temporário. Redefina o parâmetro io_timeout sempre que reiniciar a instância ECS Linux.
-
Conecte-se à instância ECS Linux.
Para mais informações, consulte Visão geral dos métodos de conexão.
-
Verifique o caminho do módulo do kernel que contém o parâmetro
io_timeout.-
Execute o comando a seguir para verificar se o caminho
/sys/module/nvme_core/parameters/io_timeoutexiste. Se existir, o nome completo do parâmetro seránvme_core.io_timeout.cat /sys/module/nvme_core/parameters/io_timeout -
Caso o caminho não exista, execute o comando a seguir para verificar se o caminho
/sys/module/nvme/parameters/io_timeoutexiste. Se existir, o nome completo do parâmetro seránvme.io_timeout.cat /sys/module/nvme/parameters/io_timeout
-
-
Execute um dos comandos a seguir para gravar 4294967295 no caminho obtido na etapa anterior.
Módulo do kernel nvme.ko
sudo sh -c 'echo 4294967295 > /sys/module/nvme/parameters/io_timeout'Módulo do kernel nvme_core.ko
sudo sh -c 'echo 4294967295 > /sys/module/nvme_core/parameters/io_timeout'Se o comando for executado com êxito e sem erros, o parâmetro
io_timeoutestará definido como 4294967295.Caso seja retornada uma mensagem de erro semelhante a
Numerical result out of range, repita esta etapa definindo o parâmetroio_timeoutcomo 255.
Configure permanentemente o parâmetro io_timeout
Altere o valor do parâmetro io_timeout no arquivo de configuração do GRand Unified Bootloader (GRUB) ou utilize o plug-in ecs_nvme_config do Cloud Assistant para configure as definições relacionadas ao NVMe no sistema operacional da instância. Para mais informações, consulte Como instale o driver NVMe para uma imagem personalizada? O valor especifique para o parâmetro io_timeout é permanente e não é afetado por fatores como a inicialização da instância.