Recentemente encontrei o driver de dispositivo Linux Null Block , null_blk
enquanto fazia benchmarking da pilha de E/S em vez de em um dispositivo de bloco específico. Achei os dispositivos criados sob este driver (vamos usar o nome do dispositivo /dev/nullb0
como exemplo) bastante intrigantes, especialmente considerando sua semelhança de nome com o /dev/null
dispositivo. Como não encontrei nenhuma dúvida existente sobre esse assunto, resolvi entrar em contato para obter esclarecimentos.
Minha pergunta principal é: quais são as diferenças entre /dev/null
o dispositivo de bloco criado no null_blk
driver do dispositivo?
Até este ponto: já notei algumas distinções.
- Primeiro, (até onde entendi), o dispositivo nulo
/dev/null
não passa por nenhum driver. No entanto, os dispositivos criadosnull_blk
são verdadeiros drivers de bloco pelos quais os dados devem passar. Também confirmei isso executandofio
em ambos os dispositivos;/dev/null
tem um desempenho muito melhor em termos de IOPS de leitura aleatória e latência de envio. - Segundo, sabemos que a leitura from
/dev/null
resulta em um EOF (por exemplo,cat /dev/null
), mas quando tentocat /dev/nullb0
, ele não retorna um EOF e, em vez disso, trava. - Além disso, como observação lateral, a documentação do kernel
null_blk
menciona parâmetros para configuração, mas não vejo nenhuma opção semelhante para/dev/null
ser configurada.
Parece que existe um grande número de diferenças sob nomes semelhantes. Alguém pode fornecer mais informações formais ou esclarecimentos sobre essas diferenças? Obrigado!
/dev/null
é controlado por um driver de dispositivo, mas é muito simples .A principal diferença entre
/dev/null
enull_blk
é que o primeiro é um dispositivo de caractere, o segundo é um dispositivo de bloco. O primeiro lida com sequências de caracteres com implementações diretas das operações invocadas pelos programas que o utilizam, sem muita indireção entre uma chamada de sistema usando o dispositivo e o código que implementa a operação correspondente no driver. Este último é muito mais complexo e opera em setores completos, com suporte para filas de comando, etc. Há muito mais coisas acontecendo para lidar com qualquer solicitação única.É claro que há também uma grande diferença de propósito:
/dev/null
destina-se ao uso direto real, enquantonull_blk
é um recurso de suporte para desenvolvedores de kernel que desejam avaliar outras partes da pilha de manipulação de dispositivos de bloco./dev/null
é um "dispositivo de caractere", no qual todas as leituras retornam vazias e todas as gravações são concluídas totalmente, sem efeitos colaterais adicionais. Estas são as semânticas desde a V5 UNIX em 1974, e são exigidas pelo POSIX – não há nada para parametrizar sobre isso.Os dispositivos criados pelo
null_blk
driver são "dispositivos de bloco", o que significa que possuem tamanho fixo e implicação de cache. Os dispositivos fornecidos pornull_blk
ignoram todas as gravações e retornam todos os zeros, tornando-os mais parecidos com/dev/zero
.As finalidades
/dev/null
e os dispositivos fornecidos pornull_blk
são diferentes:/dev/null
é extremamente bem otimizado para retornar 0 (para leituras) ou o tamanho da gravação (para gravações), já que é tudo o que faz. Por outro lado, de acordo com a documentação ,null_blk
Isso significa que ele exerce o código de gerenciamento de solicitação de E/S relevante como se a solicitação fosse real e só então marca a solicitação como concluída sem realmente fazer nenhuma leitura/gravação. Isso significa mais trabalho por solicitação do que
/dev/null
isso e explica seusfio
resultados.